作者:Joe,原文鏈接懦傍,原文日期:2016/04/12
譯者:Cwift峭竣;校對:walkingway沽一;定稿:CMB
移動應(yīng)用分析是指捕獲并分析用戶在使用應(yīng)用時產(chǎn)生的用戶行為。當(dāng)然,完整的應(yīng)用分析包括了操作系統(tǒng)、桌面應(yīng)用、web應(yīng)用等等葡兑,移動應(yīng)用分析只是其中的一個分支。直到今年早些時候赞草,Parse 還是一個流行的云平臺讹堤,用于捕獲和顯示移動應(yīng)用程序的使用數(shù)據(jù)。
從 Prase 的突然離開給我們上了一課厨疙。首先洲守,對于從事軟件開發(fā)超過一年的人來說,不應(yīng)該感到奇怪沾凄,沒有什么是永恒的梗醇。所以,事情發(fā)生了改變撒蟀。第二個教訓(xùn)可能是叙谨,你曾經(jīng)經(jīng)歷過因為平臺不斷改動引發(fā)的憤怒(或者疼痛),那么為什么不抽象出一些底層的操作保屯,并且讓這些操作在將來更容易被更改呢手负?我們已經(jīng)從前人的經(jīng)驗中學(xué)習(xí),準(zhǔn)備應(yīng)用到移動分析上姑尺,讓應(yīng)用更加的“面向未來”竟终。
協(xié)議
關(guān)于何為協(xié)議,蘋果的官方文檔給出了一個簡潔定義:為適配某些特定任務(wù)或功能切蟋,規(guī)劃出的由方法统捶、屬性和其他要求組成的藍(lán)圖。下面是一些所有記錄器都應(yīng)該提供的基礎(chǔ)方法:
- 記錄后臺的打印信息
- 記錄事件
- 用數(shù)據(jù)字典記錄事件
當(dāng)然柄粹,在不同的分析平臺上你可以發(fā)現(xiàn)各式各樣的特性喘鸟,不過我們希望至少有以上三類關(guān)鍵數(shù)據(jù)。一個完美的協(xié)議定義如下:
import Foundation
protocol AnalyticsEventLogger {
func initialize()
func logEvent(name:String)
func logEvent(name:String, data:AnyObject)
}
就協(xié)議 AnalyticsEventLogger 本身而言不做任何事情镰惦,它只是一個藍(lán)圖迷守。我們需要一個具體的分析框架來完成工作犬绒。
Amplitude
當(dāng)我們思考如何從 Parse 上遷移 Bondi 時旺入,Amplitude是我們遇到的第一個移動分析服務(wù)。它通過『一個記錄事件的簡單 API』實現(xiàn)了直截了當(dāng)(并且免費(fèi))的注冊流程。AnalyticsEventLogger 協(xié)議的實現(xiàn)起來也非常簡單:
class AmplitudeEventLogger : AnalyticsEventLogger {
func initialize() {
Amplitude.instance().initializeApiKey(AmplitudeApplicationKey)
}
func logEvent(name:String) {
Amplitude.instance().logEvent(name)
}
func logEvent(name:String, data:AnyObject) {
Amplitude.instance().logEvent(name, withEventProperties: data as! [NSObject : AnyObject])
}
}
CleverTap
CleverTap 是另一個移動分析平臺茵瘾,提供快捷的注冊和記錄服務(wù)礼华。不過說實話在應(yīng)用中集成 CleverTap SDK 的步驟有些繁瑣。我們很快就意識到了問題所在拗秘,但為了完整起見圣絮,依舊列出這個基于 CleverTap 實現(xiàn)的事件日志工具樣式:
import Foundation
class CleverTapEventLogger : AnalyticsEventLogger {
func initialize() {
CleverTap.changeCredentials(withAccountID: accountID, andToken: accountToken)
}
func logEvent(name:String) {
CleverTap.sharedInstance().recordEvent(name)
}
func logEvent(name:String, data:AnyObject) {
CleverTap.sharedInstance().recordEvent(name, withProps: data as! [NSObject:AnyObject])
}
}
需要注意的關(guān)鍵點是,協(xié)議 掌控著方法:
- initialize()
- logEvent(name:String)
- logEvent(name:String, data:AnyObject)
基于 Amplitude 的事件日志工具在底層實現(xiàn)中使用了 Amplitude SDK 中的方法雕旨“缃常基于 CleverTap 的協(xié)議實現(xiàn)將使用 CleverTap SDK 提供的方法。
注意:許多移動分析平臺提供了更豐富的方法凡涩。比如棒搜,其中一些平臺提供了用戶在屏幕上觸摸的熱圖分析。我們的目標(biāo)不是構(gòu)建一個能涵蓋所有移動分析功能的協(xié)議活箕,而是著力于篩選出那些最有用的功能力麸。
示例應(yīng)用
我們已經(jīng)快速搭建了一個示例應(yīng)用,允許你使用 Amplitude 或者 CleverTap 來實現(xiàn)事件日志工具的功能育韩。下面的部分將通過演示引導(dǎo)你在程序的適當(dāng)?shù)胤讲迦?API 密鑰克蚂。不過,為了讓程序跑起來筋讨,你需要在網(wǎng)上注冊這些服務(wù)埃叭。
事件記錄器本身是 AppDelegate 中的 eventLogger 實例。
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var eventLogger:AnalyticsEventLogger = AmplitudeEventLogger()
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
eventLogger.initialize()
eventLogger.logEvent(AnalyticsStartEvent)
return true
}
// Additional routines
}
上面的代碼中聲明了一個名為 eventLogger 的類實例版仔,該實例的上下文是協(xié)議 AnalyticsEventLogger游盲。實際的實例將會是一個 AmplitudeEventLogger,這個類被聲明在 AmplitudeEventLogger.swift 文件中蛮粮。如果你想要使用 CleverTap益缎,只需要簡單地替換聲明部分即可。
var eventLogger:AnalyticsEventLogger = CleverTapEventLogger()
實際上然想,你甚至不需要聲明變量的類型(AnalyticsEventLogger)莺奔。Swift 的編譯器能夠推斷出來。
獲取代碼
在終端上輸入 git clone git@bitbucket.org:iachievedit/mobileanalytics.git
可以從 BitBucket 上得到示例應(yīng)用的源代碼变泄。在 Xcode 中打開 appname.xcodeproj令哟。
appname Project
項目的基礎(chǔ)
示例項目中需要回顧的關(guān)鍵性文件如下:
- AnalyticsEventLogger.swift – 這個文件中包含了我們的 AnalyticsEventLogger 協(xié)議,所有的事件日志工具都需要遵守這個協(xié)議妨蛹。
- AmplitudeEventLogger.swift – 使用 Amplitude 服務(wù)實現(xiàn)的 AnalyticsEventLogger 協(xié)議
- CleverTapEventLogger.swift – 使用 CleverTap 服務(wù)實現(xiàn)的 AnalyticsEventLogger 協(xié)議
- ViewController.swift – 在示例應(yīng)用中屏富,當(dāng)我們按下屏幕上的那些按鈕時,會打印對應(yīng)的事件的分析蛙卤。這些點擊事件對應(yīng)的 IBAction 被定義在控制器當(dāng)中
- ApiKeys.swift - 這個文件中包含了一個實例狠半,用來從一個 .plist 文件中提取 API 密鑰噩死。具體的實現(xiàn)細(xì)節(jié)將在將會在接下來的章節(jié) API 密鑰 中詳細(xì)講解。
API 密鑰
大多數(shù)情況下神年,不代表全部已维,分析平臺會讓你使用一個單獨的應(yīng)用密鑰或者使用用戶賬號標(biāo)識符和應(yīng)用密鑰的組合。這方面 Amplitude 和 CleverTap 沒有什么不同已日。示例應(yīng)用使用了屬性列表來管理 API 密鑰垛耳。如果你還沒有注冊任何一個服務(wù),請?zhí)綄iT講解 Amplitude 或者 CleverTap 注冊流程的章節(jié)為你的應(yīng)用進(jìn)行注冊飘千。
注意上面的 ApiKeys.plist 文件是紅色的堂鲜。這意味著這個文件不存在,所以你需要創(chuàng)建一個這樣的文件护奈,然后向其中添加你所選擇的移動分析服務(wù)商密鑰泡嘴。為了能在 Amplitude 和 CleverTap 之間切換,你還需要同時保存二者的賬戶和 API 密鑰逆济∽糜瑁可以通過下面的說明來了解,或者使用最初的模板工程嘗試一下其他的服務(wù)奖慌,比如 Flurry 或者 AppAnalytics抛虫。
使用 Xcode 的 File – New – File 來創(chuàng)建一個 ApiKeys.plist 文件,然后選中 iOS Resource简僧,選擇 Property List 模板建椰。點擊 Next 并且把文件命名為 ApiKeys.plist,確定對話框中勾選了將其添加到應(yīng)用的 Target 中的選項岛马。
為你想要在工程中引用的每一個 API 創(chuàng)建密鑰棉姐,比如 AmplitudeDevelopmentApplicationKey。如果你一直在使用這個示例工程并且使用了 Amplitude 和 CleverTap啦逆,你的 ApiKeys.plist 看上去應(yīng)該是下面這樣:
ApiKeys.plist
一旦 API 密鑰就位伞矩,更新 AppDelegate 文件,選擇你需要的日志工具夏志,然后在真機(jī)或者模擬器上運(yùn)行程序乃坤。
Logging Events
點擊 Like,DisLike 等沟蔑,按鈕會調(diào)用移動分析的日志方法(見 ViewController.swift 文件)湿诊。在 Donate(捐贈) 按鈕的情境中,日志方法將包含捐贈的數(shù)量瘦材。
Amplitude 入門
注意:這是一個有關(guān)如何注冊 Amplitude 的簡單介紹厅须,并不涵蓋所有的功能。
首先食棕,你需要在 Amplitude 的注冊頁上注冊朗和。填寫所有需要的信息(姓名颁湖、電子郵件等),然后你會看到 歡迎來到 Amplitude 的對話框例隆。
點擊 Let's Go 按鈕,創(chuàng)建你的第一個應(yīng)用抢蚀。我們在組織一欄填寫 iAchieved.it LLC 镀层,應(yīng)用名一欄填寫 Appname Development*。開發(fā)版本和應(yīng)用版本的應(yīng)用會有不同的密鑰皿曲。
點擊 Continue并且選擇 iOS SDK唱逢,然后點擊 I’m Ready to Install。Amplitude 將會展示一個 Amplitude SDK 的安裝頁面屋休,該頁面提供了諸如如何下載 iOS SDK 坞古、向工程中導(dǎo)入 SQLite 時應(yīng)如何更新 build settings 的一系列說明,然后還展示了一個調(diào)用服務(wù)的 Objective C 示例劫樟。我們熱衷于在應(yīng)用中使用 Swift 語言痪枫,所以在這一步時點擊 Download the source code 鏈接下載 Amplitude 源碼。解壓下載得到的文件夾叠艳。
示例應(yīng)用已經(jīng)包含了 Amplitude SDK奶陈,但是如果你在使用一個新建的項目,把 Amplitude 子文件夾拖拽到工程目錄中附较。確定你勾選了 Copy items if needed 和 Create groups吃粒,當(dāng)然還要確定 application target 也是選中的。
AddingAmplitude
回到 Amplitude 的門戶頁拒课,你可以點擊 Install Amplitude SDK 頁面的 Continue 按鈕徐勃,然后點擊 Done,當(dāng)提示邀請成員加入你的團(tuán)隊時早像,選擇 Skip僻肖。
添加附加框架
向你的 Xcode 工程中添加以下框架:
- libsqlite.tbd
可以通過下面的步驟輕松地增加框架:進(jìn)入工程的 target 目錄下,選擇 Build Phases卢鹦,來到 Link Binary With Libraries 功能區(qū)檐涝,然后點擊 + 按鈕選擇框架。
添加橋接頭文件
在 iAchieved.it法挨,自 Swift 誕生之日起我們就在使用這門語言谁榜,并且從未放棄。如果你也正在使用 Swift 構(gòu)建你的工程凡纳,為了訪問 Amplitude 的 API 你需要在工程中添加一個橋接頭文件窃植。橋接頭文件很容易添加。首先荐糜,使用 File – New – File巷怜,選擇 iOS Source葛超,然后找到 Header file 圖標(biāo)。把文件命名為 bridgingHeader.h延塑。
接下來绣张,在應(yīng)用的 target 中點擊 Build Settings,在搜索框中輸入 bridging关带,你將看到下面的頁面:
雙擊 Objective-C Bridging Header 一欄侥涵,在對話框中輸入 $(SRCROOT)/bridgingHeader.h。$(SRCROOT) 會被映射到你程序的根目錄宋雏。
現(xiàn)在芜飘,在 bridgingHeader.h 文件中輸入一行代碼:#import "Amplitude.h"
。
API 證書
應(yīng)用需要的 API 證書可以從 Amplitude 輕松獲得磨总。在網(wǎng)站門戶頁嗦明,點擊右上角的 account e-mail,然后在下拉菜單中選擇 Account Settings蚪燕。
![](http://upload-images.jianshu.io/upload_images/37776-c0d00e4d100ed58a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Amplitude API Keys
在我們的示例應(yīng)用中娶牌,我們使用 .plist 方法保存 API 的密鑰,所以拿到對應(yīng)的密鑰并加入到 ApiKeys.plist 文件中馆纳∪瓜罚或者你可以打開 AmplitudeEventLogger.swift 文件,把 API 密鑰直接增加到 Amplitude.instance.initializeApiKey 方法中厕诡。
CleverTap 入門
注意:這是一個有關(guān)如何注冊 CleverTap 的簡單介紹累榜,并不涵蓋所有的功能。
我們發(fā)現(xiàn) CleverTap 使用起來不像 Amplitude 那樣直觀灵嫌。然而壹罚,它不需要信用卡就可以上手,這樣你可以在考慮購買之前先試用一段時間寿羞。
按照標(biāo)題找到 CleverTap 的注冊頁面猖凛,填寫所需的信息。你將收到一封激活的郵件绪穆,其中會包含一個完成注冊的鏈接辨泳。產(chǎn)看電子郵件并點擊 Complete your signup 按鈕。
點擊 Add my first app 按鈕你會看到下面的頁面:
Add Your App
請注意玖院, CleverTap 自動為你的應(yīng)用創(chuàng)建了一個 TEST 環(huán)境菠红。坦白說,我不太喜歡這個特性难菌,因為它在猜測你的環(huán)境命名试溯。使用 Amplitude 的時候,可以自己管理應(yīng)用的開發(fā)郊酒、升級以及發(fā)布版本遇绞,而 CleverTap 則簡單地假設(shè)你有一個 TEST 的應(yīng)用版本键袱。
點擊 Add My App。你需要在屏幕上選擇你所要進(jìn)行開發(fā)的平臺(Android版摹闽,iOS版蹄咖,Windows等),并且提交你的應(yīng)用在應(yīng)用商店中的 URL付鹿。選擇 iOS澜汤,然后點擊 Skip URL。
這里遇到的 CleverTap 的整合命令并不像想象中的那么簡單倘屹。建議跳過整合的步驟,然后按照下面的操作步驟整合:
獲取 CleverTap 的 iOS SDK
CleverTap iOS SDK 的下載鏈接可以從 iOS SDK 的集成頁面中找到慢叨。選擇下載 Xcode 7 或者 Xcode 6 的版本纽匙,在你下載得到的文件夾中你將看到一個 CleverTapSDK-v2.0.10-20160405.framework.zip 文件。解壓該文件拍谐,將得到一個單獨的 framework 文件 CleverTapSDK.framework烛缔。拖拽 CleverTapSDK.framework 到你的工程中,確保選中了Copy items if necessary 和 Create groups 選項轩拨。當(dāng)然你也會把它添加到你應(yīng)用的 target 中践瓷。
添加附加的框架
添加如下所示的框架到你的 Xcode 工程中:
- SystemConfiguration
- CoreTelephony
- Security
- UIKit
- CoreLocation
添加一個橋接頭文件(如果你在使用Swift的話)
和 Amplitude一樣,如果你在使用 Swift 語言亡蓉,你需要添加一個橋接頭文件晕翠。詳情請參考添加頭文件的快速指南。在 bridgingHeader.h 文件中增加一行:#import <CleverTapSDK/CleverTap.h>
砍濒。
API 證書
CleverTap 盡力讓自己的 API 密鑰足夠簡單淋肾。可以調(diào)用一個名為 autoIntegrate 的方法爸邢,該方法會通過 CleverTap 的后臺“注冊一切”樊卓。autoIntegrate 方法沒有參數(shù),它與下面的步驟緊密關(guān)聯(lián):
CleverTap Autointegrate
它明確提示要向“你的 .plist 文件”中增加兩個密鑰 CleverTapAccountID 和 CleverTapToken杠河。一個針對 Info.plist 文件的假設(shè)是碌尔,如果你在管理一個測試版的應(yīng)用和一個常規(guī)版本的應(yīng)用,根據(jù)條件切換 .plist 文件是令人煩惱的券敌。所以唾戚,相比于使用 autoIntegrate 方法,你應(yīng)該使用 changeCredentials(withAccountID:andToken)
方法待诅。這個方法會跳過原本的自動集成以及使用 .plist 文件管理 API 密鑰的方式颈走。因此你可以使用下面的方法:
let accountID = valueForAPIKey(named:"CleverTapDevelopmentAccountID")
let accountToken = valueForAPIKey(named:"CleverTapDevelopmentAccountToken")
CleverTap.changeCredentials(withAccountID: accountID, andToken: accountToken)
注意: valueForAPIKey 示例來自于我們使用屬性列表管理 API 密鑰的方式,不過使用 valueForAPIKey 的方式你可以決定密鑰的名字咱士。
結(jié)束前的思考
軟件開發(fā)者是一群有趣的生物立由。當(dāng)可以使用一門新的語言或者框架時轧钓,我們經(jīng)常重寫一些東西,但是當(dāng)這種改變是強(qiáng)制性的時候卻不一定會關(guān)心這些變化锐膜。對于所開發(fā)的“系統(tǒng)”毕箍,期望它可擴(kuò)展并且能夠適應(yīng)未來的需求。我們開發(fā)的與服務(wù)端無關(guān)的事件日志系統(tǒng)遵循了這種方法的精神道盏,但是即使如此仍須明白而柑,未來的移動分析平臺會提供新的特性與功能,如果要使用這些功能荷逞,你必須適配這些功能媒咳。換言之,這里使用的方法絕不是故事的結(jié)尾种远,每當(dāng)有新的服務(wù)需要評估的時候涩澡,我們必須時刻準(zhǔn)備著對不再適應(yīng)需求的代碼區(qū)域進(jìn)行返工。即使如此坠敷,當(dāng)你因為這樣或那樣的原因(特別喜歡的 API 被棄用了妙同,代碼對你來說不夠 Swifty,要么就像 Parse 那樣走到了生命盡頭)而體會到了修改 API 的痛苦時膝迎,你可能會考慮使用一個基于協(xié)議的方法粥帚,在當(dāng)前所使用的服務(wù)和其他服務(wù)之間充當(dāng)一個填充的中間層。
本文由 SwiftGG 翻譯組翻譯限次,已經(jīng)獲得作者翻譯授權(quán)芒涡,最新文章請訪問 http://swift.gg。