使用Amazon Pinpoint對用戶行爲追蹤

1.前言ios


 

最近在作一個項目,咱們的後臺大數據團隊須要瞭解用戶在使用app的時候,都進行了哪些操做,在哪一個頁面都幹了些什麼,以及app日活和月活等等,各類數據。總之就是監控用戶行爲,說好聽一點就是發送反饋數據,提高用戶體驗。git

用時下流行的叫法就是:github

高情商:提高用戶體驗web

低情商:監控用戶一舉一動編程

[doge][doge][doge] ​​​

不要罵我,任何一個市面上的app都會這麼幹,抖音、微信、微博、QQ、支付婊、淘寶、京東等等,有一個算一個,一個都別想跑。後端

 

 

因此咱們也爲了更好地提高用戶體驗,固然也須要在代碼裏面加一點點東西咯。服務器

作data tracking的平臺不少,亞馬遜、微軟、谷歌、騰訊、阿里、字節、可能每家都有本身定製的一套服務,咱們採用的是亞馬遜的PinPoint技術,沒有爲何,後臺選的。微信

 

因爲AWS的文檔真的是亂成狗,致使咱們在最基本的初始化sdk,都花了一個星期,可見官方文檔有多差,包名管理混亂,連基本的示例代碼都沒有,文檔是N年之前的,點擊去各類跳轉,到最後發現全都不能用。不過相比於.net平臺,aws在安卓、蘋果、web方便,可謂是下足了功夫,示例代碼,配置截圖,真的就差幫寫實際項目集成代碼了。因此在折騰了一個星期後,咱們終於跑通了全部流程,僅以此文檔記錄一下踩過的坑,也讓之後想「提高用戶體驗」的同行少走彎路。app

 

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包含了上百個服務,詳見下圖。

有興趣的能夠本身去看源代碼:https://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能將我這篇文章收錄,做爲一個指引。最起碼我以爲比官方的文檔繞來繞去還將不明白好多了。

後續我會翻譯一下成英文版,方便老外看懂。