1.前言ios
最近在作一个项目,咱们的后台大数据团队须要了解用户在使用app的时候,都进行了哪些操做,在哪一个页面都干了些什么,以及app日活和月活等等,各类数据。总之就是监控用户行为,说好听一点就是发送反馈数据,提高用户体验。git
用时下流行的叫法就是:github
高情商:提高用户体验web
低情商:监控用户一举一动编程
不要骂我,任何一个市面上的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能将我这篇文章收录,做为一个指引。最起码我以为比官方的文档绕来绕去还将不明白好多了。
后续我会翻译一下成英文版,方便老外看懂。