StanwoodAnalytics 1.2.0

StanwoodAnalytics 1.2.0

Tal ZionPaddy Rocliffe维护。



  • 作者
  • stanwood

Stanwood Analytics iOS

Swift Version iOS 8+ Pod Version Build Status CodeClimate Badge License Docs

Stanwood Analytics 框架是一个包装器,用于减少将分析日志框架添加到 iOS 项目中所需的工作量,并确保实施的一致性。该 pod 包含一个基本安装和一个作为子规范定义的可选附加组件。仍在进行更多框架支持的工作。

  1. Fabric [基础]
  2. Crashlytics [基础]
  3. TestFairy [基础]
  4. Firebase Analytics [基础]
  5. Google Analytics
  6. MixPanel
  7. BugFender
  8. Adjust [进行中]
  9. IVW Tracking [计划中]

目录

示例

在运行项目之前,建议同时注册 Fabric 和 Firebase Analytics。可选地,注册 Google Analytics、Mixpanel、BugFender 和 TestFairy。在 Configuration.swift 文件中设置密钥。

要运行示例项目,请先从 Example 目录中克隆仓库,然后首先运行 pod install

示例应用程序由2个屏幕组成,第一个屏幕包含按钮和文本字段,用于记录用户数据和事件,第二个屏幕用于跟踪自定义事件(谷歌分析)和开关来切换跟踪。默认开启。这是一个全局禁用开关,旨在遵守GDPR的法律要求。由于一些框架即使在禁用跟踪后仍会继续发送信息,因此在关闭开关时会显示警告,以告知用户在应用程序重新启动之前将继续发送数据。一些框架在禁用跟踪和记录时重启应用程序也会发送数据,但这通常仅是一个调用。如果启动时开关处于关闭状态,则打开开关将调用所有跟踪器的start()函数。

开关设置的变化在框架中通过“tracking_opt_out”(退出跟踪)和“tracking_opt_in”(进入跟踪)两个键进行跟踪。更改在关闭或开启开关之前或之后立即跟踪。

需求

    1. Crashlytics & Fabric

按照Crashlytics的安装说明添加运行脚本。不要将pods添加到Podfile中,也不要调用initialize函数——这个框架会处理这个部分。

请注意,运行脚本路径将与Fabric网站上所述的不同。

"${PODS_ROOT}/StanwoodAnalytics/Frameworks/Fabric.framework/run" 
    1. Firebase Analytics

请参阅配置项目的文档。唯一的必要要求是添加GoogleServices.plist文件。不要调用FirebaseApp.configure()。

安装

StanwoodAnalytics可以通过CocoaPods获取。要安装它,请在您的Podfile中添加以下行

pod 'StanwoodAnalytics'

此框架的默认安装中已包含Fabric、Crashlytics、FirebaseAnalytics和TestFairy。已定义了适用于BugFender、Google Analytics和Mixpanel的子规范。

pod 'StanwoodAnalytics/Mixpanel'
pod 'StanwoodAnalytics/BugFender'
pod 'StanwoodAnalytics/Google'

如果项目已经存在现有的分析框架,请参阅更新项目部分。

基本配置

将以下代码添加到AppDelegate中,或一个辅助类中。使用构建辅助类创建追踪器并将其添加到分析构建器中。调用build()函数来创建实例。

let testFairyKey = "abc123def456"

let fabricTracker = FabricTracker.FabricBuilder(context: application, key: nil).build()

let analyticsBuilder = StanwoodAnalytics.builder()
.add(tracker: fabricTracker)

#if DEBUG || STAGE

let testFairyTracker = TestFairyTracker.TestFairyBuilder(context: application, key: testFairyKey).build()
analyticsBuilder = analyticsBuilder.add(tracker: testFairyTracker)

#endif

analytics = analyticsBuilder.build()       

GDPR 符合性

自2018年5月25日起,所有公司都必须遵守欧盟关于追踪个人数据的规定。追踪默认开启,应用程序必须提供开关以关闭它。如果应用程序有注册流程,追踪必须默认关闭,并允许用户开启。

analytics.setTracking(enable: Bool)

框架在UserDefaults中内部存储开关的值。使用静态函数StanwoodAnalytics.trackingEnabled()读取当前状态,并根据实际情况更新开关。不要在启动时调用setTracking,因为这已经在内部完成。

Firebase

基本安装包括了Firebase/Analytics及其依赖项,因此不需要在Podfile中定义它。

Firebase追踪器有一个可选的init参数,可以将配置属性列表的名称传递进去,以便根据运行的配置支持不同的配置(调试、测试、发布等)。

例如,在应用程序配置结构体中添加一个功能

static func firebaseConfigurationFileName() -> String {
        #if DEBUG
            return "FirebaseService-DEBUG-Info"
        #else
            return "FirebaseService-RELEASE-Info"
        #endif
}

然后使用该函数初始化追踪器

   let firebaseTracker = FirebaseTracker.FirebaseBuilder(context: application, configFileName: Configuration.firebaseConfigurationFileName())
   ...
   .add(tracker: firebaseTracker)

警告:如果应用程序之前有Firebase的配置,请记住删除对FirebaseApp.configure()的调用,因为它只能调用一次,否则应用程序会崩溃。

Google Analytics

   pod 'StanwoodAnalytics/Google'
   let googleTracker = GoogleAnalyticsTracker.GoogleAnalyticsBuilder(context: application, key: googleTrackingKey).build()
   ... 
   .add(tracker: googleTracker)

Map Function

追踪器使用默认的映射函数,如果需要可以替换。

public protocol MapFunction {
    func mapCategory(parameters: TrackingParameters) -> String?
    func mapAction(parameters: TrackingParameters) -> String?
    func mapLabel(parameters: TrackingParameters) -> String?
    func mapScreenName(parameters: TrackingParameters) -> String?
    func mapKeys(keys: TrackerKeys) -> [String:String]?
}

public struct GoogleMapFunction: MapFunction {
    public func mapCategory(parameters: TrackingParameters) -> String? {
        return parameters.eventName
    }
    
    public func mapAction(parameters: TrackingParameters) -> String? {
        return parameters.name
    }
    
    public func mapLabel(parameters: TrackingParameters) -> String? {
        return parameters.itemId
    }
    
    public func mapScreenName(parameters: TrackingParameters) -> String? {
        
        if parameters.eventName.lowercased() == TrackingEvent.viewItem.rawValue.lowercased() {
            return parameters.name
        }
        return nil
    }
    
    public func mapKeys(keys: TrackerKeys) -> [String:String]? {
        return nil
    }
}

在GoogleAnalyticsBuilder中可以为自定义映射函数分配自定义映射函数。

如果您需要追踪自定义维度,请先在GA web仪表板中添加值(选择管理,然后在属性(第二列)下选择自定义定义,然后选择自定义维度),然后使用索引号作为键。添加以下跟踪代码

let index = YOUR-VALUE
var trackerKeys = TrackerKeys.init()
trackerKeys.customKeys = [String(describing:index):screenName]
analytics?.track(trackerKeys: trackerKeys)

Mixpanel

  pod 'StanwoodAnalytics/Mixpanel'
let mixpanelTracker = MixpanelTracker.MixpanelBuilder(context: application, key: mixpanelToken).build()
...
.add(tracker: mixpanelTracker)

通知

本框架使用本地通知(iOS 10.0 +)来显示事件,有助于调试和验证分析日志。分析初始化函数有一个必须符合UNUserNotificationCenterDelegate协议的可选参数。

首先将扩展添加到视图控制器中

extension ViewController: UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

        completionHandler([.alert])
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

        let alert = UIAlertController(title: "Tracker Alert", message: "We have tracking for this event", preferredStyle: .alert)
        let action = UIAlertAction(title: "Thanks!", style: .default, handler: nil)
        alert.addAction(action)
        present(alert, animated: true, completion: nil)

        completionHandler()
    }
}

然后将此对象作为参数传递给初始化函数。

let window = application.windows.first
        let viewController = window?.rootViewController
        analytics = analyticsBuilder.setNotificationDelegate(delegate: viewController!).build()

仅使能调试/测试时的通知是有用的。请在发布构建中确保它们不可见。

BugFender

在Podfile中添加

pod 'StanwoodAnalytics/BugFender'

然后在跟踪类中

    let bugFenderKey = "abcdef"
    let bugfenderTracker = BugfenderTracker.BugfenderBuilder(context: application, key: bugFenderKey)
            .setUIEventLogging(enable: true)
            .build()
   ...  
   .add(tracker: bugfenderTracker)

Analytics Tracking API Functions

用于追踪的4个函数是:

   func track(trackingParameters: TrackingParameters)
   func track(trackerKeys: TrackerKeys)
   func trackScreen(name: String, className: String? = nil)
   func track(error: NSError)

其中TrackingParameters和TrackerKeys是结构体。

TrackingParameters

    let eventName: String
    var itemId: String?
    var name: String?
    var description: String?
    var category: String?
    var contentType: String?

TrackerKeys

此结构体包含一个单一的可变字典[String:Any]。它应该用来设置自定义键和值。

更新现有项目中的分析

如果项目已经使用 Fabric 和 Crashlytics,则需要从 Podfile 中删除 pod,并从项目源代码中删除任何导入语句。还要检查代码中对 Crashlytics 的引用 - 在添加 Stanwood Analytics 之前,应该先删除它们。确保应用程序可以编译并且运行几分钟。如果应用程序先前与 Firebase 集成,请删除 FirebaseApp.configure() 的调用,否则将崩溃。只能调用此函数一次。

# Remove all of these pods.
  pod 'Fabric'
  pod 'Crashlytics'
  pod 'Firebase'
  pod 'Firebase/Core'
  pod 'Firebase/Analytics'
  pod 'BugfenderSDK'
  pod 'TestFairy'
  pod 'GoogleAnalytics'
  pod 'Mixpanel'

请参阅如何用新的分析框架替换 Fabric/Crashlytics 调用的示例项目。

重要:如果在编译应用程序时遇到链接器错误,请检查项目的“其他链接器标志”构建设置,并确保删除对 Crashlytics 和 Fabric 的任何引用。

如果您在使用 Fabric 时仍然遇到问题,首先尝试删除项目中所有对它的引用并使之运行,然后再添加框架。

[email protected]:stanwood/Stanwood_Analytics_iOS.git', branch: 'hotfix/iOS9-Compatibility'

发布说明

1.1.2: 更新了 Code Climate 和 Danger 文件。添加了徽章。

1.1.0: 添加了对 Code Climate Quality、Danger 的支持。扩展了框架以支持发布用于 Debugger pod 中的调试事件的通知。这将为调试分析提供巨大帮助。

1.0.1: 更新示例项目和 readme,以反映 0.9 及以上版本的 API 变化。

1.0.0: 发布候选版本。删除了所有框架的密钥。添加了代码,防止 Firebase 和 Fabric 的配置错误导致崩溃。

0.11.0: 添加了对 FirebaseTracker 的内部支持。添加了内部更改,以在应用启动时跟踪关闭状态变为打开状态时启动跟踪框架。

0.10.1 - 0.10.9: 修复了错误。

0.10.0: 添加了对禁用跟踪时的警告支持的警报。

0.9.2: 更新构建版本,推送更改。

0.9.1: 修复了 FirebaseTracker 的编译警告。

0.9.0: 添加了对 GDPR 遵守的启用和禁用跟踪的支持。

0.8.0: Mixpanel 已完全集成到发布中。Google Analytics 的支持已扩展到包括自定义维度。修复了更改为 CocoaPods 1.5.0 后的 GA 问题。TestFairy 为基础安装的一部分。

0.7.1: 增加了Google Analytics自定义维度的支持。在BugFender跟踪器中,将参数设置为可选。已更新

customParameters: [String:Any]

0.7.0: 增加了Google Analytics和Mixpanel的基本支持。

0.6.0: 删除了FirebaseAnalytics和嵌入式框架。

0.5.0: 解决了Firebase的依赖性问题。

0.4.5: 将UserNotifications作为框架依赖项添加。

0.4.4: 更新了示例项目。

0.4.3: 在trackScreen中将screen类参数设置为可选。

0.4.2: 在StanwoodAnalytics类中添加了trackScreen函数。

open func trackScreen(name: String, className: String)

0.4.1: 更新FirebaseTracker以调用Analytics.setScreenName()。

0.4.0: 添加了调试分析跟踪的通知。这至少需要iOS 10。

作者

罗南·奥西奥格 [email protected]

许可证

StanwoodAnalytics遵循MIT许可证。更多信息请参阅LICENSE文件。

故障排除

编译错误

Undefined symbols for architecture x86_64:
  "_kFIRServiceRemoteConfig", referenced from:
      -[FIRRemoteConfig(FIRApp) configureConfig:] in FirebaseRemoteConfig(FIRRemoteConfig+FIRApp_090f076533867dc11958284cd1b529ac.o)
  "_kServiceInfoFileName", referenced from:
      -[FIRRemoteConfig(FIRApp) configureConfig:] in FirebaseRemoteConfig(FIRRemoteConfig+FIRApp_090f076533867dc11958284cd1b529ac.o)
  "_kServiceInfoFileType", referenced from:
      -[FIRRemoteConfig(FIRApp) configureConfig:] in FirebaseRemoteConfig(FIRRemoteConfig+FIRApp_090f076533867dc11958284cd1b529ac.o)

请确保Podfile中包含了pod Firebase/Analytics

链接器错误

ld: framework not found Fabric for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这可能由几个原因造成,但首先尝试从项目中移除所有对分析框架的引用,并将其编译。然后添加pod,然后再加回代码。

Firebase崩溃信号SIGABRT

应用程序在调用FirebaseApp.configure()时崩溃

请确保只有一个调用此函数。如果在添加分析框架之前应用程序中已经使用了Firebase,请先删除引用。

还要检查包标识符是否与GoogleServices info.plist中指定的相符。

框架编译错误

随着CocoaPods 1.5.0的更新,出现了一些其他编译错误。解决方案是删除Xcode首选项。

cd ~/Library/Preferences
ls -l | grep xcode -i
rm com.apple.dt.xcodebuild.plist