iOS远程推送自定义语音合成播放声音(类似支付宝收款提醒)

从收款语音播报到订单提醒:UniApp消息语音的6种商业场景实现 本文深度解析了在UniApp中实现语音消息通知的完整技术方案与商业应用。文章详细阐述了如何利用UniPush与原生插件,构建高可用的动态语音播报模块,并重点探讨了其在零售收款、外卖接单、物流仓储、智能家居、服务叫号及多媒体播报等六大核心商业场景中的落地实践,为开发者提供了从技术选型到性能优化的全链路指南。 阅读详情

本文参考文章 iOS 模仿支付宝支付到账推送,播报钱数,看上面写的一些不是很详细遇到了许多问题,这里特意自己总结了一下。将我遇到的问题以及解决方案给罗列出来供大家参考。

iOS10之后的ServiceExtends,如果不是很清楚可以自行百度或者浏览一下iOS10 推送extension之 Service Extension

首先创建一个工程:

打开推送通知注册接受

Background Modes内部的第一个我看有的demo是有够选的,我这这里没有勾选,通知是同样能够收到并且在后台播放的。那么为了不必要的麻烦这里就不勾选了。

 

然后我们创建通知扩展,通知的扩展能够为我们的app即使在被杀死的情况下也能唤醒30s左右的时间来供我们的app进行语音播报。

这句话的大概意思就是告诉你去激活它,然后在toolbar上面可以选择使用它,我们点击Activate按钮就可以了。

然后你就会发现你的项目工程里面多了一个文件夹,就是你刚才你创建的推送扩展。

然后我们在AppDelegate里面进行通知的注册。

代码如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
     [self registerRemoteNotification];
    return YES;
}
// 注册推送
- (void)registerRemoteNotification{
    UIApplication *application = [UIApplication sharedApplication];
    application.applicationIconBadgeNumber = 0;
    
    if([application respondsToSelector:@selector(registerUserNotificationSettings:)])
    {
        UIUserNotificationType notificationTypes = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:notificationTypes categories:nil];
        [application registerUserNotificationSettings:settings];
    }
    
#if !TARGET_IPHONE_SIMULATOR
    //iOS8 注册APNS
    if ([application respondsToSelector:@selector(registerForRemoteNotifications)]) {
        [application registerForRemoteNotifications];
    }else{
        UIRemoteNotificationType notificationTypes = UIRemoteNotificationTypeBadge |
        UIRemoteNotificationTypeSound |
        UIRemoteNotificationTypeAlert;
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:notificationTypes];
    }
#endif
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSString *token = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<" withString:@""] stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""];
    [UIPasteboard generalPasteboard].string =token;
    
    
    NSLog(@"device token is %@",token);
    
    
}

然后就等之后的推送消息在AppDelegate里面的方法里面接收通知:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo
{
    NSLog(@"userInfo ===== %@",userInfo);
}


- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"userInfo === %@",userInfo);
}

另外介绍两个本不属于这个专项的相关问题:Safa Area报错记得勾选去掉

我们在拖入声音文件的时候会有以下提示,这个时候我们的通常做法可以是全部都勾选,(这样做其实是为了方便对iOS10一下声音文件获取),其实对我们iOS10的扩展,我们可以只勾选扩展,因为文件只是在扩展里面才使用。这里作简要的说明一下。

然后就是加入工程的声音文件如下图:

然后我们在NotificationService.m文件内写入我们的声音文件合成代码。并播放声音文件的代码。

代码如下:(亲测通过,没有问题)

#import "NotificationService.h"
#import <AVFoundation/AVFoundation.h>

#define kFileManager [NSFileManager defaultManager]

typedef void(^PlayVoiceBlock)(void);

@interface NotificationService ()<AVAudioPlayerDelegate>

@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
//声音文件的播放器
@property (nonatomic, strong)AVAudioPlayer *myPlayer;
//声音文件的路径
@property (nonatomic, strong) NSString *filePath;

// 语音合成完毕之后,使用 AVAudioPlayer 播放
@property (nonatomic, copy)PlayVoiceBlock aVAudioPlayerFinshBlock;

@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];
    
    __weak __typeof(self)weakSelf = self;
    
    /*******************************推荐用法*******************************************/
    
    // 方法3,语音合成,使用AVAudioPlayer播放,成功
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setActive:YES error:nil];
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    
    [self hechengVoiceAVAudioPlayerWithFinshBlock:^{
        weakSelf.contentHandler(weakSelf.bestAttemptContent);
    }];
//    self.contentHandler(self.bestAttemptContent);
}

#pragma mark- 合成音频使用 AVAudioPlayer 播放
- (void)hechengVoiceAVAudioPlayerWithFinshBlock:(PlayVoiceBlock )block
{
    if (block) {
        self.aVAudioPlayerFinshBlock = block;
    }
    
    /************************合成音频并播放*****************************/
    
    AVMutableComposition *composition = [AVMutableComposition composition];
    
    NSArray *fileNameArray = @[@"daozhang",@"1",@"2",@"3",@"4",@"5",@"6",@"1",@"2",@"3",@"4",@"5",@"6",@"1",@"2",@"3",@"4",@"5",@"6"];
    
    CMTime allTime = kCMTimeZero;
    
    for (NSInteger i = 0; i < fileNameArray.count; i++) {
        NSString *auidoPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",fileNameArray[i]] ofType:@"m4a"];
        
        AVURLAsset *audioAsset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:auidoPath]];
        
        // 音频轨道
        AVMutableCompositionTrack *audioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0];
        // 音频素材轨道
        AVAssetTrack *audioAssetTrack = [[audioAsset tracksWithMediaType:AVMediaTypeAudio] firstObject];
        
        // 音频合并 - 插入音轨文件
        [audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) ofTrack:audioAssetTrack atTime:allTime error:nil];
        
        // 更新当前的位置
        allTime = CMTimeAdd(allTime, audioAsset.duration);
        
    }
    
    // 合并后的文件导出 - `presetName`要和之后的`session.outputFileType`相对应。
    AVAssetExportSession *session = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetAppleM4A];
    NSString *outPutFilePath = [[self.filePath stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"xindong.m4a"];
    
    if ([[NSFileManager defaultManager] fileExistsAtPath:outPutFilePath]) {
        [[NSFileManager defaultManager] removeItemAtPath:outPutFilePath error:nil];
    }
    
    // 查看当前session支持的fileType类型
    NSLog(@"---%@",[session supportedFileTypes]);
    session.outputURL = [NSURL fileURLWithPath:outPutFilePath];
    session.outputFileType = AVFileTypeAppleM4A; //与上述的`present`相对应
    session.shouldOptimizeForNetworkUse = YES;   //优化网络
    
    [session exportAsynchronouslyWithCompletionHandler:^{
        if (session.status == AVAssetExportSessionStatusCompleted) {
            NSLog(@"合并成功----%@", outPutFilePath);
            
            NSURL *url = [NSURL fileURLWithPath:outPutFilePath];
            
            self.myPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
            
            self.myPlayer.delegate = self;
            [self.myPlayer play];
            
            
        } else {
            // 其他情况, 具体请看这里`AVAssetExportSessionStatus`.
            // 播放失败
            self.aVAudioPlayerFinshBlock();
        }
    }];
    
    /************************合成音频并播放*****************************/
}
#pragma mark- AVAudioPlayerDelegate
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    if (self.aVAudioPlayerFinshBlock) {
        self.aVAudioPlayerFinshBlock();
    }
}

- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer*)player error:(NSError *)error{
    //解码错误执行的动作
}
- (void)audioPlayerBeginInteruption:(AVAudioPlayer*)player{
    //处理中断的代码
}
- (void)audioPlayerEndInteruption:(AVAudioPlayer*)player{
    //处理中断结束的代码
}


- (NSString *)filePath {
    if (!_filePath) {
        _filePath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
        NSString *folderName = [_filePath stringByAppendingPathComponent:@"MergeAudio"];
        BOOL isCreateSuccess = [kFileManager createDirectoryAtPath:folderName withIntermediateDirectories:YES attributes:nil error:nil];
        if (isCreateSuccess) _filePath = [folderName stringByAppendingPathComponent:@"xindong.m4a"];
    }
    return _filePath;
}
- (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);
}

当然播放声音也可以使用我们苹果系统的开放库AVSpeechSynthesisVoice

使用AVSpeechSynthesisVoice *voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];创建嗓音

 

// 创建语音合成器

    synthesizer = [[AVSpeechSynthesizer alloc] init];

    synthesizer.delegate = self;

    

    // 实例化发声的对象

    AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:content];

    utterance.voice = voice;

    utterance.rate = 0.5; // 语速

    

    // 朗读的内容

    [synthesizer speakUtterance:utterance];

来实现朗读声音的播放

 

接下来,我们开始运行我们的代码开始体验我们的结果:

1.我们要选中我们的扩展scheme

然后选中我们的运行的app

接下来就是需要通过推送进行消息的检测的时刻了。

这里推荐一款测试软件SmartPush推送测试工具:(奉上链接地址:SmartPush)

运行然后选择我们的对应的推送证书,设备token

然后我们如果测试在后台推送的数据消息,那么需要多加上字段:"mutable-content":1,

例如:{
  "aps":{
    "alert":{
      "title":"iOS 10 title",
      "subtitle":"iOS 10 subtitle",
      "body":"iOS 10 body"
    },
     "mutable-content":1,
    "category":"saySomethingCategory",
    "sound":"default",
    "badge":3
  }

}

然后我们点击发送,在前台,后台,杀死状态下就可以测试听语音播报了。

以上就是关于语音播放收款信息的一些搜集和自己的实践整理出来的,

还有后期的打包上架需要选哪个scheme的问题,个人觉得是选择扩展的那个scheme进行打包,还在测试,没有上架呢。待以后有时间及时为大家更新补上。

奉上本文的demo链接地址:艾鑫文学社

 

2019.4.23号补充:(最近看到还有许多朋友也在不断的点赞,希望再次把我发现的问题告知大家,让关注我的朋友少走弯路。)

测试发现从iOS12.0.1版本之后出现在app后台的模式下不再进行语音播报,经过断点以及log排查,发现是语音合成没有问题,是在此之后的AVAudioPlayer不支持播报导致的问题。暂时尝试过使用iOS的voip推送,是可以让系统重新支持AVAudioPlayer播放处理。但是voip的使用审核可能比较严格,相关使用的同学可以去细致看一下voip的审核问题。(之后的iOS系统什么时候能够后台打开这个AVAudioPlayer播放还需期待。)

 

下面还有一个微信的收款语音提醒的一个总结微信 iOS 收款到帐语音提醒开发总结,供大家有空参考!

iOS学习爬坑记录14:自定义远程推送通知铃声(Custom Alert Sounds) 最近在调试APP的远程推送,需要做成类似微信视频通话或者语音通话的通知铃声。找了好多资料才知道怎么自定义铃声: 官方文档中有铃声格式和长度的说明:(见https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/IPhoneOSC 阅读详情

相关推荐

ios apns推送 离线锁屏语音播报

公司正在研发的一款App,需要在进行消息推送时支持语音播报。 具体要求: - 离线:App在用户未打开时,可收到消息推送 - 锁屏:用户在设备锁屏状态下,仍可收到消息推送 - 语音播报:收到消息推送时可同时进行语音播放 苹果的APNs消息推送, 支持在应用未打开及设备锁屏状态下收到推送。 而同时进行语音播报,则需要做一些特殊处理。 目前语音播报的场景有两种: 一种是固定音频的播放, 一种是需要动态合成后的音频播放。如支付宝或微信收款的消息提醒: “支付宝/微信成功收款100元” 。

Rey的技术博客 1664

IOS推送声音设置

项目中遇到需要自定义通知声音的需求,以前没做过,就查了下官方文档,就像文档上说的,实现起来确实挺简单,就整理下当做备忘吧。 关于推送,官方文档、各种第三方推送文档都很全,就跳过了。 由于自定义通知声音还是由 iOS 系统来播放的,所以对音频数据格式有限制,可以是如下: 对应音频文件格式是 aiff,wav,caf 文件,文件也必须放到 app 的目录中。 自定义通知声音的播放时

笑看风云的专栏 1万+

iOS学习笔记之远程推送、静默推送与自定义消息推送

远程推送时 , 应用可能处于下列三种状态:      (1) . 应用开启时 , 应用在前台     (2) . 应用开启时 , 应用在后台     (3) . 应用未启动(应用被杀死) 从苹果APNS服务器远程推送时: 1 . 如果应用处于 (1) 状态 , 则不会发出声音 , 会直接调用appDelegate的代理方法didReceiveRemoteNotification,此时如果想收到类似系统的弹窗提示,则需要自定义弹窗,提示音,振动(弹窗可以参考 : ForeNotification  (本地下载)) AudioServicesPlaySystemSound(1007);/

iOS 远程推送和本地推送时播放自定义音频

iOS 远程推送和本地推送时播放自定义音频 先上结论: 在各平台及极光推送技术论坛看了大量技术贴后,总结了实现接到推送时播放音频的几种方法: 使用voip,即pushKit,是苹果专为视频通话开放的高优先级推送,此推送可支持很大程度的自定义,但是如果APP没有视频通话功能时使用这个方法,审核时很可能被拒,是一种偏方。我这里没用这个方法。 使用静默推送,然后在接受到推送之后创建本地推送,在本地推送...

zyww的博客 2607

Unity2D像素刀光实现:粒子方向控制与像素级渲染规范

像素风游戏中的刀光特效并非普通粒子动画,而是需严格遵循像素艺术原理的视觉暂留模拟。其核心在于将‘瞬时切割感’转化为程序可执行的渲染逻辑:通过禁用纹理滤波保障1:1像素锐度,绑定刀锋向量控制粒子运动方向,限定≤0.15秒生命周期匹配人眼暂留阈值,并采用Stretched Billboard实现动态拉伸拖影。该方案兼顾美术语义(如直劈、横扫、突刺)与工程约束(Sorting Layer分层、对象池复用、单粒子GPU优化),广泛适用于Unity2D平台的动作反馈系统,尤其适配《空洞骑士》《死亡细胞》类高节奏像素R

weixin_32390647的博客 283

批处理脚本手动双击可以执行,但计划任务中执行失败

问题现象: 使用批处理脚本从linux端(samba server) 备份一些数据,设置计划任务每天凌晨两点定时备份。 1)、windows系统中映射共享文件夹为S:盘,需要输入共享用户名和密码 2)、脚本中使用xcopy命令复制共享目录中的文件到windows本地目录中。 脚本如下: set Name=%date:~0,4%%date:~5,2%%date:~8,2% chcp 65001 REM chcp防止中文乱码 mkdir "E:\脚本备份\bakscripts%Name%" xco

独孤清扬玩DB 4312

ios 推送语音播报

分享一个类似支付宝收款提醒的语音播报,我这里推送配的是个推,集成配置都可以参照个推文档中心,文档介绍步骤都很详细。 1、打开推送Capabilities---Push Notifications 2、开启远程推送Capabilities---Background Modes---Remote Notifications 3、新建UNNotification Service E

Tomato_Li125的博客 754

intel-VROC raid卡驱动 centos7.9

u盘进入系统,按e,在出现下面在quiet前面输入inst.dd initcall_blacklist=vmd_drv_init 后按Ctrl和x,开始引导。进入系统,按e,在出现下面在quiet前面输入inst.dd inicll_blacklist=vmd_drv_init 后按Ctrl和x,开始引导。驱动完成后,在输入 c 回车, 引导过程开始,进入安装界面。输入1 ,选择这个ISO驱动文件里的rpm包。输入1 ,选择这个ISO驱动文件里的rpm包。vi编辑 /etc/default/grub。

dacming的博客 4541

Ios 推送扩展Notification Service Extension 与简单的语音合成 (学习笔记)

新项目要用到推送,然后语音播报推送里的内容。比如支付宝的推送功能“支付宝到账100元”,这种的。 目前做这个的方法第一个想到的就是Notification Service Extension了,Notification Service Extension是ios10推出的新功能,所以只能在ios10及其以上的手机上有用。 Notification Service Extension的作用就...

wumu_Love的博客 2880

告别手写代码!用Simulink给TI F28335 DSP自动生成C代码(保姆级环境配置)

本文详细介绍了如何利用Simulink为TI F28335 DSP自动生成C代码,告别传统手写代码的低效与错误。通过保姆级环境配置指南和实战案例,帮助开发者快速掌握模型驱动开发方法,大幅提升嵌入式开发效率,特别适合需要频繁修改算法参数或团队协作的工程师。

weixin_30388677的博客 416

简单的图书管理系统---SpringBoot+mysql通过前后端分离实现增删查改

SpringBoot+mysql通过前后端分离实现增删查改 上篇文章介绍了如何写后端接口 SpringBoot连接MySQL获取数据写后端接口 这篇文章,我们就介绍一下怎么写前端 点击修改跳出修改界面,点击添加书籍跳出添加书籍界面 点击删除,直接删除一行数据 其他的也没什么解释了,直接上代码(看不懂的可以私聊我哟) <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>

爱笑的博客 2015

iOS 后台播放音乐或播报语音

适用于APP在后台持续播放本地音乐,或者使用AVSpeechSynthesizer在后台能播报语音的情况, 打开Targets–>Capabilities–>BackgroundModes开关,选择第一行audio选项 在AppDelegate的didFinishLaunchingWithOptions方法中添加自定义方法configAudio: - (BOOL)applicatio...

冰凉的枷锁的博客 1964

从零到一:鲲鹏920服务器上的DeepSeek模型部署全流程解析

本文详细解析了在华为鲲鹏920服务器上部署DeepSeek模型的全流程,包括环境准备、模型服务框架部署、性能优化及生产环境方案。通过ARM架构优化和量化技术,显著提升模型推理效率,适用于企业级AI应用场景,助力国产化技术落地。

weixin_29094775的博客 599

iOS推送语音播报(类似支付宝收款提醒)

需求分析 实现类似支付宝微信收款后的语音播报如:支付宝到账xx元。要求是APP在前台运行、锁屏、杀死进程后都会有语音播报。那想到的解决方案就是利用推送了。 功能实现思路分析 上面说了,要使用推送,也就是APNs,这里我使用了极光推送,接下来就是实现手机接收到通知之后播报语音了,关于这个功能的实现在iOS10以后苹果新增了“推送拓展”UNNotificationServiceExtension,我们可以在这里操作,在这里我用的是苹果官方的AVSpeechSynthesizer和AVSpeechUtter

努力,可能成功!放弃,注定失败! 1930

【DIY】使用STM32及PID算法实现一个磁悬浮玩具

今天教大家来做一个磁悬浮玩具。

小白白学电子 1万+

百条网络工程师基础面试题(不断更新)

1)什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。 3)什么是骨干网? 骨干网络是集中的基础设施,旨在将不同的路由和数据分发到各种网络。它还处理带宽管理和各种通道。 4)什么是 LAN? LAN 是局域网的缩写。它是指计算机与位于小物理位置的其他网络设备之间的连接。 5)什么是节点? 节点是指连接发生的点。它可以是作为网络一部分的计算机

weixin_42728126的博客 2万+

实现微信支付宝收款到账语音提醒

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

aluoshiyi的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

iOS后台唤醒实战:微信收款到账语音提醒技术总结

1、前言微信为了解决小商户老板们在频繁交易中不方便核对、确认到账的功能痛点,产品MM提出了新版本需要支持收款到账语音提醒功能。本文借此总结了iOS平台上的APP后台唤醒和语音合成、播放等一系列技术开发过程中遇到的坑和小技巧,希望与您分享。(本文同步发布于:http://www.52im.net/thread-1404-1-1.html)2、技术方案2.1 后台唤醒App收款到账语音提醒需要收款方在...

cleven 1231

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

iOS 模仿支付宝支付到账推送,播报钱数

最近申请了支付宝的二维码收钱码,其中支付宝有这么一个功能,就是,别人扫描你的二维码给你转账之后,收到钱会有一条语音推送,”支付宝到账 1000万“之类的推送消息,不管你的支付宝app有没有被杀死。 只要你的远程推送开着,并且支付宝的"二维码收钱到账语音提醒",都打开着,就可以收到。 打开方式:支付宝点击右上角设置-通用-新消息通知,打开到账提醒即可。 image.png   并且别人给你...

LVXIANGAN的专栏 1416

html 实时获取数据并语音播报,iOS,APP退到后台,获取推送成功的内容并且语音播报内容。...

如何做到和支付宝一样,关了app也能正常收到语音播报“支付宝收款到账88元”。//监听商家收款推送消息,语音播报document.addEventListener("plusready", function() {plus.push.addEventListener("receive", function(msg) {if(mui.os.android) {var main = plus.andr...

weixin_31198993的博客 356

IOS开发 百度语音实现播报及IOS12.1后的播报功能问题与实现

iOS 百度语音实现播报及iOS12.1后的播报功能问题与实现 最近碰到个接收到推送要实现语音播报的需求,需要后台推送通知,APP客户端收到通知之后语音播放:“您的账户收到一笔巨款”的功能。使用到了Notification Service Extension服务。 在之前的记录使用AVSpeechUtterance 来进行语音播报。 文章地址:http://www.laileshuo.c...

奋斗吧灬青年的博客 1298

iOS视频处理之---视频截取及添加背景音乐

这段时间由于工作需要,了解了一些关于iOS中视频处理功能,发现AVFoundation功能强大,今天聊一聊视频截取和添加背景音乐的一些功能,这里面涉及到得一些类类名和方法都比较长,但是用法还是相对简单,主要是能理解多媒体的一些概念,先来介绍一下常用到的几个AVFoundation下得类: AVURLAsset:AVAsset的子类,此类主要用于获取多媒体的信息,包括视频、音频的类型、

donwei8的专栏 2016

关于IOS12 推送系统语音播报无声解决方案

自从iOS升级到12.0.1 突然发现推送语音播报没有了效果了,之前iOS12 完全没有影响; 如何实现(网上很多,基本方案就是UNNotificationServiceExtension+语音合成) 调试了一下NotificationServiceExtension 打了断点,发现AVSpeechSynthesizer 崩溃了,试了很多都以失败告终, 在网上查找资料无果,最后尝试使用第三方...

javaskyhr的专栏 4572

uniapp自定义消息语音

uniapp后台配置因为2.0只支持uniapp自己的后台发送消息,所以要自己的后台发送消息只能用1.0插件地址和代码插件地址:link} else {} , 500) }

c347087870的博客 2480
上一篇: iOS compare字符串的比较
下一篇: IOS 图片绘制过程中的剪切之后没有原图清晰的问题解决方法
Cao_Shixin攻城狮
博客等级 码龄10年 710粉丝 102原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值