浏览代码

【内嵌支付】工具、页面编辑埋点补充

tangchao 6 月之前
父节点
当前提交
1a4f3243d8

+ 157 - 0
PDF Office/PDF Master/Class/Analytics/KMAnalytics+KMExtensions.swift

@@ -0,0 +1,157 @@
+//
+//  KMAnalytics+KMExtensions.swift
+//  PDF Reader Pro
+//
+//  Created by User-Tangchao on 2024/9/6.
+//
+
+import Foundation
+
+// 数据埋点 Category 参数
+extension KMAnalytics.Parameter.Category {
+    public static let purchase_Tools        = "Purchase_Tools"
+    public static let purchase_PageEdit     = "Purchase_PageEdit"
+    public static let purchase_Editor       = "Purchase_Editor"
+    public static let purchase_Converter    = "Purchase_Converter"
+    
+    public static let purchase_Form         = "Purchase_Form"
+    public static let purchase_Sign         = "Purchase_Sign"
+    public static let purchase_EditPDF      = "Purchase_EditPDF"
+    public static let purchase_Redact       = "Purchase_Redact"
+    
+    public static let purchase_OCR          = "Purchase_OCR"
+    public static let purchase_PageDisplay  = "Purchase_PageDisplay"
+    public static let purchase_Others       = "Purchase_Others"
+}
+
+// 数据埋点 Label 参数
+//extension KMAnalytics.Parameter.Label {
+//    public static let tbr_Btn           = "Tbr_Btn"
+//}
+
+@objc extension NSViewController {
+    private static var _eventNameKey = "KMEventNameKey"
+    var kEventName: String? {
+        get {
+            return objc_getAssociatedObject(self, &Self._eventNameKey) as? String
+        }
+        set {
+            objc_setAssociatedObject(self, &Self._eventNameKey, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)
+        }
+    }
+    
+    private static var _eventParamsKey = "KMEventParamsKey"
+    var kEventParams: [String : Any]? {
+        get {
+            return objc_getAssociatedObject(self, &Self._eventParamsKey) as? [String : Any]
+        }
+        set {
+            objc_setAssociatedObject(self, &Self._eventParamsKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+        }
+    }
+    
+    @objc func trackEvent_buyNow_tool(type: CAnnotationType, index: Int) {
+        KMAnalytics._trackEvent_buyNow_tool(type: type, index: index, appTarget: .all)
+    }
+}
+
+@objc extension NSWindowController {
+    private static var _eventNameKey = "KMEventNameKey"
+    var kEventName: String? {
+        get {
+            return objc_getAssociatedObject(self, &Self._eventNameKey) as? String
+        }
+        set {
+            objc_setAssociatedObject(self, &Self._eventNameKey, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)
+        }
+    }
+    
+    private static var _eventParamsKey = "KMEventParamsKey"
+    var kEventParams: [String : Any]? {
+        get {
+            return objc_getAssociatedObject(self, &Self._eventParamsKey) as? [String : Any]
+        }
+        set {
+            objc_setAssociatedObject(self, &Self._eventParamsKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+        }
+    }
+    
+    func saveEventName(_ eventN: String?) {
+        self.kEventName = eventN
+        self.kEventParams = KMGetBuyNowEventParams(for: eventN)
+    }
+    
+    @objc func trackEvent_buyNow_click(eventName eveN: String, params: [String : Any]?) {
+        KMAnalytics.trackEvent(eventName: eveN, parameters: params, platform: .firebase, appTarget: .dmg)
+    }
+    
+    @objc func trackEvent() {
+        if let e = self.kEventName {
+            KMAnalytics.trackEvent(eventName: e, parameters: self.kEventParams, platform: .firebase, appTarget: .all)
+        }
+    }
+    
+    @objc func trackEvent_dmg() {
+        if let e = self.kEventName {
+            KMAnalytics.trackEvent(eventName: e, parameters: self.kEventParams, platform: .firebase, appTarget: .dmg)
+        }
+    }
+    
+    @objc func trackEvent_appStore() {
+        if let e = self.kEventName {
+            KMAnalytics.trackEvent(eventName: e, parameters: self.kEventParams, platform: .firebase, appTarget: [.free, .pro])
+        }
+    }
+}
+
+// MARK: - KMAnalytics Private Methods
+
+extension KMAnalytics {
+    fileprivate static func _trackEvent_buyNow_tool(type: CAnnotationType, index: Int, platform: KMAnalyticsPlatform = .firebase, appTarget: AppTarget = [.free]) {
+        if let eventName = KMBuyNowEventNameFromCAnnotationType(type, index: index) {
+            let params: [String : Any]? = [KMAnalytics.Parameter.categoryKey : "Purchase_Tools", KMAnalytics.Parameter.labelKey : "SubTbr_Tools"]
+            KMAnalytics.trackEvent(eventName: eventName, parameters: params, platform: platform, appTarget: appTarget)
+        }
+    }
+}
+
+// MARK: - Pulick Methods
+
+public func KMBuyNowEventNameFromCAnnotationType(_ type: CAnnotationType, index: Int) -> String? {
+    if type == .link {
+        if index == 2 {
+            return "Reading_WebsiteLink_BuyNow"
+        } else if index == 3 {
+            return "Reading_EmailLink_BuyNow"
+        }
+    } else if type == .stamp {
+        if index == 2 {
+            return "Reading_DynamicStamp_BuyNow"
+        } else if index == 3 {
+            return "Reading_CustomStamp_BuyNow"
+        }
+    } else if type == .signature {
+        return "Reading_Signature_BuyNow"
+    }
+    return nil
+}
+
+public func KMGetBuyNowEventParams(for eventN: String?) -> [String : Any]? {
+    guard let eveN = eventN else {
+        return nil
+    }
+    if eveN == "Reading_WebsiteLink_BuyNow" || eveN == "Reading_EmailLink_BuyNow" ||
+        eveN == "Reading_DynamicStamp_BuyNow" || eveN == "Reading_CustomStamp_BuyNow" ||
+        eveN == "Reading_Signature_BuyNow" || eveN == "Reading_Table_BuyNow" {
+        return ["Purchase_Tools" : "SubTbr_Tools"]
+    } else if eveN == "Reading_InsertBlankPage_BuyNow" || eveN == "Reading_InsertPDF_BuyNow" ||
+                eveN == "Reading_InsertSacnner_BuyNow" || eveN == "Reading_InsertImage_BuyNow" || eveN == "Reading_InsertClipboard_BuyNow" ||
+                eveN == "Reading_Replace_BuyNow" || eveN == "Reading_Extract_BuyNow" || eveN == "Reading_Split_BuyNow" ||
+                eveN == "Reading_Rotate_BuyNow" || eveN == "Reading_Reverse_BuyNow" || eveN == "Reading_Copy_BuyNow" ||
+                eveN == "Reading_Delete_BuyNow" || eveN == "Reading_Merge_BuyNow" {
+        return ["Purchase_PageEdit" : "SubTbr_PageEdit"]
+    } else if eveN == "Onbrd_EditPage_BuyNow" || eveN == "Onbrd_Merge_BuyNow" {
+        return ["Purchase_PageEdit" : "Home_PageEdit"]
+    }
+    return nil
+}

+ 36 - 12
PDF Office/PDF Master/Class/PDFTools/PageEdit/Controller/KMPDFEditViewController.swift

@@ -522,7 +522,9 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
     
     override func deleteAction() {
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_Delete_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         
@@ -583,7 +585,9 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
     
     override func rightRotateAction() {
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_Rotate_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         
@@ -655,7 +659,9 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
     
     override func extractAction() {
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_Extract_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         
@@ -675,7 +681,9 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
     
     override func replaceAction() {
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_Replace_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         
@@ -711,7 +719,9 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
     
     override func splitAction() {
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_Split_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         
@@ -757,7 +767,9 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
 //            return;
 //        }
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_Split_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         
@@ -836,7 +848,9 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
     
     override func reverseAction() {
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_Reverse_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         
@@ -1125,7 +1139,9 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
     
     @objc func item_insertCustomPage(sender: NSMenuItem?) {
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_InsertBlankPage_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         
@@ -1180,7 +1196,9 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
     
     @objc func item_insertFromImage(sender: NSMenuItem?) {
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_InsertImage_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         
@@ -1233,7 +1251,9 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
     
     @objc func item_insertFromClipboard(sender: NSMenuItem?) {
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_InsertClipboard_BuyNow")
+            winC?.showWindow(nil)
             return
         }
 //        self.choosePositionWindow {[weak self] index in
@@ -1253,7 +1273,9 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
     
     @objc func item_insertFromScanner(sender: NSMenuItem?) {
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_InsertSacnner_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         
@@ -1325,7 +1347,9 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
     
     func extractSelectPageItemAction() {
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_Extract_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         

+ 9 - 3
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Thumbnail/Base/KMPDFThumbViewBaseController.swift

@@ -153,7 +153,9 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
     
     public func insertFileAction() {
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_InsertPDF_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         
@@ -201,7 +203,9 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
     
     public func insertBlankPageAction() {
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_InsertBlankPage_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         
@@ -267,7 +271,9 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
     
     public func copyAction() {
         if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_Copy_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         

+ 8 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/AnnotationProperty/KMAnnotationSelectLinkViewController.swift

@@ -132,6 +132,14 @@ enum KMAnnotationLinkType: UInt {
                 if downEntered {
                     if !IAPProductsManager.default().isAvailableAllFunction() {
                         if mouseBox == self.linkUrlBox || mouseBox == self.linkEmailBox {
+                            if mouseBox == self.linkUrlBox {
+                                let winC = KMPurchaseCompareWindowController.sharedInstance()
+                                winC?.saveEventName("Reading_WebsiteLink_BuyNow")
+                            } else if mouseBox == self.linkEmailBox {
+                                let winC = KMPurchaseCompareWindowController.sharedInstance()
+                                winC?.saveEventName("Reading_EmailLink_BuyNow")
+                            }
+                            
                             KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
                             return
                         }

+ 3 - 1
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/Signature/KMSignatureAnnotationViewController.m

@@ -138,7 +138,9 @@ KMSigntureViewItemDelegate>
 
 - (IBAction)insertSignatureButton_Click:(id)sender {
     if (![[IAPProductsManager defaultManager] isAvailableAllFunction]) {
-        [[KMPurchaseCompareWindowController sharedInstance] showWindow:nil];
+        NSWindowController *winC = [KMPurchaseCompareWindowController sharedInstance];
+        [winC saveEventName:@"Reading_Signature_BuyNow"];
+        [winC showWindow:nil];
         return;
     }
     [self showSignatureWindow];

+ 8 - 4
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/StampList/KMAnnotationStampViewController.swift

@@ -287,8 +287,10 @@ let KMPDFDynamicStampNeedAuthorKey1 = "km_pdfview_dynamic_stamp_need_author"
         self.dynamicBoxNew?.downCallback = { [weak self] downEntered, mouseBox, event in
 //        dynamicBox.downCallback = { [weak self] downEntered, mouseBox, event in
             guard let blockSelf = self else { return }
-            if !IAPProductsManager.default().isAvailableAllFunction() {
-                KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            if downEntered && !IAPProductsManager.default().isAvailableAllFunction() {
+                let winC = KMPurchaseCompareWindowController.sharedInstance()
+                winC?.saveEventName("Reading_DynamicStamp_BuyNow")
+                winC?.showWindow(nil)
                 return
             }
             if downEntered && (blockSelf.stampType != .dynamic) {
@@ -307,8 +309,10 @@ let KMPDFDynamicStampNeedAuthorKey1 = "km_pdfview_dynamic_stamp_need_author"
         self.customBoxNew?.downCallback = { [weak self] downEntered, mouseBox, event in
 //        customBox.downCallback = { [weak self] downEntered, mouseBox, event in
             guard let blockSelf = self else { return }
-            if !IAPProductsManager.default().isAvailableAllFunction() {
-                KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            if downEntered && !IAPProductsManager.default().isAvailableAllFunction() {
+                let winC = KMPurchaseCompareWindowController.sharedInstance()
+                winC?.saveEventName("Reading_CustomStamp_BuyNow")
+                winC?.showWindow(nil)
                 return
             }
             if downEntered && (blockSelf.stampType != .custom) {

+ 3 - 1
PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift

@@ -3253,7 +3253,9 @@ extension KMMainViewController {
         FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_Tools", withProperties: ["SubTbr_Btn": "Btn_SubTbr_Tools_Table"])
         changeAnnotationMode(sender)
         guard IAPProductsManager.default().isAvailableAllFunction() else {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.saveEventName("Reading_Table_BuyNow")
+            winC?.showWindow(nil)
             return
         }
         listView.addAnnotationWithTable()

+ 3 - 0
PDF Office/PDF Master/Class/Purchase/DMG/KMPurchaseCompareDMGWindowController.m

@@ -647,6 +647,9 @@ static NSString *const KMPurchaseCompareDMGCellIdentifier       = @"KMPurchaseCo
 //#endif
 #if VERSION_DMG
     [self close];
+    
+    [self trackEvent_dmg];
+    
     NSString *productID = @"";
     if ([self.buySwitch state]) {
         productID = @"com.brother.pdfreaderpro.mac.product_3";

+ 8 - 0
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -25,6 +25,9 @@
 		65341C7C2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65341C7B2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift */; };
 		65341C7D2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65341C7B2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift */; };
 		65341C7E2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65341C7B2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift */; };
+		654A5A8C2C8AE200001FBD4B /* KMAnalytics+KMExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 654A5A8B2C8AE200001FBD4B /* KMAnalytics+KMExtensions.swift */; };
+		654A5A8D2C8AE200001FBD4B /* KMAnalytics+KMExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 654A5A8B2C8AE200001FBD4B /* KMAnalytics+KMExtensions.swift */; };
+		654A5A8E2C8AE200001FBD4B /* KMAnalytics+KMExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 654A5A8B2C8AE200001FBD4B /* KMAnalytics+KMExtensions.swift */; };
 		65D684062C6A250C003A532E /* KMWavyLineAnnotationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D684052C6A250C003A532E /* KMWavyLineAnnotationController.swift */; };
 		65D684072C6A250C003A532E /* KMWavyLineAnnotationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D684052C6A250C003A532E /* KMWavyLineAnnotationController.swift */; };
 		65D684082C6A250C003A532E /* KMWavyLineAnnotationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D684052C6A250C003A532E /* KMWavyLineAnnotationController.swift */; };
@@ -5537,6 +5540,7 @@
 		65341C722C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSearchReplaceWindowController.swift; sourceTree = "<group>"; };
 		65341C732C63CCFE00FE30F9 /* KMSearchReplaceWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMSearchReplaceWindowController.xib; sourceTree = "<group>"; };
 		65341C7B2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSearchReplaceHanddler.swift; sourceTree = "<group>"; };
+		654A5A8B2C8AE200001FBD4B /* KMAnalytics+KMExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KMAnalytics+KMExtensions.swift"; sourceTree = "<group>"; };
 		65D684052C6A250C003A532E /* KMWavyLineAnnotationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWavyLineAnnotationController.swift; sourceTree = "<group>"; };
 		65D6840B2C6A3669003A532E /* KMEraserAnnotationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMEraserAnnotationController.swift; sourceTree = "<group>"; };
 		65D88ED12C85826A00DD06E0 /* KMRSAUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMRSAUtils.swift; sourceTree = "<group>"; };
@@ -12171,6 +12175,7 @@
 			isa = PBXGroup;
 			children = (
 				BB32BF222A5EA05900D11348 /* KMAnalytics.swift */,
+				654A5A8B2C8AE200001FBD4B /* KMAnalytics+KMExtensions.swift */,
 			);
 			path = Analytics;
 			sourceTree = "<group>";
@@ -16387,6 +16392,7 @@
 				BBC3484A2958222C008D2CD1 /* KMBackgroundOutsideView.swift in Sources */,
 				BB7BC4D82AD3D6B700D6BEE6 /* PDFListView+KMExtensions.swift in Sources */,
 				ADBC2CFA299CA6B9006280C8 /* KMPrintDuplexPrintingSetView.swift in Sources */,
+				654A5A8C2C8AE200001FBD4B /* KMAnalytics+KMExtensions.swift in Sources */,
 				AD3AAD382B0B7B1900DE5FE7 /* KMCompareToolbar.swift in Sources */,
 				BBA19F4329ADE6A3001A285A /* KMBookMarkRowView.swift in Sources */,
 				ADFA8F092B579945002595A4 /* KMSearchFindView.swift in Sources */,
@@ -18315,6 +18321,7 @@
 				BB1D41D42B26D9BD00994EDC /* KMReusable.swift in Sources */,
 				9F0CB51E2986569B00007028 /* KMDesignToken+BorderRadiusBottomRight.swift in Sources */,
 				9FDD0F7D2952F2D8000C4DAD /* KMBaseParser.swift in Sources */,
+				654A5A8D2C8AE200001FBD4B /* KMAnalytics+KMExtensions.swift in Sources */,
 				ADD1B6C82942E83000C3FFF7 /* KMPrintBottomView.swift in Sources */,
 				BB14702D299DC0D100784A6A /* OIDEndSessionRequest.m in Sources */,
 				9F0CB4A8296CF19600007028 /* KMPropertiesPanelListMenuSubVC.swift in Sources */,
@@ -20009,6 +20016,7 @@
 				BB853C712AF879C1009C20C1 /* KMBatchRemoveWatermarkOperation.swift in Sources */,
 				ADDF83A02B391A5D00A81A4E /* CDSignatureDrawViewController.swift in Sources */,
 				BB986AED2AD53AE800ADF172 /* KMInfoWindowController.swift in Sources */,
+				654A5A8E2C8AE200001FBD4B /* KMAnalytics+KMExtensions.swift in Sources */,
 				BB0A55122A302DB700B6E84B /* KMTextField.swift in Sources */,
 				9F0CB5032986560D00007028 /* KMDesignToken+BorderTop.swift in Sources */,
 				9F88108F2B56614600F69815 /* KMAnnotationChoiceWidgetAppearanceViewController.swift in Sources */,