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,这个包几乎每天一更,而且都是稳定版,所以使用最新版即可。

或者使用命令行

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能将我这篇文章收录,作为一个指引。最起码我觉得比官方的文档绕来绕去还将不明白好多了。

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

使用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. Learning JavaScript with MDN (call, apply, bind)

    Learning JavaScript with MDN (call, apply, bind) call, apply, bind Object.prototype.toString() 检测 js ...

  2. taro 禁用滚动事件

    taro 禁用滚动事件 禁止 Modal 蒙层下面的页面的内容跟随滚动 https://github.com/NervJS/taro/issues/3980 https://github.com/Ne ...

  3. Taro Next

    Taro Next Taro 2.0 https://aotu.io/notes/2020/02/03/taro-next-alpha/index.html Taro Next 的迁移指南 https ...

  4. windows10 安装NASM

    NASM官网 下载NASM NASM在线HTML文档 下载golink golink文档 NASM教程 in windows x64调用约定 x86调用约定 编码样式约定 在编写nasm时数字默认为1 ...

  5. Flutter Demo: PageView横向使用

    video import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends ...

  6. PAUL ADAMS ARCHITECT:华州加州城市楼市竞争力居全美前列

    美国房地产公司最新一份报告显示,美国楼市竞争力最高的十个城市中有八个来自华盛顿州和加利福尼亚州,主要原因在于越来越多的买家考虑迁居房价更划算的都会区.数据显示,斯潘那维65%的房屋以高于要价的价格售出 ...

  7. 【快速掌握】Redis 的五种数据类型

    不同于MySQL的表结构所带来的复杂语句,Redis只需要维护好它的[key-value]结构就可以,因此相比于MySQL,语句非常简单. 今天介绍一下Redis 五种常用的数据类型: 这五种数据类型 ...

  8. ES6 声明变量的六种方法

    ES5 只有两种声明变量的方法: var 命令和 function 命令. ES6 除了添加 let 和 const 命令, 后面章节还会提到, 另外两种声明变量的方法: import 命令和 cla ...

  9. Redis高频面试题总结

    通过面试多家大型互联网企业,总结了如下的高频面试题目: 1.redis 过期键的删除策略? (1)定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键的过期时间来临时,立即 ...

  10. linux 安装node和pm2

    用yum安装 curl -sL https://rpm.nodesource.com/setup_10.x | bash - yum install -y nodejs npm install -g ...