與服務(wù)器無關(guān)的移動端分析

作者: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

點擊 LikeDisLike 等沟蔑,按鈕會調(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 neededCreate 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蚪燕。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卖漫,一起剝皮案震驚了整個濱河市拖陆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌懊亡,老刑警劉巖依啰,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異店枣,居然都是意外死亡速警,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門鸯两,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闷旧,“玉大人,你說我怎么就攤上這事钧唐∶ψ疲” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長该园。 經(jīng)常有香客問我酸舍,道長,這世上最難降的妖魔是什么里初? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任啃勉,我火速辦了婚禮,結(jié)果婚禮上双妨,老公的妹妹穿的比我還像新娘淮阐。我一直安慰自己,他們只是感情好刁品,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布泣特。 她就那樣靜靜地躺著,像睡著了一般挑随。 火紅的嫁衣襯著肌膚如雪状您。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天镀裤,我揣著相機(jī)與錄音竞阐,去河邊找鬼缴饭。 笑死暑劝,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颗搂。 我是一名探鬼主播担猛,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丢氢!你這毒婦竟也來了傅联?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤疚察,失蹤者是張志新(化名)和其女友劉穎蒸走,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體貌嫡,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡比驻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岛抄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片别惦。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖夫椭,靈堂內(nèi)的尸體忽然破棺而出掸掸,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布扰付,位于F島的核電站堤撵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悯周。R本人自食惡果不足惜粒督,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望禽翼。 院中可真熱鬧屠橄,春花似錦、人聲如沸闰挡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽长酗。三九已至溪北,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夺脾,已是汗流浹背之拨。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留咧叭,地道東北人蚀乔。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像菲茬,于是被迫代替她去往敵國和親吉挣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,129評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫婉弹、插件睬魂、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 我爭氣是因為想生活得較好,不要在任何人面前威風(fēng)镀赌。 摘抄自(你的素心氯哮,亦舒)
    憂郁的漁閱讀 107評論 0 0
  • 2月,你陪我從家到學(xué)校商佛; 3月末喉钢,我跑完半程馬拉松,就去找你了威彰; 5月初出牧,你來陪我復(fù)習(xí),看電影歇盼。 6月初舔痕,你來陪我...
    減肥的女孩閱讀 140評論 0 1
  • 一次清明放假徹底改變了我的高中生活,在那以后的日子里充滿了恐懼、無奈伯复、與不知所措慨代。 一場車禍奪走了我閨蜜潔的生...
    3fa19e385918閱讀 297評論 0 1