之前做这块内容时,查阅了很多博客,实现过程中做过很多坑,希望记录下来帮助更多的开发者避免踩坑,白白浪费大好时光。
需求
1. 收到推送消息播放音频,支持合成;
2. 离线:用户未打开APP或者杀死程序,可接收推送消息;
3. 息屏:用户启动APP在锁屏状态下,可接收推送消息;
4. 是语音播报消息时,不展示推送弹窗;
前期准备
1.配置证书
创建项目的推送证书、APP Groups(语音文件数据共享);
2.友盟集成
集成友盟推送(或者极光推送)本文使用的是友盟推送;
3.项目中配置
a.主程序配置如图

b扩展服务配置如图

4.重点配置友盟推送消息
a.payload 消息JSON结构
{
"aps" : {
"alert" : {
"title" : "Game Request", // 标题
"body" : "Bob wants to play poker", //内容
},
"badge" : 5, //角标
"sound" : "binggo.caf", //声音
"content-available" : 1,
"mutable-content" : 1, //一定要配置,否则扩展收不到消息
},
}
b. 测试友盟推送时一定要带配置"mutable-content" : 1 ,并且位置一定要写对;

友盟语音播报推送消息一定要配置在内容链接那个位置,否则UNNotificationServiceExtension收不到推送消息;
语音播报功能实现
1. 注册通知及获取设备号
AppDelegate.m 文件
///设备号获取
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
// 友盟注册推送
[UMessage registerDeviceToken:deviceToken];
[UMessage setBadgeClear:NO];
//Xcode11打的包,iOS13获取Token有变化
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 13) {
if (![deviceToken isKindOfClass:[NSData class]]) {
//记录获取token失败的描述
return;
}
const unsigned *tokenBytes = (const unsigned *)[deviceToken bytes];
NSString *strToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
ZFLog(@"deviceToken= %@", strToken);
[ZFDevice Instance].device = strToken;
if (strToken.length==64) {
[ZFUserDefaults setObject:strToken forKey:kPHONE_DEVICE_TOKEN];
[ZFUserDefaults synchronize];
}
} else {
NSString *token = [NSString
stringWithFormat:@"%@",deviceToken];
token = [token stringByReplacingOccurrencesOf

本文详细介绍了在iOS应用中实现推送消息接收,包括音频播放、语音播报功能,涉及友盟推送集成、NotificationServiceExtension配置以及处理不同场景下的消息接收。同时,指出了关键配置和测试要点。
最低0.47元/天 解锁文章
1415

被折叠的 条评论
为什么被折叠?



