From 500502c206a1a4f06309a80b87f359933079b92c Mon Sep 17 00:00:00 2001 From: zhangmin <410260571@qq.com> Date: Wed, 11 Feb 2026 17:00:58 +0800 Subject: [PATCH] feat: update --- YXTrackingSDK/YXTracking.swift | 112 ++++++--- .../UserInterfaceState.xcuserstate | Bin 141978 -> 145047 bytes .../YXTrackingSDK/YXTrackingSDK.swift | 2 +- YXTrackingSDK/YXTrackingSQLiteManager.swift | 228 ++++-------------- 4 files changed, 122 insertions(+), 220 deletions(-) diff --git a/YXTrackingSDK/YXTracking.swift b/YXTrackingSDK/YXTracking.swift index e8ebb17..06b3cb1 100644 --- a/YXTrackingSDK/YXTracking.swift +++ b/YXTrackingSDK/YXTracking.swift @@ -6,12 +6,14 @@ // import UIKit +import Network /// 远轩埋点SDK实现类 四种上报机制 /// 1、初始化时触发:用户在初始化SDK时,会将缓存的事件数据上报。 /// 2、定时/定量触发:数据条数达到阈值(默认20条)或定时器到期(默认600秒)时会将缓存的事件数据上报。 /// 3、事件触发:用户在添加事件时可选择立即上报。 /// 4、应用进入后台和即将被系统终止时触发:用户在应用内停留一段时间后,手动切换到其他应用或桌面时,或即将被系统终止时,会将缓存的事件数据上报。 +/// 5、网络状态变化时触发:当应用网络状态发生变化时,会将缓存的事件数据上报。 public class YXTracking: NSObject { static let shared = YXTracking() @@ -28,6 +30,8 @@ public class YXTracking: NSObject { private var systemAllDimInfoResponseResult: SystemAllDimInfoResponseResult = SystemAllDimInfoResponseResult() // 系统所有维度信息 + private var isPushingEventList: Bool = false // 是否正在推送事件列表 + /// 初始化SDK /// - Parameters: /// - host: 主机地址 @@ -63,6 +67,9 @@ public class YXTracking: NSObject { // 打印日志信息 YXTracking.shared.log(message: "SDK config success!"); + // 添加网络状态变化通知监听 网络状态发生变化时触发缓存事件推送 + YXTracking.shared.addNetworkReachabilityObserver() + // 添加应用进入后台和即将被系统终止的通知监听 应用进入后台时或即将被系统终止时触发缓存事件推送 YXTracking.shared.addEnterBackgroundNotificationObserver() YXTracking.shared.addWillTerminateNotificationObserver() @@ -87,7 +94,22 @@ public class YXTracking: NSObject { /// - customTags: 自定义标签数组(可选) /// - pushNow: 是否立即推送 /// - Returns: 无返回值 - public class func addEvent(eventType: String, page: String, buttonId: String, url: String, customTags: Array?, pushNow: Bool) { + public class func addEvent(eventType: String, page: String, buttonId: String, url: String, customTags: Dictionary?, pushNow: Bool) { + // 重置事件请求参数中的事件类型 + YXTracking.shared.eventRequestResult.eventType = eventType + + // 重置事件请求参数中的事件参数 + let eventParams = EventParams(page: page, buttonId: buttonId, url: url) + YXTracking.shared.eventRequestResult.eventParams = eventParams + + // 重置事件请求参数中的自定义标签 + YXTracking.shared.eventRequestResult.customTags = customTags + + // 重置事件请求参数中的时间戳 + YXTracking.shared.getTimestamp() + + YXTracking.shared.log(message: "SDK add event:\n\(YXTracking.shared.eventRequestResult)"); + // 校验事件类型是否在系统维度信息中存在 if let systemEventTypes = YXTracking.shared.systemAllDimInfoResponseResult.systemEventTypes, systemEventTypes.count > 0 { @@ -102,22 +124,10 @@ public class YXTracking: NSObject { } } else { YXTracking.shared.error(message: "SDK push event error, systemEventTypes is empty!"); + YXTrackingSQLiteManager.addTrackingData(data: YXTracking.shared.eventRequestResult) return } - // 重置事件请求参数中的事件类型 - YXTracking.shared.eventRequestResult.eventType = eventType - - // 重置事件请求参数中的事件参数 - let eventParams = EventParams(page: page, buttonId: buttonId, url: url) - YXTracking.shared.eventRequestResult.eventParams = eventParams - - // 重置事件请求参数中的自定义标签 - YXTracking.shared.eventRequestResult.customTags = customTags - - // 重置事件请求参数中的时间戳 - YXTracking.shared.getTimestamp() - // 打印日志信息 YXTracking.shared.log(message: "SDK add event success\nEvent Request Parameter:\n\(YXTracking.shared.eventRequestResult)"); @@ -141,7 +151,7 @@ public class YXTracking: NSObject { YXTracking.shared.log(message: "SDK config user info success\nUser info:\n\(userInfo)"); } - /// 清空用户信息 + /// 清除用户信息 public class func clearUserInfo() { YXTracking.shared.eventRequestResult.userInfo = nil @@ -185,7 +195,7 @@ public class YXTracking: NSObject { YXTracking.shared.eventRequestResult.timestamp = isoStringWithMilliseconds } - /// 判断数据库数量是否达到缓存上限,如已达到,则推送缓存事件 + /// 判断本地数量是否达到缓存上限,如已达到,则推送缓存事件 func checkEventCount() { let count = YXTrackingSQLiteManager.getTrackingDataCount() if count >= cacheCount { @@ -196,10 +206,12 @@ public class YXTracking: NSObject { /// 开启定时推送本地缓存的事件日志列表 func startThreadPool() { let queue = DispatchQueue(label: "com.yx.tracking", qos: .userInitiated) - queue.async { [self] in + queue.async { [weak self] in + guard let self = self else { return } while true { + YXTracking.shared.log(message: "SDK push event list on thread pool!") YXTracking.pushEventList() - sleep(UInt32(pushInterval)) + Thread.sleep(forTimeInterval: TimeInterval(pushInterval)) } } } @@ -272,6 +284,8 @@ public class YXTracking: NSObject { // 将event对象转换为JSON数据 let jsonEncoder = JSONEncoder() do { + YXTracking.shared.log(message: "SDK push event:\n\(event)"); + let jsonData = try jsonEncoder.encode(event) request.httpBody = jsonData } catch { @@ -306,44 +320,56 @@ public class YXTracking: NSObject { /// 推送多条日志 public class func pushEventList() { + /// 判断是否正在进行pushEventList 防止重复推送 + if YXTracking.shared.isPushingEventList { + return + } + YXTracking.shared.isPushingEventList = true + + /// 获取本地缓存的事件日志列表数量 let count = YXTrackingSQLiteManager.getTrackingDataCount() guard count > 0 else { return } + /// 组装请求URL let urlString = "\(YXTracking.shared.host)/api/ExternalEventlogs/AddEventListLog" - guard let url = URL(string: urlString) else { - return - } + guard let url = URL(string: urlString) else { return } - // 创建URL请求 + /// 创建URL请求 var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") - // 读取数据库数据 + /// 读取本地数据 let eventList = YXTrackingSQLiteManager.readTrackingData() - var event: [EventRequestResult] = [] + var events: [EventRequestResult] = [] for item in eventList { - event.append(item) + events.append(item) } + + /// 判断是否为空列表,不为空则继续推送 + guard !events.isEmpty else { return } - // 将event list对象转换为JSON数据 + /// 将event list对象转换为JSON数据 let jsonEncoder = JSONEncoder() do { - let jsonData = try jsonEncoder.encode(event) + let jsonData = try jsonEncoder.encode(events) request.httpBody = jsonData } catch { YXTracking.shared.error(message: "SDK push event list error encoding\n\(error)"); + YXTracking.shared.isPushingEventList = false return } - // 发送请求 + /// 发送请求 let task = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { YXTracking.shared.error(message: "SDK push event list error sending\n\(error)"); + YXTracking.shared.isPushingEventList = false return } guard let data = data else { + YXTracking.shared.isPushingEventList = false return } @@ -351,27 +377,47 @@ public class YXTracking: NSObject { if let dictionary = json as? [String: Any] { if let code = dictionary["code"] as? Int, code == 200 { YXTrackingSQLiteManager.deleteTrackingData() - YXTracking.shared.success(message: "SDK push event list success Response:\n\(String(data: data, encoding: .utf8) ?? "")"); + YXTracking.shared.success(message: "SDK push event list success Response:\n\(String(data: data, encoding: .utf8) ?? "")") } else { - YXTracking.shared.error(message: "SDK push event fail Response:\n\(String(data: data, encoding: .utf8) ?? "")"); + YXTracking.shared.error(message: "SDK push event list fail Response:\n\(String(data: data, encoding: .utf8) ?? "")") } } + YXTracking.shared.isPushingEventList = false } task.resume() } - // 监听应用切换到后台 + /// 监听网络变化 + func addNetworkReachabilityObserver() { + let monitor = NWPathMonitor() + let queue = DispatchQueue(label: "NetworkMonitor") + + monitor.pathUpdateHandler = { path in + let systemEventTypes = YXTracking.shared.systemAllDimInfoResponseResult.systemEventTypes ?? [] + guard systemEventTypes.isEmpty else { return } + if path.status == .satisfied { + YXTracking.shared.log(message: "SDK network connected!"); + YXTracking.shared.getSystemAllDimInfo() + } else { + YXTracking.shared.log(message: "SDK network not connected!"); + } + } + + monitor.start(queue: queue) + } + + /// 监听应用切换到后台 func addEnterBackgroundNotificationObserver() { NotificationCenter.default.addObserver(self, selector: #selector(onPushEventList), name: UIApplication.didEnterBackgroundNotification, object: nil) } - // 监听系统即将终止应用程序 + /// 监听系统即将终止应用程序 func addWillTerminateNotificationObserver() { NotificationCenter.default.addObserver(self, selector: #selector(onPushEventList), name: UIApplication.willTerminateNotification, object: nil) } - // 监听回调:推送事件列表 + /// 监听回调:推送事件列表 @objc func onPushEventList() { YXTracking.pushEventList() } diff --git a/YXTrackingSDK/YXTrackingSDK.xcodeproj/project.xcworkspace/xcuserdata/a1234.xcuserdatad/UserInterfaceState.xcuserstate b/YXTrackingSDK/YXTrackingSDK.xcodeproj/project.xcworkspace/xcuserdata/a1234.xcuserdatad/UserInterfaceState.xcuserstate index b90b5ed0f530d617bb29b965d2ee1b017675c839..0afd61e0adf8f86f52db160e405d75efc1353bfc 100644 GIT binary patch literal 145047 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

K(hrZ(U6{oK_eZ}c3&Thonze)i; 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�nmNr3ZMmO1=@iQpc{Z5Dh~z@1qe6-I2t$(I1xAn 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�q9^q8L~81zpC?+g zn3b&NZiq6bz;hWZVFnrBW-4Z%F$TS6G_Q_renV{ox`(F<|Ho# z=u9u<^5i!5@o9)M%Q&;yXU>M2GJ7s_H`cNR^Ui!PL{Ft873zA*Y@f0lPbJ~3r*@*p zENai9$1I-7;+ZU-$ub9h`X|drS$^UQcH!wlyw019zQkY`&!@fT2yl3}wgkvGfniez6`ZVgw+KRUL+mTi6S@(p&5m-aJ*OGwJQ$)}52Mdq>9L2o z>|ri@m}?OU=pon7T;pblo`0EFk=^s1=s|DRu$gU`=?ijs!AxJMPYYVJnoVrwHV;Dd z;zQJ?5lxZDi|%|;Zhn^>y(kmEO^#kF!&_8GZZCQ6CAq!y6Ibxu%SAE!m&>8gmq##~ z-F(L9ATqnsFqtjh$S> zP8X72Vf$71IiAORh22-U3EnO2-NN22Y;J|sSa>5paRt2ZZENX)zFN_-cK9^)JITr35Tqwiv`Q;{lk z#XO2RqnMnEnPagv*p*^(D)wWDircl~{)QCy-6)<9`&zs>EijwnotZ%l3$bs-WnJ7E z#cy#xL?t5ZPl=+~pAzO%;$7TdVj6lbv4DLX<|sG$n}0)8vNYyYQeGv;Fco)}+{@>D zfoDrS#3Q`OE4)Ti+M(7`lbD6QD7BMMImjQlr__TGy?eE{qH>wZftt#xznuEZslS{W%Bi888p`XlygJI4X9h7W6+ze+l);?64d(PI@oR?%Y>yHUk%RIwXX^jYP8h~A1QguQr6 zPj9_PKR&=cZ>?t|KXHZYA@ZBqsOn4Pp#d$?L)FntVLI-r>aMEpsw&&6vaRaQYR}=l zYWb;&_p8aE+F-n2Z5->^in&!g!!KM6QFY(*>d)Z*>T0bn|LXFuE}QCo8Gu<;U&adD zUHv#G`71;<^jbsiHR{p~b=Qa`o|U+x#&7%?qMCUrOfj5Y^FxNSpCcR#QLTqbOM2>{ zk6O;H<;+^ntmVvF&aCCkTF$JUgWTk!1s&;(nbuCgO#NOn@;lAQ?=+)2o~`4%UdP|2 zI$h~Qe|#tE$hVGN@f*a*Zx18CJ&fLd6PdhSjUkL-Jm&EBQDpIsoqI=)?_}aF-liU- zn9MZnpWm28eq$EB|yHQUj^<+{{ zCiP;8M<(^oaS6TFf0|spi0A6JrxP(OV+HE2|1D=j)Iin^ywe~n&Th~K?=2)ZbvJZoLuWR0W+Q(W8CGB&DGSr7$xb?Fh+6`{WU)qq89lnit}37 zix%!{F@yg;Gm93^Yw7)#<*CFdWYN+-v^<0FU`xB)>Uo^isv!DrH5i$;(tj(NwsL1{ z-_h2d^IM##_4^E95PR|Ws`VEkYV!oolAZ3TyUjqH)5bY%oYOWN&S;wl@B58S)OIXK z_=;~r)b2Ta-cC*J)X{Dn6FG(6+MN$kd-=4NPka5fx3}%hzx`+qA?xW~ZH%MP#L zj1JTJ2)T5)#a|)nSRLP$jt#LR9T%|#`E~pq&vkl@QoMoeI@zO63owUH7x3)6&Ux24 z?>gt*4eVr3h&rbwGf&f=_poQ3x9~ChL)69hu#4|Nmy9%~4W8}dd(tHd=XLpme|Zq1 zuJ)#DP3mCgUFTxQy4tO-_PXok5Op)FZu0A9rrmmC4&8>Jrfvs09HRHq@FZDiLR&hp zj5WCXy(|35oe*_@lPXkW60>l3cXRD7i|%IgeqIVwjA4w&v+w`FMV!~8IAy7TGkPo} zj;q|_uMqVthkJVJv!~2^%Dkt{d*0x`&+mq)m-lUMA|_9y{RoGEx6s9Ng(%9qnDGaFNJI}GY(|zJ+zI$<~ryS<}+BIgI}WvA2OB+e8Z3Y9HJrlQP+?XOhgYuoHfMzL)0|HeIJ&mI<*+j z4D7;(_UOY4xNqp|*!7`m8afm69jf-BzjBj5LNv_h!|cc~GafdTx%e&&Q}Zxq40Gpj z`#8KbWtfIt8t$y&=lSn*8H{k(2xpCO*9g7){Yo@K?<0P}9*y`dL?hKaQq3dPJkl8> zm#{oU{v+{dR4UTamacSXFQ4;8h(>4UW%4ozJ2F~!qvbYQZlmSq_a@O8b&N5GF_VzT z82yZK_n3dU7oxG{s76gDGaI#xJ&nB|tKM;TW1O?bnZdZ;3}z_1IKZJ0jem$Vq(fih z^)+5!9J0Y4>4D*?!mPsF?j!6^P!$A&*X!4_EAQLsHPa{S!5w%R-&k>G=Xi6HM zBnxVt(wv#G-vkL;&j;&*O^Xqs%M)uSP6@ZFlWEkx73JKej}y*u5z z)4e<0yVLE}^sCsb8C7`)wa!?JyJu_<(aiM7W~NMMcBK#fu`4sbM(!Wk+mA{kmyc!; z!$Pj`CwD?LOHH#{Vee)wMy|6~V`paBnOSybw)$tQf3|05yJz-rWHx&wqjC0Z^Pc?? zvssE-XD6|N&FFXb4(!kDLmWZIvrq69r?A7bFL05|sBiY)+(jL8Qj?Z+nB$!6=y8tO z&nbys=je5g9hg&zw@~{WdpYNAI`A%C=tg&XqNh2soAUv7eUAN^V;*zt+MJ!73(;Kr zKKEs6(u1k!aqeMGqW-ydckUT};W{#$`zQLCE6ch6@*qU>A|6H$^D<+O^RkkY7jVx! zJ29^Y>YdjYbIK(DvuCWgx z*I2p6s?BeJBEJEOV&xhu*I2p6W=F2Ea*dU1tXyN|8mrz|xyH&hR<5ztsDWH#eIH`g z7`q1F$=E+awD1|;MAi!jF_$=&A-9FpFI4|R^)LJqJuLi*U%1FM zZt~wfw?ee&Y1F%@0_s{+lRDJJycelqQA^s;4p}Zz>!KfUp5Gfqi)FGnHRiO~_h@ku zoVnPUi{GL;&RzTt^)a)>jp;-;`Z9pgOu!wB?apGmvv@Z1h#`?J96?r#Pw*Ar@Ezat zBR}&imod9Ivx`eXO4J%>esSg(XMS;Nj(Z9@#F=57zX5SClb8Gy#Vq3NTUyQ19Q+u2_#T~|c;*N6?wa1xL+&Ru;R&m$48=@uZ zT#^Ahu|!=Q4s*qRb9SGF>XurKw3vdNPukEXZ_eHgb@ge7wS|l%zbB zc#G=jX=xqwwA8LFwJS^8@h)BIPH+05x21zvh}xGPRGm!r7UM7 zzN5>IBHv}|Tc*Bc>Ra|LXSvKZZt@4W`I~>aAEM=Hc%1a8d%1g;yLb6?X5#MUw?Y*E z5OzJ@T;fxq?)WaKHQqb%qZ!9Urr`Z}wa3rFKE%h8%qHw>{5E78zZ*To+u!&D9O5uv z@HMBgEAihW=Xia@>myzt@%o6@N4!2(1k|`fA1h?P!j7!4BP*Wcd0xVvtgs6!I?)F+ zUhyHr8HL(csC~sW^uA&i3t7c(K1O{j)V0FAS6tyQ?(rZ*3GPpL6!|3B*@SdtCntHy zkKIgold@FcEvjKR5^B=|xhBXpVFYqbkZXe464aI;*95sH$TdN(39-mEL9PjMO^|DX zTocrrAlHQbe2N`T_?#nrg&j%wj3g^GIpn(X zMat8jp7dh?vRye0J@}nrv~n!7nMXWpNMZw<*@b-l1~FQx-j$#6CF)yg<}1~1HBqjKjp@KZhM=azk&IzHld$iJGcfPOxu`8sZHaPC+=%)T z<(jw?xhASJQJsnEOjKv$&mmg%Fu8H(s`s!ztIT87*T~fG9wWbdjQs8~TAhm*C_phv zP>Ry%VYS^@U6XgHPa~SsinhplwVhqPjP>M<{?s$l2>WN2<+S%d8}E5OxCz(jlS17bB#0CICITqoV&)kYyRXme{(lP zYg1!i*6MSubJrF|ziUgP*R^G^J8LUpUTdqP$F+J~tH-q+d6%wqrw6_0OMgB+_PRw*&K3?H9%xaxoTW3z| z%A)>t>Rx9?>$=bl^{rFax>?M@oYt+x{p;MnZUeGhx0UT2;s~eto^zb%BA2;_eAnF% zQBoSzm1KXCUM4REkZ+QFljNHu-z51a$v3GU4QWhM>`{`8lg!xfTce~7$T&&uNor40 zd(r>~;ro&_hN(^HPImJhYF@AA^%=-WW}YP*Inc{` zwXc7Jid4aOXnjr8zFzI?)xN$NE$B#Z)V1Es*Q?8KZlm??U%!Em`4qdq{&S9Tod59^ zKl59Nl2ek3w4_IE$!be}nyjcTITtTd3iTzIp&S*cOjW9**5o?8gPN0@Bje<@*yCh> z50d-w0fQNe{YV~#K9cp3EZ5}u#IhKBo1B1rlYRG+^^$B4lKbz^?ixA8TKP#kq`EKen>pw5jAkmW{MZj|Llb#Any z8{elFed*6!zU1!^Z8FzQGTCIVo6L2Sxo-0BTbrK8y_?*(=?%)_j!iPyhQ# znCtc$)WW^n<*~gZ?%O?tVd!u79Q3q%Imzr{AD?2@yAPwU-N*SJbK8BM3+Q$C70htA v+3&GqdrHxc$;@UE39P~%?6C)XJ_-N#|57~k|NiyaHUIBl|NsAw_8j;>u0#)E diff --git a/YXTrackingSDK/YXTrackingSDK/YXTrackingSDK.swift b/YXTrackingSDK/YXTrackingSDK/YXTrackingSDK.swift index be048e8..a125743 100644 --- a/YXTrackingSDK/YXTrackingSDK/YXTrackingSDK.swift +++ b/YXTrackingSDK/YXTrackingSDK/YXTrackingSDK.swift @@ -38,7 +38,7 @@ public struct EventRequestResult: Codable { var timestamp: String? // 事件发生时间(ISO8601格式) var deviceInfo: DeviceInfo? // 设备信息 var eventParams: EventParams? // 事件参数 - var customTags: Array? // 自定义标签(可选) + var customTags: Dictionary? // 自定义标签(可选) } /// 定义一个结构体来存储系统信息 diff --git a/YXTrackingSDK/YXTrackingSQLiteManager.swift b/YXTrackingSDK/YXTrackingSQLiteManager.swift index 32a3c86..3111902 100644 --- a/YXTrackingSDK/YXTrackingSQLiteManager.swift +++ b/YXTrackingSDK/YXTrackingSQLiteManager.swift @@ -10,210 +10,66 @@ import SQLite3 class YXTrackingSQLiteManager: NSObject { - // 添加跟踪数据到数据库 - class func addTrackingData(data: EventRequestResult) { - // 创建数据库连接 - let dbPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! - let path = URL(fileURLWithPath: dbPath).appendingPathComponent("tracking.sqlite").path - var db: OpaquePointer? = nil - if sqlite3_open(path, &db) != SQLITE_OK { - YXTracking.shared.error(message: "SDK sqlite open failed!"); - return - } + static let shared = YXTrackingSQLiteManager() + + /// 文件路径管理 + private let fileManager = FileManager.default - YXTracking.shared.success(message: "SDK sqlite open success!"); + /// 文档目录路径 + var documentsDirectory: URL { + fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! + } - // 创建表 - let createTableSQL = """ - CREATE TABLE IF NOT EXISTS tracking_data ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - system_code TEXT, - event_type TEXT, - user_info BLOB, - client_type INT, - client_timestamp INT64, - timestamp TEXT, - device_info BLOB, - event_params BLOB, - custom_tags BLOB - ) - """ - if sqlite3_exec(db, createTableSQL, nil, nil, nil) != SQLITE_OK { - YXTracking.shared.error(message: "SDK sqlite create table failed!"); - return - } - - YXTracking.shared.success(message: "SDK sqlite create table success!"); - - // 插入数据 - let encoder = JSONEncoder() - let insertSQL = "INSERT INTO tracking_data (system_code, event_type, user_info, client_type, client_timestamp, timestamp, device_info, event_params, custom_tags) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)" - var statement: OpaquePointer? = nil - if sqlite3_prepare_v2(db, insertSQL, -1, &statement, nil) == SQLITE_OK { - let system_code = data.system_code ?? "" - let event_type = data.eventType ?? "" - let user_info = (data.userInfo != nil) ? try! encoder.encode(data.userInfo) : nil - let client_type = data.clientType ?? 0 - let client_timestamp = data.clientTimestamp ?? 0 - let timestamp = data.timestamp ?? "" - let device_info = try! encoder.encode(data.deviceInfo) - let event_params = try! encoder.encode(data.eventParams) - let custom_tags = try! JSONSerialization.data(withJSONObject: data.customTags ?? [], options: []) - if sqlite3_bind_text(statement, 1, system_code, -1, nil) != SQLITE_OK || sqlite3_bind_text(statement, 2, event_type, -1, nil) != SQLITE_OK || ((data.userInfo != nil) ? (sqlite3_bind_blob(statement, 3, user_info! as CFTypeRef as? UnsafeRawPointer, Int32(user_info!.count), nil) != SQLITE_OK) : (sqlite3_bind_null(statement, 3) != SQLITE_OK)) || sqlite3_bind_int(statement, 4, client_type) != SQLITE_OK || sqlite3_bind_int64(statement, 5, client_timestamp) != SQLITE_OK || sqlite3_bind_text(statement, 6, timestamp, -1, nil) != SQLITE_OK || sqlite3_bind_blob(statement, 7, device_info as CFTypeRef as? UnsafeRawPointer, Int32(device_info.count), nil) != SQLITE_OK || sqlite3_bind_blob(statement, 8, event_params as CFTypeRef as? UnsafeRawPointer, Int32(event_params.count), nil) != SQLITE_OK || sqlite3_bind_blob(statement, 9, custom_tags as CFTypeRef as? UnsafeRawPointer, Int32(custom_tags.count), nil) != SQLITE_OK { - YXTracking.shared.error(message: "SDK sqlite bind parameter failed!"); - return - } else if sqlite3_step(statement) != SQLITE_DONE { - YXTracking.shared.error(message: "SDK sqlite insert data failed!"); - return - } - - YXTracking.shared.success(message: "SDK sqlite bind parameter success!"); - } else { - YXTracking.shared.error(message: "SDK sqlite preparing to insert data failed!"); - return - } - - YXTracking.shared.success(message: "SDK sqlite insert data success!"); - - // 关闭数据库连接 - do { - sqlite3_close(db) - } - + /// 文件路径 + var fileURL: URL { + documentsDirectory.appendingPathComponent("tracking.json") } - // 读取跟踪数据 + /// JSON编码器 + let encoder = JSONEncoder() + + /// JSON解码器 + let decoder = JSONDecoder() + + /// 添加跟踪数据到文件 + class func addTrackingData(data: EventRequestResult) { + var trackingData: [EventRequestResult] = [] + trackingData.append(contentsOf: readTrackingData()) + trackingData.append(data) + + let data = try! YXTrackingSQLiteManager.shared.encoder.encode(trackingData) + try! data.write(to: YXTrackingSQLiteManager.shared.fileURL, options: .atomic) + } + + /// 读取跟踪数据 class func readTrackingData() -> [EventRequestResult] { var trackingData: [EventRequestResult] = [] - // 创建数据库连接 - let dbPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! - let path = URL(fileURLWithPath: dbPath).appendingPathComponent("tracking.sqlite").path - var db: OpaquePointer? = nil - if sqlite3_open(path, &db) != SQLITE_OK { - YXTracking.shared.error(message: "SDK sqlite open failed!"); + /// 判断fileURL是否存在 + guard YXTrackingSQLiteManager.shared.fileManager.fileExists(atPath: YXTrackingSQLiteManager.shared.fileURL.path) else { return trackingData } - // 查询数据 - let decoder = JSONDecoder() - let querySQL = "SELECT system_code, event_type, user_info, client_type, client_timestamp, timestamp, device_info, event_params, custom_tags FROM tracking_data" - var statement: OpaquePointer? = nil - if sqlite3_prepare_v2(db, querySQL, -1, &statement, nil) == SQLITE_OK { - while (sqlite3_step(statement) == SQLITE_ROW) { - // 获取数据并转换为EventRequestResult - let system_code = String(cString: sqlite3_column_text(statement, 1)) - let event_type = String(cString: sqlite3_column_text(statement, 2)) - var user_info = UserInfo(userId: nil, userName: nil, account: nil) - if sqlite3_column_type(statement, 3) != SQLITE_NULL { - if let user_info_blob = sqlite3_column_blob(statement, 3) { - let user_info_blob_length = sqlite3_column_bytes(statement, 3) - let data = Data(bytes: user_info_blob, count: Int(user_info_blob_length)) - user_info = try! decoder.decode(UserInfo.self, from: data) - } - } - let client_type = sqlite3_column_int(statement, 4) - let client_timestamp = sqlite3_column_int64(statement, 5) - let timestamp = String(cString: sqlite3_column_text(statement, 6)) - var device_info = DeviceInfo(os: nil, model: nil, screenResolution: nil) - if sqlite3_column_type(statement, 7) != SQLITE_NULL { - if let device_info_blob = sqlite3_column_blob(statement, 7) { - let device_info_blob_length = sqlite3_column_bytes(statement, 7) - let data = Data(bytes: device_info_blob, count: Int(device_info_blob_length)) - device_info = try! decoder.decode(DeviceInfo.self, from: data) - } - } - var event_params = EventParams(page: nil, buttonId: nil, url: nil) - if sqlite3_column_type(statement, 8) != SQLITE_NULL { - if let event_params_blob = sqlite3_column_blob(statement, 8) { - let event_params_blob_length = sqlite3_column_bytes(statement, 8) - let data = Data(bytes: event_params_blob, count: Int(event_params_blob_length)) - event_params = try! decoder.decode(EventParams.self, from: data) - } - } - var custom_tags = Array() - if sqlite3_column_type(statement, 9) != SQLITE_NULL { - if let custom_tags_blob = sqlite3_column_blob(statement, 9) { - let custom_tags_blob_length = sqlite3_column_bytes(statement, 9) - let data = Data(bytes: custom_tags_blob, count: Int(custom_tags_blob_length)) - custom_tags = try! decoder.decode([String].self, from: data) - } - } - - let event = EventRequestResult(system_code: system_code, - eventType: event_type, - userInfo: user_info, - clientType: client_type, - clientTimestamp: client_timestamp, - timestamp: timestamp, - deviceInfo: device_info, - eventParams: event_params, - customTags: custom_tags) - trackingData.append(event) - } - sqlite3_finalize(statement) - } else { - YXTracking.shared.error(message: "SDK sqlite read data failed!"); - } - - // 关闭数据库连接 - do { - sqlite3_close(db) - } + let data = try! Data(contentsOf: YXTrackingSQLiteManager.shared.fileURL) + let array = try! YXTrackingSQLiteManager.shared.decoder.decode([EventRequestResult].self, from: data) + trackingData.append(contentsOf: array) return trackingData } - // 删除跟踪数据 + /// 删除跟踪数据 class func deleteTrackingData() { - // 创建数据库连接 - let dbPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! - let path = URL(fileURLWithPath: dbPath).appendingPathComponent("tracking.sqlite").path - var db: OpaquePointer? = nil - if sqlite3_open(path, &db) != SQLITE_OK { - YXTracking.shared.error(message: "SDK sqlite open failed!"); + guard YXTrackingSQLiteManager.shared.fileManager.fileExists(atPath: YXTrackingSQLiteManager.shared.fileURL.path) else { + YXTracking.shared.debug(message: "SDK tracking data file not exist!") return } - - // 删除数据 - let deleteSQL = "DELETE FROM tracking_data" - if sqlite3_exec(db, deleteSQL, nil, nil, nil) != SQLITE_OK { - YXTracking.shared.error(message: "SDK sqlite delete data failed!"); - } - - // 关闭数据库连接 - do { - sqlite3_close(db) - } + try! YXTrackingSQLiteManager.shared.fileManager.removeItem(at: YXTrackingSQLiteManager.shared.fileURL) + YXTracking.shared.debug(message: "SDK tracking data file deleted!") } - // 获取数据库缓存条数 + /// 获取数据库缓存条数 class func getTrackingDataCount() -> Int { - // 创建数据库连接 - let dbPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! - let path = URL(fileURLWithPath: dbPath).appendingPathComponent("tracking.sqlite").path - var db: OpaquePointer? = nil - if sqlite3_open(path, &db) != SQLITE_OK { - YXTracking.shared.error(message: "SDK sqlite open failed!"); - return -1 - } - - // 查询数据 - var dataCount = -1 - let querySQL = "SELECT COUNT(*) FROM tracking_data" - var statement: OpaquePointer? = nil - if sqlite3_prepare_v2(db, querySQL, -1, &statement, nil) == SQLITE_OK { - sqlite3_step(statement) - dataCount = Int(sqlite3_column_int64(statement, 0)) - sqlite3_finalize(statement) - } else { - YXTracking.shared.error(message: "SDK sqlite read data failed!"); - } - - // 关闭数据库连接 - do { - sqlite3_close(db) - } - - return dataCount + var trackingData: [EventRequestResult] = [] + trackingData.append(contentsOf: readTrackingData()) + return trackingData.count } }