使用Amazon Pinpoint對用戶行為追蹤
- 2021 年 4 月 5 日
- 筆記
- AWS PinPoint, c#, UWP
1.前言
最近在做一個項目,我們的後台大數據團隊需要了解用戶在使用app的時候,都進行了哪些操作,在哪個頁面都幹了些什麼,以及app日活和月活等等,各種數據。總之就是監控用戶行為,說好聽一點就是發送反饋數據,提升用戶體驗。
用時下流行的叫法就是:
高情商:提升用戶體驗
低情商:監控用戶一舉一動
不要罵我,任何一個市面上的app都會這麼干,抖音、微信、微博、QQ、支付婊、淘寶、京東等等,有一個算一個,一個都別想跑。
所以我們也為了更好地提升用戶體驗,當然也需要在代碼裏面加一點點東西咯。
做data tracking的平台很多,亞馬遜、微軟、谷歌、騰訊、阿里、位元組、可能每家都有自己定製的一套服務,我們採用的是亞馬遜的PinPoint技術,沒有為什麼,後台選的。
由於AWS的文檔真的是亂成狗,導致我們在最基本的初始化sdk,都花了一個星期,可見官方文檔有多差,包名管理混亂,連基本的示例代碼都沒有,文檔是N年以前的,點擊去各種跳轉,到最後發現全都不能用。不過相比於.net平台,aws在安卓、蘋果、web方便,可謂是下足了功夫,示例代碼,配置截圖,真的就差幫寫實際項目集成代碼了。所以在折騰了一個星期後,我們終於跑通了所有流程,僅以此文檔記錄一下踩過的坑,也讓以後想「提升用戶體驗」的同行少走彎路。
2. PinPoint功能介紹
客戶希望與他們喜愛的企業和品牌保持聯繫。他們通過各種線上和線下渠道忠實地關注最新的產品、新聞和促銷活動。但客戶越來越希望接收主動的相關數字通信。Amazon Pinpoint 是一項靈活且可擴展的出站和入站營銷傳播服務。
①通信渠道
Amazon Pinpoint 通過電子郵件、語音、推送通知和 SMS 渠道實現送達和規模,從而覆蓋全球數億客戶。
②營銷消息
使用 Amazon Pinpoint 在合適的時間向合適的人發送合適的信息,從而實現推廣營銷傳播。
③事務性消息
事務性消息是指發送給特定接收者的按需消息。您可以使用 Amazon Pinpoint API 和 AWS 軟件開發工具包,通過電子郵件、推送、SMS 或語音發送事務性消息。您也可以通過編程方式根據 Web 或移動應用程序中的客戶活動觸發事務性消息。
④分析
使用 Amazon Pinpoint 提供的分析可以通過查看與用戶參與度、活動延伸範圍、收入等相關的趨勢,深入了解用戶群。
在用戶與您的項目交互時,Amazon Pinpoint 收集並存儲這些交互的分析數據。您可以查看這些數據,以便了解用戶參與度、購買活動以及人數統計等方面的信息。例如,如果您有一個移動應用程序,您可以查看顯示每天打開您應用程序的用戶數、用戶打開您應用程序的時間以及您應用程序產生的收入的圖表和指標。
其實我們為了提升用戶體驗,也就是用了PinPoint的分析功能。
3. PinPoint源碼
實際上PinPoint只是AWS的一個很小部分而已, AWS一整套SDK包含了上百個服務,詳見下圖。
有興趣的可以自己去看源代碼://github.com/aws/aws-sdk-net
4. 下載PinPoint包
Nuget搜索awssdk.pinpoint,這個包幾乎每天一更,而且都是穩定版,所以使用最新版即可。
或者使用命令行
Install-Package AWSSDK.Pinpoint -Version 3.7.1.4
除了PinPoint,我們還需要下載一個單獨的AWSSDK.CognitoIdentity包,這個是專門管理授權的。
一開始我查了很久,以為是AWSSDK提供的,因為他裏面也包含一個相同的AWSSDK.CognitoIdentity,但是卻不能授權。而且這個包還是2016年的,。。。
5. 初始化PinPoint
PinPoint初始化一般通過AWSCredentials這個參數,而AWSCredentials初始化則需要通過剛才提到的包AWSSDK.CognitoIdentity裏面的CognitoAWSCredentials,找後端要PoolId和Region
兩個都明白了之後,就很簡單了
CognitoAWSCredentials credentials = new CognitoAWSCredentials(poolId, RegionEndpoint.USEast1); var pinpoint = new AmazonPinpointClient(credentials, RegionEndpoint.USEast1);
6. 發送PinPoint追蹤事件
發送這個事件也是研究了很久,因為.net下的封裝只能說是半成品,而安卓ios下的封裝已經太完善了,只需要簡單的調用PutEvents即可。
而我們還需要從最基本的做起,只能說還要啥單車,能用都不錯了。
從EndpointDemographic、PublicEndpoint、Event、EventsBatch、EventsRequest、PutEventsRequest層層傳遞,
經過九九八十一難,才能取得真經————pinpoint.PutEventsAsync(putEventsRequest);
try { CognitoAWSCredentials credentials = new CognitoAWSCredentials(poolId, RegionEndpoint.USEast1); var pinpoint = new AmazonPinpointClient(credentials, RegionEndpoint.USEast1); EndpointDemographic endpointDemographic = new EndpointDemographic { AppVersion = "1.0.0", Locale = "zh-hk", Make = "xxx", Model = "xxx", ModelVersion = "19042", Platform = "pc", PlatformVersion = "19042", }; PublicEndpoint publicEndpoint = new PublicEndpoint { ChannelType = ChannelType.CUSTOM, Demographic = endpointDemographic, //More }; //Maximum number of attribute keys and metric keys for each event ------ 40 per request Dictionary<string, string> attribute = new Dictionary<string, string> { {"field1", "xxx" }, {"field2", "xxx" }, {"field3", "xxx" }, {"field4", "xxx" }, {"field5", "xxx" }, //More }; var current = Package.Current; Event @event = new Event { Attributes = attribute, EventType = "xxx", AppPackageName = Package.Current.Id.Name, AppTitle = Package.Current.DisplayName, AppVersionCode = "10000", SdkName = GetAWSSDKName(pinpoint.Config.UserAgent), ClientSdkVersion = GetAWSSDKVersion(pinpoint.Config.UserAgent), Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss") }; Dictionary<string, Event> events = new Dictionary<string, Event>(); events.Add("Events", @event); EventsBatch eventsBatch = new EventsBatch { Endpoint = publicEndpoint, Events = events }; Dictionary<string, EventsBatch> batchItem = new Dictionary<string, EventsBatch>(); batchItem.Add(installId.ToString(), eventsBatch); EventsRequest eventsRequest = new EventsRequest { BatchItem = batchItem }; PutEventsRequest putEventsRequest = new PutEventsRequest { ApplicationId = appId, EventsRequest = eventsRequest }; var res = await pinpoint.PutEventsAsync(putEventsRequest); if(res != null) { Debug.WriteLine("PinPoint.PutEventsAsync: " + DateTime.UtcNow); Debug.WriteLine("EndpointItemResponse: " + res?.EventsResponse?.Results[installId.ToString()]?.EndpointItemResponse.StatusCode + res?.EventsResponse?.Results[installId.ToString()]?.EndpointItemResponse.Message); Debug.WriteLine("EndpointItemResponse: " + res?.EventsResponse?.Results[installId.ToString()]?.EventsItemResponse["Events"].StatusCode + res?.EventsResponse?.Results[installId.ToString()]?.EventsItemResponse["Events"].Message); } } catch (AmazonPinpointException ex) { } catch(Exception ex) { }
注意我們在控制台輸出的調試信息,當成功發送事件後,服務器會返回202Accepted,表示服務器已經接受我們的請求,並且正在處理。稍等幾分鐘即可看到數據。
下面是後台看到的數據分析控制台。
7. 總結
關於.net平台下PinPoint的文章,我搜遍了全網,沒有看到過一篇,所以決定寫下來,給自己做個記錄,也方便以後用到PinPoint的同行,不要再浪費時間在這沒用的基本研究了,沒有任何意義。
但是PinPoint確實是一個非常強大的「提升用戶體驗」的好工具,希望AWS能將我這篇文章收錄,作為一個指引。最起碼我覺得比官方的文檔繞來繞去還將不明白好多了。
後續我會翻譯一下成英文版,方便老外看懂。