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包含了上百个服务,详见下图。

有兴趣的可以自己去看源代码:https://github.com/aws/aws-sdk-net

4. 下载PinPoint包


Nuget搜索awssdk.pinpoint,这个包几乎每天一更,而且都是稳定版,所以使用最新版即可。

或者使用命令行

  1. 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

两个都明白了之后,就很简单了

  1. CognitoAWSCredentials credentials = new CognitoAWSCredentials(poolId, RegionEndpoint.USEast1);
  2. var pinpoint = new AmazonPinpointClient(credentials, RegionEndpoint.USEast1);

6. 发送PinPoint追踪事件


发送这个事件也是研究了很久,因为.net下的封装只能说是半成品,而安卓ios下的封装已经太完善了,只需要简单的调用PutEvents即可。

而我们还需要从最基本的做起,只能说还要啥自行车,能用都不错了。 ​​​ ​​​ ​​​

从EndpointDemographic、PublicEndpoint、Event、EventsBatch、EventsRequest、PutEventsRequest层层传递,

经过九九八十一难,才能取得真经————pinpoint.PutEventsAsync(putEventsRequest);

  1. try
  2. {
  3. CognitoAWSCredentials credentials = new CognitoAWSCredentials(poolId, RegionEndpoint.USEast1);
  4. var pinpoint = new AmazonPinpointClient(credentials, RegionEndpoint.USEast1);
  5.  
  6. EndpointDemographic endpointDemographic = new EndpointDemographic
  7. {
  8. AppVersion = "1.0.0",
  9. Locale = "zh-hk",
  10. Make = "xxx",
  11. Model = "xxx",
  12. ModelVersion = "19042",
  13. Platform = "pc",
  14. PlatformVersion = "19042",
  15. };
  16.  
  17. PublicEndpoint publicEndpoint = new PublicEndpoint
  18. {
  19. ChannelType = ChannelType.CUSTOM,
  20. Demographic = endpointDemographic,
  21. //More
  22. };
  23.  
  24. //Maximum number of attribute keys and metric keys for each event ------ 40 per request
  25. Dictionary<string, string> attribute = new Dictionary<string, string>
  26. {
  27. {"field1", "xxx" },
  28. {"field2", "xxx" },
  29. {"field3", "xxx" },
  30. {"field4", "xxx" },
  31. {"field5", "xxx" },
  32. //More
  33. };
  34.  
  35. var current = Package.Current;
  36. Event @event = new Event
  37. {
  38. Attributes = attribute,
  39. EventType = "xxx",
  40. AppPackageName = Package.Current.Id.Name,
  41. AppTitle = Package.Current.DisplayName,
  42. AppVersionCode = "10000",
  43. SdkName = GetAWSSDKName(pinpoint.Config.UserAgent),
  44. ClientSdkVersion = GetAWSSDKVersion(pinpoint.Config.UserAgent),
  45. Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss")
  46. };
  47. Dictionary<string, Event> events = new Dictionary<string, Event>();
  48. events.Add("Events", @event);
  49.  
  50. EventsBatch eventsBatch = new EventsBatch
  51. {
  52. Endpoint = publicEndpoint,
  53. Events = events
  54. };
  55.  
  56. Dictionary<string, EventsBatch> batchItem = new Dictionary<string, EventsBatch>();
  57. batchItem.Add(installId.ToString(), eventsBatch);
  58.  
  59. EventsRequest eventsRequest = new EventsRequest
  60. {
  61. BatchItem = batchItem
  62. };
  63.  
  64. PutEventsRequest putEventsRequest = new PutEventsRequest
  65. {
  66. ApplicationId = appId,
  67. EventsRequest = eventsRequest
  68. };
  69.  
  70. var res = await pinpoint.PutEventsAsync(putEventsRequest);
  71. if(res != null)
  72. {
  73. Debug.WriteLine("PinPoint.PutEventsAsync: " + DateTime.UtcNow);
  74. Debug.WriteLine("EndpointItemResponse: "
  75. + res?.EventsResponse?.Results[installId.ToString()]?.EndpointItemResponse.StatusCode
  76. + res?.EventsResponse?.Results[installId.ToString()]?.EndpointItemResponse.Message);
  77. Debug.WriteLine("EndpointItemResponse: "
  78. + res?.EventsResponse?.Results[installId.ToString()]?.EventsItemResponse["Events"].StatusCode
  79. + res?.EventsResponse?.Results[installId.ToString()]?.EventsItemResponse["Events"].Message);
  80. }
  81. }
  82. catch (AmazonPinpointException ex)
  83. {
  84.  
  85. }
  86. catch(Exception ex)
  87. {
  88.  
  89. }

注意我们在控制台输出的调试信息,当成功发送事件后,服务器会返回202Accepted,表示服务器已经接受我们的请求,并且正在处理。稍等几分钟即可看到数据。

下面是后台看到的数据分析控制台。

7. 总结


关于.net平台下PinPoint的文章,我搜遍了全网,没有看到过一篇,所以决定写下来,给自己做个记录,也方便以后用到PinPoint的同行,不要再浪费时间在这没用的基本研究了,没有任何意义。

但是PinPoint确实是一个非常强大的“提升用户体验”的好工具,希望AWS能将我这篇文章收录,作为一个指引。最起码我觉得比官方的文档绕来绕去还将不明白好多了。

后续我会翻译一下成英文版,方便老外看懂。

使用Amazon Pinpoint对用户行为追踪的更多相关文章

  1. AWS 移动推送到iOS设备,Amazon Pinpoint

    前言 第一次对接aws,遇到的坑是真多.现在记录一下.本文主要用到的是[Amazon Pinpoint]推送. 开发人员的指南:https://docs.aws.amazon.com/zh_cn/pi ...

  2. 在MySQL中使用init-connect与binlog来实现用户操作追踪记录

    在MySQL中使用init-connect与binlog来实现用户操作追踪记录 分类: MySQL 前言: 测试环境莫名其妙有几条重要数据被删除了,由于在binlog里面只看到是公用账号删除的,无法查 ...

  3. 0816关于MySQL的审计 init-connect+binlog实现用户操作追踪

    转自:http://blog.sina.com.cn/s/blog_605f5b4f01013xkv.html mysql 用init-connect+binlog实现用户操作追踪 做access 的 ...

  4. mysql 用init-connect+binlog实现用户操作追踪做access的ip的log记录

    在MYSQL中,每个连接都会先执行init-connect,进行连接的初始化.我们可以在这里获取用户的登录名称和thread的ID值.然后配合binlog,就可以追踪到每个操作语句的操作时间,操作人等 ...

  5. iOS用户行为追踪——无侵入埋点

    本文章系作者原创文章,如需转载学习,请注明该文章的原始出处和网址链接.  在阅读的过程中,如若对该文章有不懂或值得优化的建议,欢迎大家加QQ:690091622 进行技术交流和探讨. 前言:  前几日 ...

  6. 让用户使用第三方账号(如亚马逊账号)接入AWS IoT系统

    我们想象这么一个IoT应用场景:厂商A使用AWS IoT来开发物联网解决方案,那么A把设备卖给用户的时候,需要使用户能够登入AWS IoT系统来控制其购买的A的设备,也就是说给用户分配适当的权限.下面 ...

  7. 【To B产品怎么做?】泛用户体验

    目录 - 什么是泛用户体验? - 如何做好泛用户体验? - 泛用户体验有什么用? *预计阅读时间15分钟 不知道你有没有过这种体验,客服妹子的声音软糯,氛围微妙,用词标准,张口就是:给你带来了不好的体 ...

  8. Amazon及其亏本诱饵策略还能坚持多久?

    Amazon 刚刚公布了最新的财报,亏损 4100 万美元.这是这家电子商务巨头连续 5 个季度以来的第 3 次亏损.但是华尔街似乎却一片叫好声,当日 Amazon 的股价也涨了近 8 个点达 359 ...

  9. vscode源码分析【三】程序的启动逻辑,性能问题的追踪

    第一篇: vscode源码分析[一]从源码运行vscode 第二篇:vscode源码分析[二]程序的启动逻辑,第一个窗口是如何创建的 启动追踪 代码文件:src\main.js 如果指定了特定的启动参 ...

随机推荐

  1. yarn global add !== yarn add global

    yarn global add !== yarn add global yarn does not exist the --global flag, but exits yarn global com ...

  2. lightning & web components & templates & slots

    lightning & web components & templates & slots Web components, Custom elements, Template ...

  3. CSS3 & CSS var & :root

    CSS3 & CSS var & :root How to change CSS :root color variables in JavaScript https://stackov ...

  4. TypeScript 如何编写类库声明文件 .d.ts

    TypeScript 如何编写类库声明文件 .d.ts how to write a d.ts file declaration-files/ https://www.typescriptlang.o ...

  5. “Fatal error: Unable to find local grunt.” when running “grunt” command

    下载到本地 >npm install grunt >grunt 命令行运行:grunt,出现以下问题: 这些是Gruntfile.js中引用的,依次安装: npm install grun ...

  6. OpenCVE-开源漏洞预警平台

    0x01简介 主程序主要是通过使用NVD提供的JSON数据来更新CVE数据,并在前端进行展示.然后通过邮件进行通知,目前也只支持邮件.这个开源预警平台看上去并不是很完善,因为CVE本身就具有预警滞后性 ...

  7. [报错集]ubuntu中安装oracle java报错

    1.因为版本更新,JAVA15以前的版本都已经没办法下载了,所以要使用oracle java必须使用最近的java15 $ sudo apt-get install oracle-java15-ins ...

  8. js---it笔记

    typeof a返回的是字符串 vscode scss安装的easy scss中的配置settingjson文件中的css编译生成路径是根目录下的

  9. Java 开源办公开发平台 O2OA V5.4.0 发布 | 设计元素搜索功能上线

    O2OA V5.4.0版本此次更新的设计元素搜索功能,可以让用户在海量的脚本.页面.表单.视图等信息中迅速锁定有价值的信息,以便提高用户获取信息的效率.拥有此搜索功能后,在开发过程中,可以加速定位脚本 ...

  10. TERSUS无代码开发(笔记09)-简单实例前端样式设计

    前端常用样式设计 =========================================================================================== ...