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 

@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⊙)

你可能感兴趣的:(iOS-总结后台语音播报遇到的一些坑)