與服務器無關的移動端分析

做者:Joe,原文連接,原文日期:2016/04/12
譯者:Cwift;校對:walkingway;定稿:CMBhtml

移動應用分析是指捕獲並分析用戶在使用應用時產生的用戶行爲。固然,完整的應用分析包括了操做系統、桌面應用、web應用等等,移動應用分析只是其中的一個分支。直到今年早些時候,Parse 仍是一個流行的雲平臺,用於捕獲和顯示移動應用程序的使用數據。ios

從 Prase 的忽然離開給咱們上了一課。首先,對於從事軟件開發超過一年的人來講,不該該感到奇怪,沒有什麼是永恆的。因此,事情發生了改變。第二個教訓多是,你曾經經歷過由於平臺不斷改動引起的憤怒(或者疼痛),那麼爲何不抽象出一些底層的操做,而且讓這些操做在未來更容易被更改呢?咱們已經從前人的經驗中學習,準備應用到移動分析上,讓應用更加的「面向將來」。git

協議

關於何爲協議,蘋果的官方文檔給出了一個簡潔定義:爲適配某些特定任務或功能,規劃出的由方法、屬性和其餘要求組成的藍圖。下面是一些全部記錄器都應該提供的基礎方法:github

  • 記錄後臺的打印信息web

  • 記錄事件sql

  • 用數據字典記錄事件swift

固然,在不一樣的分析平臺上你能夠發現各式各樣的特性,不過咱們但願至少有以上三類關鍵數據。一個完美的協議定義以下:api

import Foundation
 
protocol AnalyticsEventLogger {
  
  func initialize()
  func logEvent(name:String)
  func logEvent(name:String, data:AnyObject)
  
}

就協議 AnalyticsEventLogger 自己而言不作任何事情,它只是一個藍圖。咱們須要一個具體的分析框架來完成工做。xcode

Amplitude

當咱們思考如何從 Parse 上遷移 Bondi 時,Amplitude是咱們遇到的第一個移動分析服務。它經過『一個記錄事件的簡單 API』實現了直截了當(而且免費)的註冊流程。AnalyticsEventLogger 協議的實現起來也很是簡單:app

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 是另外一個移動分析平臺,提供快捷的註冊和記錄服務。不過說實話在應用中集成 CleverTap SDK 的步驟有些繁瑣。咱們很快就意識到了問題所在,但爲了完整起見,依舊列出這個基於 CleverTap 實現的事件日誌工具樣式:

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])
  }

}

須要注意的關鍵點是,協議 掌控着方法:

  • initialize()

  • logEvent(name:String)

  • logEvent(name:String, data:AnyObject)

基於 Amplitude 的事件日誌工具在底層實現中使用了 Amplitude SDK 中的方法。基於 CleverTap 的協議實現將使用 CleverTap SDK 提供的方法。

注意:許多移動分析平臺提供了更豐富的方法。好比,其中一些平臺提供了用戶在屏幕上觸摸的熱圖分析。咱們的目標不是構建一個能涵蓋全部移動分析功能的協議,而是着力於篩選出那些最有用的功能。

示例應用

咱們已經快速搭建了一個示例應用,容許你使用 Amplitude 或者 CleverTap 來實現事件日誌工具的功能。下面的部分將經過演示引導你在程序的適當地方插入 API 密鑰。不過,爲了讓程序跑起來,你須要在網上註冊這些服務。

事件記錄器自己是 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 的類實例,該實例的上下文是協議 AnalyticsEventLogger。實際的實例將會是一個 AmplitudeEventLogger,這個類被聲明在 AmplitudeEventLogger.swift 文件中。若是你想要使用 CleverTap,只須要簡單地替換聲明部分便可。

var eventLogger:AnalyticsEventLogger = CleverTapEventLogger()

實際上,你甚至不須要聲明變量的類型(AnalyticsEventLogger)。Swift 的編譯器可以推斷出來。

獲取代碼

在終端上輸入 git clone git@bitbucket.org:iachievedit/mobileanalytics.git 能夠從 BitBucket 上獲得示例應用的源代碼。在 Xcode 中打開 appname.xcodeproj。


appname Project

項目的基礎

示例項目中須要回顧的關鍵性文件以下:

  • AnalyticsEventLogger.swift – 這個文件中包含了咱們的 AnalyticsEventLogger 協議,全部的事件日誌工具都須要遵照這個協議。

  • AmplitudeEventLogger.swift – 使用 Amplitude 服務實現的 AnalyticsEventLogger 協議

  • CleverTapEventLogger.swift – 使用 CleverTap 服務實現的 AnalyticsEventLogger 協議

  • ViewController.swift – 在示例應用中,當咱們按下屏幕上的那些按鈕時,會打印對應的事件的分析。這些點擊事件對應的 IBAction 被定義在控制器當中

  • ApiKeys.swift - 這個文件中包含了一個實例,用來從一個 .plist 文件中提取 API 密鑰。具體的實現細節將在將會在接下來的章節 API 密鑰 中詳細講解。

API 密鑰

大多數狀況下,不表明所有,分析平臺會讓你使用一個單獨的應用密鑰或者使用用戶帳號標識符和應用密鑰的組合。這方面 Amplitude 和 CleverTap 沒有什麼不一樣。示例應用使用了屬性列表管理 API 密鑰。若是你尚未註冊任何一個服務,請跳到專門講解 Amplitude 或者 CleverTap 註冊流程的章節爲你的應用進行註冊。

注意上面的 ApiKeys.plist 文件是紅色的。這意味着這個文件不存在,因此你須要建立一個這樣的文件,而後向其中添加你所選擇的移動分析服務商密鑰。爲了能在 Amplitude 和 CleverTap 之間切換,你還須要同時保存兩者的帳戶和 API 密鑰。能夠經過下面的說明來了解,或者使用最初的模板工程嘗試一下其餘的服務,好比 Flurry 或者 AppAnalytics

使用 Xcode 的 File – New – File 來建立一個 ApiKeys.plist 文件,而後選中 iOS Resource,選擇 Property List 模板。點擊 Next 而且把文件命名爲 ApiKeys.plist,肯定對話框中勾選了將其添加到應用的 Target 中的選項。

爲你想要在工程中引用的每個 API 建立密鑰,好比 AmplitudeDevelopmentApplicationKey。若是你一直在使用這個示例工程而且使用了 Amplitude 和 CleverTap,你的 ApiKeys.plist 看上去應該是下面這樣:

ApiKeys.plist

一旦 API 密鑰就位,更新 AppDelegate 文件,選擇你須要的日誌工具,而後在真機或者模擬器上運行程序。

Logging Events

點擊 LikeDisLike 等,按鈕會調用移動分析的日誌方法(見 ViewController.swift 文件)。在 Donate(捐贈) 按鈕的情境中,日誌方法將包含捐贈的數量。

Amplitude 入門

注意:這是一個有關如何註冊 Amplitude 的簡單介紹,並不涵蓋全部的功能。
首先,你須要在 Amplitude 的註冊頁上註冊。填寫全部須要的信息(姓名、電子郵件等),而後你會看到 歡迎來到 Amplitude 的對話框。

點擊 Let's Go 按鈕,建立你的第一個應用。咱們在組織一欄填寫 iAchieved.it LLC ,應用名一欄填寫 Appname Development*。開發版本和應用版本的應用會有不一樣的密鑰。

點擊 Continue而且選擇 iOS SDK,而後點擊 I’m Ready to Install。Amplitude 將會展現一個 Amplitude SDK 的安裝頁面,該頁面提供了諸如如何下載 iOS SDK 、向工程中導入 SQLite 時應如何更新 build settings 的一系列說明,而後還展現了一個調用服務的 Objective C 示例。咱們熱衷於在應用中使用 Swift 語言,因此在這一步時點擊 Download the source code 連接下載 Amplitude 源碼。解壓下載獲得的文件夾。

示例應用已經包含了 Amplitude SDK,可是若是你在使用一個新建的項目,把 Amplitude 子文件夾拖拽到工程目錄中。肯定你勾選了 Copy items if neededCreate groups,固然還要肯定 application target 也是選中的。

AddingAmplitude

回到 Amplitude 的門戶頁,你能夠點擊 Install Amplitude SDK 頁面的 Continue 按鈕,而後點擊 Done,當提示邀請成員加入你的團隊時,選擇 Skip

添加附加框架

向你的 Xcode 工程中添加如下框架:

  • libsqlite.tbd

能夠經過下面的步驟輕鬆地增長框架:進入工程的 target 目錄下,選擇 Build Phases,來到 Link Binary With Libraries 功能區,而後點擊 + 按鈕選擇框架。

添加橋接頭文件

在 iAchieved.it,自 Swift 誕生之日起咱們就在使用這門語言,而且從未放棄。若是你也正在使用 Swift 構建你的工程,爲了訪問 Amplitude 的 API 你須要在工程中添加一個橋接頭文件。橋接頭文件很容易添加。首先,使用 File – New – File,選擇 iOS Source,而後找到 Header file 圖標。把文件命名爲 bridgingHeader.h。

接下來,在應用的 target 中點擊 Build Settings,在搜索框中輸入 bridging,你將看到下面的頁面:

雙擊 Objective-C Bridging Header 一欄,在對話框中輸入 $(SRCROOT)/bridgingHeader.h。$(SRCROOT) 會被映射到你程序的根目錄。

如今,在 bridgingHeader.h 文件中輸入一行代碼:#import "Amplitude.h"

API 證書

應用須要的 API 證書能夠從 Amplitude 輕鬆得到。在網站門戶頁,點擊右上角的 account e-mail,而後在下拉菜單中選擇 Account Settings

Amplitude API Keys

在咱們的示例應用中,咱們使用 .plist 方法保存 API 的密鑰,因此拿到對應的密鑰並加入到 ApiKeys.plist 文件中。或者你能夠打開 AmplitudeEventLogger.swift 文件,把 API 密鑰直接增長到 Amplitude.instance.initializeApiKey 方法中。

CleverTap 入門

注意:這是一個有關如何註冊 CleverTap 的簡單介紹,並不涵蓋全部的功能。
咱們發現 CleverTap 使用起來不像 Amplitude 那樣直觀。然而,它不須要信用卡就能夠上手,這樣你能夠在考慮購買以前先試用一段時間。

按照標題找到 CleverTap 的註冊頁面,填寫所需的信息。你將收到一封激活的郵件,其中會包含一個完成註冊的連接。產看電子郵件並點擊 Complete your signup 按鈕。


點擊 Add my first app 按鈕你會看到下面的頁面:

Add Your App

請注意, CleverTap 自動爲你的應用建立了一個 TEST 環境。坦白說,我不太喜歡這個特性,由於它在猜想你的環境命名。使用 Amplitude 的時候,能夠本身管理應用的開發、升級以及發佈版本,而 CleverTap 則簡單地假設你有一個 TEST 的應用版本。

點擊 Add My App。你須要在屏幕上選擇你所要進行開發的平臺(Android版,iOS版,Windows等),而且提交你的應用在應用商店中的 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 選項。固然你也會把它添加到你應用的 target 中。

添加附加的框架

添加以下所示的框架到你的 Xcode 工程中:

  • SystemConfiguration

  • CoreTelephony

  • Security

  • UIKit

  • CoreLocation

添加一個橋接頭文件(若是你在使用Swift的話)

和 Amplitude同樣,若是你在使用 Swift 語言,你須要添加一個橋接頭文件。詳情請參考添加頭文件的快速指南。在 bridgingHeader.h 文件中增長一行:#import <CleverTapSDK/CleverTap.h>

API 證書

CleverTap 盡力讓本身的 API 密鑰足夠簡單。能夠調用一個名爲 autoIntegrate 的方法,該方法會經過 CleverTap 的後臺「註冊一切」。autoIntegrate 方法沒有參數,它與下面的步驟緊密關聯:

CleverTap Autointegrate

它明確提示要向「你的 .plist 文件」中增長兩個密鑰 CleverTapAccountID 和 CleverTapToken。一個針對 Info.plist 文件的假設是,若是你在管理一個測試版的應用和一個常規版本的應用,根據條件切換 .plist 文件是使人煩惱的。因此,相比於使用 autoIntegrate 方法,你應該使用 changeCredentials(withAccountID:andToken) 方法。這個方法會跳過本來的自動集成以及使用 .plist 文件管理 API 密鑰的方式。所以你可使用下面的方法:

let accountID    = valueForAPIKey(named:"CleverTapDevelopmentAccountID")
let accountToken = valueForAPIKey(named:"CleverTapDevelopmentAccountToken")
CleverTap.changeCredentials(withAccountID: accountID, andToken: accountToken)

注意: valueForAPIKey 示例來自於咱們使用屬性列表管理 API 密鑰的方式,不過使用 valueForAPIKey 的方式你能夠決定密鑰的名字。

結束前的思考

軟件開發者是一羣有趣的生物。當可使用一門新的語言或者框架時,咱們常常重寫一些東西,可是當這種改變是強制性的時候卻不必定會關心這些變化。對於所開發的「系統」,指望它可擴展而且可以適應將來的需求。咱們開發的與服務端無關的事件日誌系統遵循了這種方法的精神,可是即便如此仍須明白,將來的移動分析平臺會提供新的特性與功能,若是要使用這些功能,你必須適配這些功能。換言之,這裏使用的方法毫不是故事的結尾,每當有新的服務須要評估的時候,咱們必須時刻準備着對再也不適應需求的代碼區域進行返工。即便如此,當你由於這樣或那樣的緣由(特別喜歡的 API 被棄用了,代碼對你來講不夠 Swifty,要麼就像 Parse 那樣走到了生命盡頭)而體會到了修改 API 的痛苦時,你可能會考慮使用一個基於協議的方法,在當前所使用的服務和其餘服務之間充當一個填充的中間層。

本文由 SwiftGG 翻譯組翻譯,已經得到做者翻譯受權,最新文章請訪問 http://swift.gg

相關文章
相關標籤/搜索