有语音播报相关需求现不建议使用该方式,可移步iOS 收款推送消息语音播报
注:静默推送苹果是不保证真正到达率的,后台成功只是消息已到达苹果服务器!!!
【开发背景】
公司做的第三方支付,App是B端使用的,需要在收款后获得语音播报,之前使用普通推送的广播方式,iPhone无法在锁屏状态下获得语音播报,查询相关资料后我选择了静默推送(也叫推送唤醒,远程推送通知,Silent Remote Notification)。
【优点】可在锁屏状态下获得语音播报,无需任何操作。
【缺点】收到推送之后没有提示声音,没有通知栏提醒。
因此我的项目中采用了双推送策略,即使用静默推送获取语音播报,使用普通推送获取提示声音和通知栏提醒。
1、静默推送需要在推送后台改变传参的方式:
{
"appkey":"your appkey",
"production_mode":"false",
"timestamp":1474340669558,
"device_tokens":"your devicetoken",
"type":"unicast",
"payload":{
"aps":{
"content-available" : 1
}
"yourInfo" : ...
}
}
【注意】
1)需要在didRegisterForRemoteNotificationsWithDeviceToken:里面获取token并传给Server;
2)production_mode为true是推送正式环境,false为测试环境;
3)content-available静默推送必须为1!!!
4)yourInfo是你自定义的一些参数,比如交易信息,也就是语音播报的内容。
这里第一行不勾上,普通推送没有声音,没有声音,没有声音!!!
Background Fetch,如果不需要在后台播放音频文件,最好关掉,否则苹果霸霸会打回的!!!
最后附上语音播报的相关代码(网上很多包括友盟官方文档说如果实现了didReceiveRemoteNotification:fetchCompletionHandler:方法,performFetchWithCompletionHandler:方法不会再被调用,但是我注掉该方法后,静默推送就无法收到)
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
// 若发现无法收到deviceToken,可以加上此方法
[application registerForRemoteNotifications];
}
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
// 系统会根据UIBackgroundFetchResult来判断后台处理的有效性,如果后台处理效率较低,会延迟发送后台推送通知
completionHandler (UIBackgroundFetchResultNewData);
}
/**
* 已经接收到后台远程通知后调用
*
* @param application 应用对象
* @param userInfo 推送信息
* @param completionHandler 完成回调
*/
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
NSDictionary *info = [self dictionaryWithUserInfo:userInfo];
if (!info || info.count <= 0) {
return;
}
// 这里添加语音播报的内容
...
// 系统会根据UIBackgroundFetchResult来判断后台处理的有效性,如果后台处理效率较低,会延迟发送后台推送通知
completionHandler(UIBackgroundFetchResultNewData);
}