iOS-总结后台语音播报遇到的一些坑
先说下自己做的项目需求:
其实需求比较简单,就是app在收款到账时候能够像支付宝、微信一样能够有语音提示:支付宝收款到账XX元
做出这个功能很简单,而且方案也比较多,但是遇到的问题很多,最大的难处就是上架到App Store时候一直被拒绝
然后是参考文章链接
文章1:https://www.jianshu.com/p/c06133d576e4
文章2:http://www.cnblogs.com/bigant9527/p/6144292.html?utm_source=tuicool&utm_medium=referral
方案一:按照参考文章1的方式(注意:后台推送一定要加以下字段)
"content-available" = 1
在收到推送消息的方法里面使用AVFoundation 中的AVSpeechSynthesizer来合成语音播报就可以了
问题:
1.功能问题:
这种方式只能在程序运行在前台、在后台时候播报,程序退出后不会语音播报
2.上架问题:
而且必须在Info.plist中的Background Modes中勾选Audio,AirPlay,and Picture in Picture
这样上架时候苹果会认为你的应用并不是语音类(如音乐播放器),所以会被拒绝
【我看到不少项目是已经在Info.plist中的Background Modes勾选过Audio相关,如果功能也能满足的话基本可以OK】
方案二:使用VoIP Push实现
需要在开发者账号里面去用制作VoIP Push证书,VoIP Push与普通的推送证书不同,可以直接百度搜一下
问题:
1.功能问题:
程序运行在前台、在后台时候播报,程序退出后会不会语音播报我还没有测试
2.上架问题:
而且必须在Info.plist中的Background Modes中添加VoIP Push
同样会在上架时候被拒
方案三:使用Notification Service Extension实现
推荐使用,实现方案可以直接百度搜到很多
但是在此也遇到了一个坑就是在Notification Service Extension中的方法中打断点调试,在应用收到推送消息时候好像断点并不生效,而实际上方法是通的,也就是说能够语音播报
#import "NotificationService.h"
#import <AVFoundation/AVFoundation.h>
@interface NotificationService ()
@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
@property (nonatomic, strong) AVSpeechSynthesizer *synth;
@property (nonatomic, strong) AVSpeechUtterance *utterance;
@end
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
// Modify the notification content here...
//self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
NSString *contentString = self.bestAttemptContent.body;
if (contentString != nil) {
[self speechWithString:contentString];
}
self.contentHandler(self.bestAttemptContent);
}
- (void)serviceExtensionTimeWillExpire {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
self.contentHandler(self.bestAttemptContent);
}
// 语音播报
- (void)speechWithString:(NSString *)contentString {
self.utterance = [AVSpeechUtterance speechUtteranceWithString:contentString];
self.utterance.volume = 1.0f; //设置音量
self.utterance.rate = AVSpeechUtteranceDefaultSpeechRate; //设置语速
self.utterance.pitchMultiplier = 1; //设置语调
AVSpeechSynthesisVoice *voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];
self.utterance.voice = voice;
self.synth = [[AVSpeechSynthesizer alloc] init];
[self.synth speakUtterance:self.utterance];
}
问题:缺陷就是只能在iOS10才有效。
在做类似功能遇到的问题欢迎一起探讨(⊙o⊙)