美文网首页收藏ios
iOS-总结后台语音播报遇到的一些坑

iOS-总结后台语音播报遇到的一些坑

作者: 雪落倾城 | 来源:发表于2018-04-12 18:41 被阅读2001次

先说下自己做的项目需求:
其实需求比较简单,就是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⊙)

相关文章

  • iOS-总结后台语音播报遇到的一些坑

    先说下自己做的项目需求:其实需求比较简单,就是app在收款到账时候能够像支付宝、微信一样能够有语音提示:支付宝收款...

  • 功能博客整理

    1.类似支付宝后台语音播报 ``` http://lumengru.com/2017/06/23/iOS-%E5%...

  • iOS-后台语音播报

    公司要求需要做一个类似支付宝的收款的语音播报功能,研究了一天才完成,记录下来 写在前面 语音播报功能的实现必须是推...

  • 2018-08-04

    基于百度语音的后台播放功能 1.本月在处理iOS的后台语音问题时,遇到了一些坑,特将此分享出来,避免大家再次入坑。...

  • 语音后台播报的使用坑点

    需要配置的东西就不说了后台语音能放出来的关键点代码

  • iOS远程推送和本地推送总结

    因为得到一个新功能:在前台,后台,和锁屏状态下,得到后台通知时语音播报,查阅一些资料并作出总结。为了方便理解以下内...

  • 实现循环语音识别、合成简单封装

    实现循环语音识别、合成简单封装 需求背景 最近项目上遇到一个需求:语音识别获取文字后后台交互获取结果并语音合成播报...

  • swift 语音播报、后台播报、后台控制

    需求 生活中比较流行的语音播报有:微信支付到账提醒,电子书阅读听书等等广泛的运用。苹果于iOS7.0推出了Spee...

  • 后台推送-语音播报

    语音播报功能的实现必须是推送加语音合成,选择的推送是极光推送,本文最终实现的效果即使APP被杀死也可以进行语音播报...

  • 接入极光推送实现前台语音播报后台锁屏自定义消息并适配版本

    接入极光推送实现前台语音播报后台锁屏自定义消息并适配版本 1.首先实现语音播报,请看我的iOS 文字转语音的三种方...

网友评论

    本文标题:iOS-总结后台语音播报遇到的一些坑

    本文链接:https://www.haomeiwen.com/subject/ngsfkftx.html