Stanwood Analytics iOS
Stanwood Analytics 框架是一个包装器,用于减少将分析日志框架添加到 iOS 项目中所需的工作量,并确保实施的一致性。该 pod 包含一个基本安装和一个作为子规范定义的可选附加组件。仍在进行更多框架支持的工作。
- Fabric [基础]
- Crashlytics [基础]
- TestFairy [基础]
- Firebase Analytics [基础]
- Google Analytics
- MixPanel
- BugFender
- Adjust [进行中]
- IVW Tracking [计划中]
目录
- 示例
- 要求
- 安装
- 基本配置
- GDPR 合规性
- Firebase
- Google Analytics
- Mixpanel
- 通知
- BugFender
- 分析跟踪 API 函数
- 更新现有项目中的分析
- 发布说明
- 作者
- 许可证
- 故障排除
示例
在运行项目之前,建议同时注册 Fabric 和 Firebase Analytics。可选地,注册 Google Analytics、Mixpanel、BugFender 和 TestFairy。在 Configuration.swift 文件中设置密钥。
要运行示例项目,请先从 Example 目录中克隆仓库,然后首先运行 pod install
示例应用程序由2个屏幕组成,第一个屏幕包含按钮和文本字段,用于记录用户数据和事件,第二个屏幕用于跟踪自定义事件(谷歌分析)和开关来切换跟踪。默认开启。这是一个全局禁用开关,旨在遵守GDPR的法律要求。由于一些框架即使在禁用跟踪后仍会继续发送信息,因此在关闭开关时会显示警告,以告知用户在应用程序重新启动之前将继续发送数据。一些框架在禁用跟踪和记录时重启应用程序也会发送数据,但这通常仅是一个调用。如果启动时开关处于关闭状态,则打开开关将调用所有跟踪器的start()函数。
开关设置的变化在框架中通过“tracking_opt_out”(退出跟踪)和“tracking_opt_in”(进入跟踪)两个键进行跟踪。更改在关闭或开启开关之前或之后立即跟踪。
需求
-
- Crashlytics & Fabric
按照Crashlytics的安装说明添加运行脚本。不要将pods添加到Podfile中,也不要调用initialize函数——这个框架会处理这个部分。
请注意,运行脚本路径将与Fabric网站上所述的不同。
"${PODS_ROOT}/StanwoodAnalytics/Frameworks/Fabric.framework/run"
-
- 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 时仍然遇到问题,首先尝试删除项目中所有对它的引用并使之运行,然后再添加框架。
由于本地通知用于帮助调试分析跟踪,这采用的是 iOS 10 API,因此一些项目尚未更新,所以存在一个兼容分支。
pod 'StanwoodAnalytics', git: '[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