# 消息推送模块
以下接口生效依赖于推送模块,需集成推送相关AnalysysPush.framework文件,请正确集成。
## 简介
推送消息是一种常用的运营方法。在合适的时间把合适的内容通过合适的方式推送给合适的人群,不仅能促进用户活跃,也能极大提升用户对产品的体验。 易观推送现在支持极光、个推、百度、小米等平台。支持通过易观开发者平台设置以下三种类型的推送消息内容:
* 下发通知,点击通知,打开宿主 App
* 下发通知,点击通知,打开宿主 App 的特定页面
* 下发通知,点击通知,触发打开特定的 URL 页面
首先,开发者需要在 App 中集成第三方推送系统的 SDK,并在 App 初始化过程中获取设备推送 ID,并保存在方舟分析的用户信息中。以下简要说明集成第三方推送系统的集成方式
## 设置设备推送 ID
该接口用于设置推送平台(provider)提供的设备推送ID。
```objectivec
+ (void)setPushProvider:(AnalysysPushProvider)provider pushID:(NSString *)pushID;
```
* provider 推送提供方标识,目前只 `AnalysysPushProvider` 枚举中的类型
* pushID 第三方推送标识。如:极光的 `registrationID`,个推的 `clientId`,百度的 `channelid`,小米的 `xmRegId`
调用方法,以极光为例:
```objectivec
[AnalysysAgent setPushProvider:AnalysysPushJiGuang pushID:@"191e35f7e01617e5181"];
```
Swift示例:
```swift
AnalysysAgent.setPushProvider(.jiGuang, pushID: "191e35f7e01617e5181")
```
### 极光推送
请下载最新的极光推送 SDK,并根据[《iOS SDK 集成指南》](https://docs.jiguang.cn/jpush/client/iOS/ios_guide_new/)将SDK集成至开发者App中。并集成并初始化方舟SDK。
在 iOS App 中,首先获取 APNs 的 Device Token,然后注册极光推送,成功后极光推送会返回 `registrationID`,将此 `registrationID` 回传方舟 SDK 即可。
```objectivec
@interface AppDelegate () <JPUSHRegisterDelegate>
@end
```
```objectivec
#import <AnalysysAgent/AnalysysAgent.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 初始化极光SDK后,获取 registrationID 并回传
[JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {
if(resCode == 0){
// 回传
[AnalysysAgent setPushProvider:AnalysysPushJiGuang pushID:registrationID];
} else{
NSLog(@"registrationID获取失败,code:%d",resCode);
}
}];
}
// 获取 APNS Token 值
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// 向极光注册 deviceToken
[JPUSHService registerDeviceToken:deviceToken];
}
```
### 百度推送
请下载最新的百度推送 SDK,并根据[《百度Push服务SDK用户手册(iOS版)》](http://push.baidu.com/doc/ios/api)将 SDK 集成至开发者App中。并集成并初始化方舟SDK。
在 iOS App 中,首先获取 APNs 的 Device Token,然后注册百度推送,成功后百度推送会返回 `channelid`,将此 `channelid` 回传方舟 SDK 即可。
```objectivec
@interface AppDelegate () <UIApplicationDelegate,UNUserNotificationCenterDelegate>
@end
```
```objectivec
#import <AnalysysAgent/AnalysysAgent.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 初始化百度SDK后,获取 channelid 并回传
[BPush bindChannelWithCompleteHandler:^(id result, NSError *error) {
if (error) {
return ;
}
if (result) {
if ([result[@"error_code"]intValue]!=0) {
return;
}
NSString *channelid = [BPush getChannelId];
// 回传
[AnalysysAgent setPushProvider:AnalysysPushBaiDu pushID:channelid];
}
}];
}
// 获取 APNS Token 值
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// 向百度注册 deviceToken
[BPush registerDeviceToken:deviceToken];
}
```
### 小米推送
请下载最新的小米推送 SDK,并根据[《小米推送服务iOS客户端SDK使用指南》](https://dev.mi.com/console/doc/detail?pId=98)将 SDK 集成至开发者 App 中。并集成并初始化方舟SDK。
在 iOS App 中,首先获取 APNs 的 Device Token,然后注册小米推送,成功后小米推送会返回 `regid`,将此 `regid` 回传方舟 SDK 即可。
```objectivec
@interface AppDelegate () <MiPushSDKDelegate,UNUserNotificationCenterDelegate>
@end
```
```objectivec
#import <AnalysysAgent/AnalysysAgent.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 只启动APNs.
[MiPushSDK registerMiPush:self];
}
// 获取 APNS Token 值
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// 向小米注册 deviceToken
[MiPushSDK bindDeviceToken:deviceToken];
}
#pragma mark *** MiPushSDKDelegate ***
- (void)miPushRequestSuccWithSelector:(NSString *)selector data:(NSDictionary *)data {
if ([selector isEqualToString:@"bindDeviceToken:"]) {
NSString *xmRegId = data[@"regid"];
// 回传
[AnalysysAgent setPushProvider:AnalysysPushXiaoMi pushID:xmRegId];
}
}
```
### 个推推送
请下载最新的个推推送 SDK,并根据[《iOS端 > Xcode集成》](http://docs.getui.com/getui/mobile/ios/xcode/)将 SDK 集成至开发者 App 中。并集成并初始化方舟 SDK。
在 iOS App 中,首先获取 APNs 的 Device Token,然后注册个推推送,成功后个推推送会返回 `clientId`,将此 `clientId` 回传方舟 SDK 即可。
```objectivec
@interface AppDelegate () <UIApplicationDelegate, GeTuiSdkDelegate, UNUserNotificationCenterDelegate>
@end
#import <AnalysysAgent/AnalysysAgent.h>
// 获取 APNS Token 值
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// 向个推注册 deviceToken
[GeTuiSdk registerDeviceToken:token];
}
#pragma mark *** GeTuiSdkDelegate ***
/** SDK启动成功返回cid */
- (void)GeTuiSdkDidRegisterClient:(NSString *)clientId {
// 回传
[AnalysysAgent setPushProvider:AnalysysPushGeTui pushID:clientId];
}
```
### 阿里云推送
请下载最新的阿里云推送SDK,并根据[《iOS SDK配置》](https://help.aliyun.com/document_detail/30072.html?spm=a2c4g.11186623.2.11.28ad120dG5Nj8n)正确集成至App中。
注册方舟推送标识:注册阿里云推送成功后,会返回 `DeviceId`,将此 `DeviceId` 回传方舟SDK即可。
```objectivec
#import <AnalysysAgent/AnalysysAgent.h>
@interface AppDelegate () <UIApplicationDelegate, UNUserNotificationCenterDelegate>
@end
// 获取 APNS Token 值
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[CloudPushSDK asyncInit:@"*****" appSecret:@"*****" callback:^(CloudPushCallbackResult *res) {
if (res.success) {
// 回传方舟阿里云推送标识
[AnalysysAgent setPushProvider:AnalysysPushALi pushID:[CloudPushSDK getDeviceId]];
} else {
NSLog(@"Push SDK init failed, error: %@", res.error);
}
}];
}
```
### 信鸽推送
请下载最新的腾讯信鸽推送SDK,并根据[《iOS集成接入指南》](https://xg.qq.com/docs/ios_access/ios_access_guide.html)正确集成至App中。
注册方舟推送标识:注册信鸽推送成功后,会返回 `deviceToken`,将此 `deviceToken` 回传方舟SDK即可。
```objectivec
@interface AppDelegate () <XGPushDelegate>
@end
- (void)xgPushDidRegisteredDeviceToken:(nullable NSString *)deviceToken error:(nullable NSError *)error {
NSLog(@"deviceToken:%@ error:%@", deviceToken, error.description);
// 回传方舟推送设备标识
[AnalysysAgent setPushProvider:AnalysysPushXinGe pushID:deviceToken];
}
```
## 统计活动推广信息
追踪记录 provider 对应平台的消息推送的信息。
接口如下:
```objectivec
+ (void)trackCampaign:(id)userInfo isClick:(BOOL)isClick;
+ (void)trackCampaign:(id)userInfo isClick:(BOOL)isClick userCallback:(void(^)(id campaignInfo))userCallback;
```
* userInfo:推送携带的参数信息
* isClick:YES:用户点击通知;NO:接收到消息通知
* userCallback:将解析后的用户下发活动信息回调用户
三方推送平台 SDK 集成及示例代码
首先,开发者需要在 App 中集成第三方推送系统的 SDK,并在 App 初始化过程中获取设备推送 ID,并保存在方舟分析的用户信息中。目前易观 SDK 支持极光、百度、小米、个推四家第三方推送统计的支持。以下简要说明集成第三方推送系统的集成方式。
### 极光推送
```objectivec
#pragma mark *** JPUSHRegisterDelegate ***
// >= iOS 10 Support , App Forground
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
NSDictionary * userInfo = notification.request.content.userInfo;
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
// 收到推送消息,追踪"App 消息推送"事件
[AnalysysAgent trackCampaign:userInfo isClick:NO userCallback:^(id campaignInfo) {
NSLog(@"此处可根据需要处理数据 : %@",campaignInfo);
}];
[JPUSHService handleRemoteNotification:userInfo];
}
completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置
}
// iOS 10 Support, App Background
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
NSDictionary *userInfo = response.notification.request.content.userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
// 点击通知栏打开消息,记录"App 点击通知"事件
[AnalysysAgent trackCampaign:userInfo isClick:YES userCallback:^(id campaignInfo) {
NSLog(@"此处可根据需要处理数据 : %@",campaignInfo);
}];
[JPUSHService handleRemoteNotification:userInfo];
}
completionHandler();
}
// >= iOS 7 <iOS 10
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[JPUSHService handleRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
[self handleRemoteNotificationWithApplication:application userInfo:userInfo];
}
// < iOS 7
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
[JPUSHService handleRemoteNotification:userInfo];
[self handleRemoteNotificationWithApplication:application userInfo:userInfo];
}
```
### 百度推送
```objectivec
#pragma mark *** UNUserNotificationCenterDelegate ***
// >= iOS 10 Support , App Forground
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
NSDictionary * userInfo = notification.request.content.userInfo;
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[BPush handleNotification:userInfo];
// 收到推送消息,追踪"App 消息推送"事件
[AnalysysAgent trackCampaign:userInfo isClick:NO userCallback:^(id campaignInfo) {
NSLog(@"此处可根据需要处理数据 : %@",campaignInfo);
}];
}
// 根据APP需要,判断是否要提示用户Badge、Sound、Alert
completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}
// iOS 10 Support, App Background
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
NSDictionary *userInfo = response.notification.request.content.userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
// 点击通知栏打开消息,记录"App 点击通知"事件
[AnalysysAgent trackCampaign:userInfo isClick:YES userCallback:^(id campaignInfo) {
NSLog(@"此处可根据需要处理数据 : %@",campaignInfo);
}];
[BPush handleNotification:userInfo];
}
completionHandler();
}
// >= iOS 7 <iOS 10
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[BPush handleNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
[self handleRemoteNotificationWithApplication:application userInfo:userInfo];
}
// < iOS 7
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
[BPush handleNotification:userInfo];
[self handleRemoteNotificationWithApplication:application userInfo:userInfo];
}
```
### 小米推送
```objectivec
#pragma mark *** UNUserNotificationCenterDelegate ***
// >= iOS 10 Support , App Forground
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
NSDictionary * userInfo = notification.request.content.userInfo;
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[MiPushSDK handleReceiveRemoteNotification:userInfo];
// 收到推送消息,追踪"App 消息推送"事件
[AnalysysAgent trackCampaign:userInfo isClick:NO userCallback:^(id campaignInfo) {
NSLog(@"此处可根据需要处理数据 : %@",campaignInfo);
}];
}
// 根据APP需要,判断是否要提示用户Badge、Sound、Alert
completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}
// iOS 10 Support, App Background
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
NSDictionary *userInfo = response.notification.request.content.userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
// 点击通知栏打开消息,记录"App 点击通知"事件
[AnalysysAgent trackCampaign:userInfo isClick:YES userCallback:^(id campaignInfo) {
NSLog(@"此处可根据需要处理数据 : %@",campaignInfo);
}];
[MiPushSDK handleReceiveRemoteNotification:userInfo];
}
completionHandler();
}
// >= iOS 7 <iOS 10
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[MiPushSDK handleReceiveRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
[self handleRemoteNotificationWithApplication:application userInfo:userInfo];
}
// < iOS 7
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
[MiPushSDK handleReceiveRemoteNotification:userInfo];
[self handleRemoteNotificationWithApplication:application userInfo:userInfo];
}
```
### 个推推送
```objectivec
// iOS 10 Support, App Background
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
NSDictionary *userInfo = response.notification.request.content.userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
// 点击通知栏打开消息,记录"App 点击通知"事件
[AnalysysAgent trackCampaign:userInfo isClick:YES userCallback:^(id campaignInfo) {
NSLog(@"此处可根据需要处理数据 : %@",campaignInfo);
}];
[GeTuiSdk handleRemoteNotification:userInfo];
}
completionHandler();
}
// >= iOS 7 <iOS 10
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[GeTuiSdk handleRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
[self handleRemoteNotificationWithApplication:application userInfo:userInfo];
}
#pragma mark *** GeTuiSdkDelegate ***
/** SDK收到透传消息回调 */
- (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString *)appId {
// [ GTSdk ]:汇报个推自定义事件(反馈透传消息)
[GeTuiSdk sendFeedbackMessage:90001 andTaskId:taskId andMsgId:msgId];
// 数据转换
NSString *payloadMsg = nil;
if (payloadData) {
payloadMsg = [[NSString alloc] initWithBytes:payloadData.bytes length:payloadData.length encoding:NSUTF8StringEncoding];
// 若App在前台时用户做弹框等处理,请适当调整isClick:参数(是否用户点击)
[AnalysysAgent trackCampaign:payloadMsg isClick:NO userCallback:^(id campaignInfo) {
NSLog(@"此处可根据需要处理数据 : %@",campaignInfo);
}];
}
}
```
###
### 阿里云推送
```objectivec
#pragma mark - UIApplicationDelegate
// 收到通知 >= iOS 7 <iOS 10
// 默认前台
// 后台通知需设置Capabilities 开启Remote notifications
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
// 方舟SDK推送处理(方法见文档尾部)
[self handleRemoteNotificationWithApplication:application userInfo:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
// iOS 10: App在前台获取到通知
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler API_AVAILABLE(ios(10.0)){
NSDictionary * userInfo = notification.request.content.userInfo;
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
// 方舟SDK推送处理
// 收到推送消息,追踪"App 消息推送"事件
[AnalysysAgent trackCampaign:userInfo isClick:NO userCallback:^(id campaignInfo) {
NSLog(@"campaignInfo:%@", campaignInfo);
}];
}
completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}
// iOS 10: 点击通知进入App时触发
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler API_AVAILABLE(ios(10.0)){
NSDictionary *userInfo = response.notification.request.content.userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
// 方舟SDK推送处理
// 点击通知栏打开消息,记录"App 点击通知"事件
[AnalysysAgent trackCampaign:userInfo isClick:YES userCallback:^(id campaignInfo) {
NSLog(@"campaignInfo:%@", campaignInfo);
}];
}
completionHandler();
}
#endif
```
### 信鸽推送
```objectivec
- (void)xgPushDidReceiveRemoteNotification:(id)notification withCompletionHandler:(void (^)(NSUInteger))completionHandler {
if (@available(iOS 10.0, *)) {
if ([notification isKindOfClass:[UNNotification class]]) {
UNNotification *not = (UNNotification *)notification;
// 方舟SDK推送处理
[AnalysysAgent trackCampaign:not.request.content.userInfo isClick:NO userCallback:^(id campaignInfo) {
NSLog(@"信鸽:receive campaignInfo:%@", campaignInfo);
}];
[[XGPush defaultManager] reportXGNotificationInfo:((UNNotification *)notification).request.content.userInfo];
completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}
} else {
if ([notification isKindOfClass:[NSDictionary class]]) {
// 方舟SDK推送处理(方法见文档尾部)
[self handleRemoteNotificationWithApplication:[UIApplication sharedApplication] userInfo:notification];
[[XGPush defaultManager] reportXGNotificationInfo:(NSDictionary *)notification];
completionHandler(UIBackgroundFetchResultNewData);
}
}
}
```
### iOS 10.0以下回调方法统一调用的方法:
```objectivec
// <iOS 10 版本统一处理通知回调方法
- (void)handleRemoteNotificationWithApplication:(UIApplication *)application userInfo:(NSDictionary *)userInfo{
if (application.applicationState == UIApplicationStateActive) {
// App前台 收到推送消息,追踪"App 消息推送"事件
[AnalysysAgent trackCampaign:userInfo isClick:NO userCallback:^(id campaignInfo) {
NSLog(@"此处可根据需要处理数据 : %@",campaignInfo);
}];
} else if (application.applicationState == UIApplicationStateBackground) {
// App后台 收到推送消息,追踪"App 消息推送"事件
[AnalysysAgent trackCampaign:userInfo isClick:NO userCallback:^(id campaignInfo) {
NSLog(@"此处可根据需要处理数据 : %@",campaignInfo);
}];
} else {
// App非活动状态
// 点击通知栏打开消息,记录"App 点击通知"事件
[AnalysysAgent trackCampaign:userInfo isClick:YES userCallback:^(id campaignInfo) {
NSLog(@"此处可根据需要处理数据 : %@",campaignInfo);
}];
}
}
```
- 产品简介
- 快速上手
- Step 1 安装部署
- Step 2 激活系统创建项目
- Step 3 开启您的分析旅程
- 1. 集成 SDK
- 2. 可视化埋点
- 3. 创建分析模型
- 附:埋点方案设计
- 附:数据分析思路
- 产品更新日志
- V5.5 新增LTV分析功能等
- V5.3 UI 升级、分布分析重构、维度表动态更新、细节优化等
- V5.2 新增归因分析、消息中心、重构埋点方案、优化看数据体验……
- V5.1.0317 体验优化& Bug修复
- V5.1 升级可视化埋点、增强权限控制……
- Part I 产品功能说明
- 名词解释
- 指标说明
- 看板
- 5.3.3 看板 UI 重构
- 分析
- 事件分析
- 渠道分析
- 渠道相关名词解释
- 来源识别规则
- 搜索引擎
- 社交媒体
- 小程序场景值
- Session 分析
- Session 规则
- 实时分析
- 留存分析
- 转化漏斗
- 智能路径
- 归因分析
- 热图分析
- Web/H5 热图
- APP 热图
- 分布分析
- 间隔分析
- 属性分析
- LTV 分析
- 多主体分析
- 自定义查询
- 用户
- 用户分群
- 用户探查
- 用户标签
- 标签体系应用概览
- 标签体系
- 标签生命周期管理
- 标签加工
- 如何自定义SQL创建标签
- 单用户档案
- 运营
- 广告跟踪
- 微信小程序渠道追踪
- 预置广告媒介和渠道
- App 推广监测(Beta版本)
- 电子邮件(即将下线)
- 短信(即将下线)
- 消息通知(即将下线)
- 项目管理
- 项目概览
- 项目角色管理
- 项目成员管理
- 数据接入管理
- 埋点方案
- 可视化埋点
- 集成SDK接入数据
- 数据验证
- 用户数据导入
- 微信小程序全埋点事件定义
- 元数据管理
- 元事件
- 虚拟事件
- 事件属性
- 用户属性
- Session 管理
- 页面组管理
- 维度表
- 服务集成配置
- 监控告警
- 智能监控
- 自定义监控
- 平台管理
- 企业概览
- 项目管理
- 成员管理
- 安全设置
- 企业设置
- 日志管理
- 帐号设置
- Part II 技术文档
- 技术接入准备工作
- 部署环境检测工具
- 数据模型
- 数据格式
- 预置事件和属性
- App预置事件/属性
- JS 预置事件/属性
- 如何准确识别用户
- 如何设计埋点方案
- 分平台上报数据 vs 跨平台打通
- SDK 指南
- Android SDK
- 快速集成
- 全埋点模块
- 消息推送模块
- Android Hybrid模式
- SDK Gradle集成方式
- 多渠道打包
- 易观小工具
- 合规相关
- iOS SDK
- 快速集成
- 全埋点介绍
- iOS Hybrid模式
- 消息推送模块
- JS SDK
- 快速集成
- JS SDK基础版
- JS SDK插件
- uni-app SDK
- 快速集成
- 打包原生APP
- 开启移动端全埋点
- uni-app SDK标准版
- 微信小程序 SDK
- 快速集成
- 微信小程序标准版
- 微信小程序插件版
- 微信小程序通用框架版
- 支付宝小程序 SDK
- 支付宝小程序标准版
- 支付宝小程序通用框架版
- 字节跳动小程序 SDK
- 字节跳动小程序标准版
- 字节跳动小程序通用框架版
- 百度小程序 SDK
- 百度小程序标准版
- 百度小程序通用框架版
- 钉钉小程序 SDK
- 钉钉小程序标准版
- 钉钉小程序通用框架版
- QQ小程序 SDK
- QQ小程序标准版
- QQ小程序通用框架版
- 快应用 SDK
- 华为WeCode小程序
- WeCode SDK 标准版
- WeCode SDK插件
- PhoneGap SDK
- mPaaS SDK
- ReactNative SDK
- Flutter SDK
- Java SDK
- Python SDK
- PHP SDK
- C++ SDK
- C# SDK
- Node JS SDK
- Lua SDK
- Golang SDK
- SDK FAQ
- identify与alias的区别
- 爬虫数据如何识别?
- 页面停留如何获取时间?
- 如果获取SDK及更新日志
- 代码埋点和无埋点有什么区别
- Web页面中发现丢失某一个事件
- 自研 SDK 注意事项
- 页面时长统计功能
- 飞书小程序 SDK
- 飞书小程序标准版
- 飞书小程序通用框架版
- Unreal Engine SDK
- 数据验证
- 客户端埋点验证
- Debug 数据验证
- 数据入库验证
- 数据导入
- 接口导入
- JAVA工具包
- 标准json文件导入
- csv格式导入
- 数据导入FAQ
- 数据导出
- JAVA工具包
- 事件数据导出
- 用户数据导出
- 直接从Kafka中消费数据
- 使用程序访问数据库
- 脚本工具
- API
- 分析API
- 事件分析
- 留存分析
- 自定义查询
- 转化漏斗
- 属性分析
- Session分析
- 渠道分析
- 分布分析
- 用户API
- 分群查询
- 用户档案
- 分群管理
- 管理API
- 权限管理
- 元数据管理
- 埋点方案管理
- 维度表管理
- 运营API
- 广告跟踪
- APP推广监测
- 平台管理API
- 项目管理
- 成员管理
- 第三方登录
- OAuth2.0登录
- LDAP登录
- GDPR 合规
- Part III 常见问题
- License 许可
- 产品试用及采购
- 参与贡献