QSAppleAdHandle.swift 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. //
  2. // QSAppleAdHandle.swift
  3. // QuickSearchLocation
  4. //
  5. // Created by Destiny on 2025/7/17.
  6. //
  7. import Foundation
  8. import AdServices
  9. import AdSupport
  10. class QSAppleAdHandle {
  11. var retryRequestCount = 0
  12. static func initQSC() {
  13. if #available(iOS 14.3, *) {
  14. do {
  15. let appleAttributionToken = try AAAttribution.attributionToken()
  16. // 尝试获取归因信息
  17. QSAppleAdHandle().getQSC(token: appleAttributionToken)
  18. } catch let error {
  19. print("Error fetching attribution token: \(error.localizedDescription)")
  20. }
  21. }
  22. }
  23. // 开始获取归因结果
  24. private func getQSC(token: String) {
  25. guard retryRequestCount < 3 else { return }
  26. let configuration = URLSessionConfiguration.default
  27. let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: nil)
  28. let asaUrl = URL(string: "https://api-adservices.apple.com/api/v1/")!
  29. var request = URLRequest(url: asaUrl)
  30. request.httpMethod = "POST"
  31. request.addValue("application/json", forHTTPHeaderField: "Content-Type")
  32. request.httpBody = token.data(using: .utf8)
  33. let task = session.dataTask(with: request) { data, response, error in
  34. if let error = error {
  35. print("sendASAToken error = \(error)")
  36. // 5秒后重试
  37. DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
  38. self.getQSC(token: token)
  39. }
  40. return
  41. }
  42. guard let data = data, let payloadDic = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else {
  43. print("sendASAToken error payload = nil")
  44. // 5秒后重试
  45. DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
  46. self.getQSC(token: token)
  47. }
  48. return
  49. }
  50. print("sendASAToken payload = \(payloadDic)")
  51. if let attributionObj = payloadDic["attribution"] {
  52. UserDefaults.standard.set(payloadDic, forKey: "QS_ATTRIBUTION_PAYLOAD")
  53. UserDefaults.standard.synchronize()
  54. ///调用奇异果数据上报接口
  55. let wikiManager = QSWikiHandle.shared
  56. wikiManager.addAttributionResultReport { isSuccess in
  57. print("asaReportWithCompletion = ", isSuccess)
  58. if isSuccess {
  59. let isRegister = UserDefaults.standard.bool(forKey: "areHaveRegisterKey")
  60. if !isRegister {
  61. QSWikiHandle.shared.addEventResultAttribution(eventDict: ["event_name": "active", "event_val": 1])
  62. QSWikiHandle.shared.addEventResultAttribution(eventDict: ["event_name": "register", "event_val": 1])
  63. UserDefaults.standard.setValue(true, forKey: "areHaveRegisterKey")
  64. }
  65. }
  66. }
  67. }
  68. }
  69. task.resume()
  70. retryRequestCount += 1
  71. }
  72. }