iOS之“您有新的订单,请及时处理”

此文只适用于主动调用或者推送消息过来的时候APP在前台运行状态,想要APP后台播放应该使用一个可能被拒的手段。
这个星期在开发公司APP的V1.2版本,这个版本中有个需求是要加入语音合成,下面简称为TTS,配合着之前的极光推送,就能得到饿了吗,美团等外卖平台的 【您有新的订单,请及时处理】推送+语音效果。
这边说明一下,推送是用的极光,TTS原本打算是用阿里云的,但后来CTO说阿里云的目前不稳定,还在测试,所以还是用了老牌 ---科大讯飞TTS,看着官方文档做环境集成,然后Xcode代码基本没啥问题,但它官方给的demo除了给了TTS的还有其他很多的东西,所以我这边只把语音合成的部分提出来。

一、集成流程看这里

二 代码部分

当你把环境都配置好后,由于是整个项目只要有推送就得语音合成,所以与官方给的SDK Demo不同,需要写在APPDelegate中,

1.在 .m 文件中导入相关文件

//讯飞TTS
#import "iflyMSC/IFlyMSC.h"
#import "Definition.h"
#import "iflyMSC/iflyMSC.h"
#import 
#import 
#import 
#import 

并且 遵循代理,创建语音合成的对象

@interface AppDelegate ()
@property (nonatomic, strong) IFlySpeechSynthesizer * iFlySpeechSynthesizer;
@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//讯飞TTS

    
    [self initSynthesizer];//初始化TTS语音

    //设置sdk的log等级,log保存在下面设置的工作路径中
    [IFlySetting setLogFile:LVL_ALL];//LVL_ALL表示全部日志打印
    
    //打开输出在console的log开关
    [IFlySetting showLogcat:YES];
    
    //创建语音配置,appid必须要传入,仅执行一次则可
    NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",APPID_VALUE];
    
    //所有服务启动前,需要确保执行createUtility
    [IFlySpeechUtility createUtility:initString];
    
    return YES;
}

初始化TTS类对象

- (void)initSynthesizer
{
    //合成服务单例
    if (_iFlySpeechSynthesizer == nil) {
        _iFlySpeechSynthesizer = [IFlySpeechSynthesizer sharedInstance];
    }
    _iFlySpeechSynthesizer.delegate = self;
    
    //设置语速1-100
    [_iFlySpeechSynthesizer setParameter:@"50" forKey:[IFlySpeechConstant SPEED]];
    
    //设置音量1-100
    [_iFlySpeechSynthesizer setParameter:@"80" forKey:[IFlySpeechConstant VOLUME]];
    
    //设置音调1-100
    [_iFlySpeechSynthesizer setParameter:@"50" forKey:[IFlySpeechConstant PITCH]];
    
    //设置采样率
    [_iFlySpeechSynthesizer setParameter:@"16000" forKey:[IFlySpeechConstant SAMPLE_RATE]];
    
    //设置发音人 有很多,可见文档中自己挑选哦
    [_iFlySpeechSynthesizer setParameter:@"xiaoyan" forKey:[IFlySpeechConstant VOICE_NAME]];
    
    //设置文本编码格式
    [_iFlySpeechSynthesizer setParameter:@"unicode" forKey:[IFlySpeechConstant TEXT_ENCODING]];
    
}

3.在极光推送的代理方法中实现语音前的文本处理,

需要注意的点:极光推送这边有两个回调,一个是willPresentNotification,另一个是didReceiveNotificationResponse,两个区别在于,前者是有推送时实时语音,后者是有推送时点击了才会触发,我们的需求当然是写在前者里啦!
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {

    NSDictionary * userInfo = notification.request.content.userInfo;
    

    //这边一般是语音播报极光回调信息中的文本,我这边是写死的一句话

    NSString *str = @"您有新的订单,请及时处理"
    [_iFlySpeechSynthesizer startSpeaking:str];

    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
    }
    completionHandler(UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置
}

4.网上有资料说语音合成的回调必须也写上,否则无法实现语音合成(具体也没去证实过),但这些回调里你可以啥都不用写

- (void)onSpeakBegin
{
  
}
-(void)onBufferProgress:(int)progress message:(NSString *)msg
{
    NSLog(@"bufferProgress:%d,message:%@",progress,msg);
}
-(void)onSpeakProgress:(int)
progress
{
    NSLog(@"playprogress:%d",progress);
}
-(void)onSpeakPaused
{
    
}
-(void)onSpeakResumed
{
    
}
-(void)onCompleted:(IFlySpeechError *) error
{
    
}

好了,TTS就是这么简单,上面列了几个注意的点千万别漏了,快去让你的APP说话吧。当然,也不是一定要配合推送,自己写个小demo点击按钮触发也是可以的哦。

以上!

你可能感兴趣的:(iOS之“您有新的订单,请及时处理”)