公司需求,实现类似支付宝一样的后台语音播报功能,之前用Notification Server Extension写的.现在用Apple 的Voip重现实现了一下,目前是前台的时候可以播报,缩进后台或者杀掉进程之后只能收到通知,不能播放语音了,这个明天优化,测试ok之后再发demo!
星爷镇楼第一步:创建voip证书
第二部:打开Xcode后台模式的voip权限
第三步:证书合成等待使用
制作.pem格式证书
1、将之前生成的voip.cer SSL证书双击导入钥匙串
2、打开钥匙串访问,在证书中找到对应voip.cer生成的证书,右键导出并选择.p12格式,这里我们命名为voippush.p12,这里导出需要输入密码(随意输入,别忘记了)。
3、目前我们有两个文件,voip.cer SSL证书和voippush.p12私钥,新建文件夹命名为VoIP、并保存两个文件到VoIP文件夹。
4、把.cer的SSL证书转换为.pem文件,打开终端命令行cd到VoIP文件夹、执行以下命令
openssl x509 -in voip.cer -inform der -out VoiPCert.pem
5、把.p12私钥转换成.pem文件,执行以下命令(这里需要输入之前导出设置的密码)
openssl pkcs12 -nocerts -out VoIPKey.pem -in voippush.p12
6、再把生成的两个.pem整合到一个.pem文件中
cat VoiPCert.pem VoIPKey.pem > ck.pem
最终生成的ck.pem文件一般就是服务器用来推送的。
第四步:写代码
注意点:
1.导入PushKit框架
2.遵守PKPushRegistryDelegate
3.发送的token是PKPushRegistry记录的token,不再是推送的token,加粗表示重要
- (void)initPushkit{
PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
pushRegistry.delegate=self;
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
//ios10注册本地通知
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
[self registerUserNotificationCenter];
}
}
- (void)registerUserNotificationCenter {
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
//iOS10特有
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
// 必须写代理,不然无法监听通知的接收与点击
[centerrequestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if(granted) {
// 点击允许
NSLog(@"注册成功");
[centergetNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
NSLog(@"%@", settings);
}];
}else{
// 点击不允许
NSLog(@"注册失败");
}
}];
}
}
//应用启动此代理方法会返回设备Token 、一般在此将token上传服务器
- (void)pushRegistry:(PKPushRegistry*)registry didUpdatePushCredentials:(PKPushCredentials*)credentials forType:(NSString*)type{
NSLog(@"应用启动此代理方法会返回设备Token 、一般在此将token上传服务器");
NSString * token = [[[[credentials.token description] stringByReplacingOccurrencesOfString:@"<" withString:@""] stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""];
// self.clientId = token;//[token stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"token=%@",token);
}
//当VoIP推送过来会调用此方法,一般在这里调起本地通知实现连续响铃、接收视频呼叫请求等操作
- (void)pushRegistry:(PKPushRegistry*)registry didReceiveIncomingPushWithPayload:(PKPushPayload*)payload forType:(NSString*)type {
NSLog(@"当VoIP推送过来会调用此方法,一般在这里调起本地通知实现连续响铃、接收视频呼叫请求等操作");
[self showLocalNotification:payload.dictionaryPayload];
[selfaddOperation:@"XXX收款100.99元"sound_type:@""];
}
/**
当APP收到呼叫、处于后台时调用、用来处理通知栏类型和铃声。
*/
- (void)showLocalNotification:(NSDictionary*)userInfo {
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.body = [NSString localizedUserNotificationStringForKey:@"您的账户收到一笔巨款" arguments:nil];
UNNotificationSound *customSound = [UNNotificationSound defaultSound];
content.sound= customSound;
UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger
triggerWithTimeInterval:1repeats:NO];
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"voippush"
content:contenttrigger:trigger];
[centeraddNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
}];
}else{
UILocalNotification *callNotification = [[UILocalNotification alloc] init];
callNotification.alertBody= [NSString
stringWithFormat:@"您的账户收到一笔巨款"];
callNotification.soundName=@"default";
[[UIApplication sharedApplication]
presentLocalNotificationNow:callNotification];
}
}
直接粘贴到AppDelegate里面!
第五步:发送通知消息!
注意:PHP文件要和合成的pem证书放到一起,当然你自己配置路径也可以!
圈出来的是要修改的!
php文件链接:PHP文件
到此结束!!!
感谢博主:https://www.laileshuo.com/2019/05/13/ios-通过voip-push实现语音播报/
感谢网上认识的小伙伴!
鄙视不安慰我失恋❤️的SB室友们!
网友评论