做 iOS 开发已经有4年多了,推送是每一个应用必不可少的功能。虽然本人总是在 app 弹出推送权限时下意识的就点了不允许,但是作为产品运营的必备技能,推送功能是每款产品必加的需求。
最开始使用极光推送是两三年前了。从一开始的极光推送,到后来的极光统计、极光认证,集成极光的产品越来越多,也越来越信任极光的服务,哈哈哈(有点打广告的嫌疑,不过极光产品确实走心)。。。
本文只针对极光推送这个sdk说明下自己使用的心得,其他sdk之后有机会再做介绍,哈哈!
推送集成
要集成极光推送比较重要的两点就是证书和sdk集成了,极光推送文档说明的可以说非常详细了,这里我就不再赘述。
推送统计
关于推送的统计,一个是消息点击统计,另一个是消息送达统计(都是针对APNs通知,应用内消息暂时好像没有提供统计功能)。
基于消息统计功能,我们就可以更好的分析用户偏好,做好app的运营啦。
消息点击统计
收到 APNs 消息,我们需要在代理方法中调用极光的 handleRemoteNotification:
方法,极光内部会为我们统计消息点击数,可以说是非常方便了。
//系统的代理方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
// Required, iOS 7 Support
[JPUSHService handleRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
// Required, For systems with less than or equal to iOS 6
[JPUSHService handleRemoteNotification:userInfo];
}
//极光的代理方法
// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
// Required
NSDictionary * userInfo = notification.request.content.userInfo;
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
}
completionHandler(UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有 Badge、Sound、Alert 三种类型可以选择设置
}
// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
// Required
NSDictionary * userInfo = response.notification.request.content.userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
}
completionHandler(); // 系统要求执行这个方法
}
点击数据在推送之后,刷新一下就可以直接看到消息详情里面已经统计到了呢
1.点击统计.png
消息送达统计
在 iOS 10系统之后,极光新推出的一项送达统计功能。依赖于 Notification service extension 功能。这个功能主要是让 iOS 的通知增加了富媒体的展示,比如图片、音频、视频都可以放在我们的通知里面,推送到用户的设备。极光借助这个功能,实现了消息送达的统计。
这是一个新的sdk, jpush-extension-ios-xxx.a
,具体集成参考[统计送达集成]
(https://docs.jiguang.cn/jpush/client/iOS/ios_guide_new/#_9)。
需要注意的是,这个sdk 需要添加到 service extension target 下,不然的话可能会跟JPush sdk 冲突。
3.静态库添加.png
集成完成之后,推送的时候需要增加一个字段mutable-content: true
才可以调用到我们的 service extension 功能, 就可以统计到通知的送达数据了。这一点在集成文档里面有特别说明。
iOS 10 新增的 Notification Service Extension 功能,用 mutable-content 字段来控制。
若使用 Web 控制台,需勾选 “可选设置”中 mutable-content 选项;若使用 RESTFul API 需设置 mutable-content 字段为 true。
送达数据统计可以到极光后台查询
4.送达统计.png
测试发现,应用杀死的状态下,送达也可以被统计到的。
推送遇到的坑
token 获取问题
在JPush 3.0.8 之前注册登录极光都需要依赖device token, 如果 token 没有获取到,就没有办法初始化,然后推送的功能都用不了。测试的时候发现弹出请求通知权限框的时候,我点不允许,有的设备可以拿到token, 有的不能。。。按道理,点击不允许通知不就是不允许推送吗?那token应该都获取不到才对呀。
后来测试发现,iOS 10 之后,如果勾选了background mode
的 remote notifications
, 不管是否允许通知,苹果都会返回 token 给你。
富媒体推送展示不了图片
在iOS 10 推出了富媒体推送之后,我也参照极光demo里面试了一下推送图片功能,代码完成之后推送消息,title 确实按照我的逻辑改好了,但是图片没有显示,emmmm。。。是不是我找的图片有问题,然后又更换一个图片链接来发送,哎,还是展示不出来图片。
然后我就拖入一个本地图片到工程文件中,直接在extension里面修改通知附件为本地图片,没毛病,可以展示!!!
那问题是出在 extension 网络请求部分了吗?我又找了好多链接,有的链接可以展示,有的不能,分析了一下发现 https 的链接可以展示,http 的展示不了,原来确实是网络请求的原因。设置了extension target 的 info.plist 终于都可以收到了。(不过因为图片大小有限制,最好不好找太大的图片啦)
6.ATS 设置.png
这里关于图片不显示的问题,我自己总结了几条一点排查经验:
- 有没有设置mutable-content
- 图片链接如果不是https 的,记得service extension 也需要加上ATS处理
- 检查你推送的时候的附加字段,跟你代码解析附加字段是不是一样的(so fool)
生产环境收不到推送
开发环境测试推送,都没有问题。 但是打包之后就发现收不到了。。。
最后发现是自己在推送的时候环境搞错了,服了自己。
一般遇到推送相关的问题,我都回到极光社区先搜索一波儿, 毕竟使用极光推送的小伙伴那么多,我碰到的问题说不定别人也遇到了呢。很多常见的问题基本上都可以找到答案。 在这里也要感谢极光社区的小伙伴在我咨询问题的时候积极的反馈,让我在开发过程中省去了不少烦恼。
小结
以上零零散散的记录了我使用极光推送的一点心得,有问题欢迎交流~
在此也祝愿极光越来越好!
本文为极光征文参赛文章
网友评论