iOS 后台语音播报功能开发过程中的那些坑
上个版本的开发计划中产品同学建议在我们的商家版App中做后台语音播报功能,在评审的时候我就在想,完全可以通过Push静默推送来实现后台播放音频来实现(后续事实证明,这是个大坑)。
关于静默推送 推荐大家看一下https://www.jianshu.com/p/c211bd295d58
好了,最后通过push和backGroundModes实现了在后台语言播放的功能,工程的配置:
关于BackGroundModes推荐大家看一下 www.jianshu.com/p/121fc5b7f… 测试环境一切正常,testflight也一切正常,然后提交审核,然后就悲剧了。被拒的原因的大概意思就是你开启了后台挂起播放音频的功能需要演示视频。 然后我周末跑去公司录制了视频上传到YouTuBe,为了安心我还上传到了优酷,两个链接扔上去,提交审核,这些稳了吧。然后又被拒了。 然后被拒原因大概是我还是看不到你哪里用了后台播放音频呀。 然后我就懵逼了,查了一天的资料,终于大概理解了苹果审核人员的意思,静默推送苹果爸爸的初衷是用了在后台的时候处理数据刷新相关的,静默、静默的意思就是不打扰用户,然后我用它来做语音播报显然是违背了静默推送的初衷,然后只能换思路了。
在iOS 10 UNNotificationServiceExtension 刚出现的时候了解过,然后在后续没有用到就忘的差不多了,在对它进一步了解之后,我发现它完全能够在不开启后台运行相关功能的情况下来实现语音播报功能,好吧,开始动手:
在你的功能首先创建UNNotificationServiceExtension target
Service Extension的Bundle Identifier不能和Main Target(也就是你自己的App Target)的Bundle Identifier相同,否则会报BundeID重复的错误。 Service Extension的Bundle Identifier需要在Main Target的命名空间下,比如说Main Target的BundleID为io.jpush.xxx,那么Service Extension的BundleID应该类似与io.jpush.xxx.yyy这样的格式。如果不这么做,你可能会遇到一个错误。
创建好了把相关音频文件导入:
在下面方法做相关数据处理
- (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];[[AVAudioSession sharedInstance] setActive:YES error:NULL];[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];NSDictionary *userInfo = self.bestAttemptContent.userInfo;NSDictionary * aps = [userInfo objectForKey:@"aps"];NSString * soundCommand = [aps valueForKey:@"soundCommand"];[self playSoundsWithSoundCommand:soundCommand];self.contentHandler(self.bestAttemptContent);
}
/*播放*/
-(void)playWithFileUrlString:(NSString *)fileURLString{if (![fileURLString length]) {return;}AVAudioSession * session = [AVAudioSession sharedInstance];[session setActive:YES error:nil];BOOL ret = [session setCategory:AVAudioSessionCategoryPlayback error:nil];NSLog(@"%d",ret);NSURL *fileURL = [[NSBundle mainBundle]URLForResource:fileURLString withExtension:@".mp3"];static SystemSoundID soundID = 0;AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)(fileURL), &soundID);AudioServicesPlayAlertSoundWithCompletion(soundID, ^{NSLog(@"播放完成");});
}
复制代码
记住了在做完相关操作之后再调用self.contentHandler(self.bestAttemptContent);方法 进入墓碑模式(不执行应用程序的任何代码)
还有很重要的一点,记住push的试试让后台同学要加入一个参数"mutable-content" = 1;,不然我们的扩展类方法是拦截不到推送的哦,要和alert 同级的,位置不要错。
接下来运行-测试,完美实现。打包,然后又报错了,看了原因是因为扩展target和我的原来工程的签名不是同一team,这时候就要用的appid创建的时候创建一个通配符appid了。
在你开发者中心创建一个通配符appid包含到你的扩展应用下,然后生成相关开发和生成Profile文件,下载下来,然后打包。成功!!!
接下来就是等待苹果爸爸的审核了,不过十拿九稳啦~
参考文档:www.jianshu.com/p/db9c4aec2…
转载于:https://juejin.im/post/5cb93222f265da0356322dbd
iOS 后台语音播报功能开发过程中的那些坑相关推荐
- 实现百度地图导航Demo的语音播报功能
上文中实现了在本地导入百度地图导航Demo,那么在此基础上如何实现导航的语音播报呢? 一.为该应用申请语音播报(也叫注册) http://developer.baidu.com/map/index.p ...
- 前端实现语音播报功能
近期接到需求,内容页中的文字要实现语音播报功能,语音生成已经存入数据库 var myAudio = new Audio(); //arr 中存放的是音频数据,数组的大小是不确定的 var arr = ...
- MediaPlayer实现金额的语音播报功能
推荐阅读: SurfaceView+MediaPlayer封装之路 Android学习资源分享合集(1) 最近写了一个金额的语音播报功能,已封装成依赖库到Github,希望对大家有所帮助. Githu ...
- MediaPlayer实现金额的语音播报功能 1
推荐阅读: SurfaceView+MediaPlayer封装之路 Android学习资源分享合集(1) 最近写了一个金额的语音播报功能,已封装成依赖库到Github,希望对大家有所帮助. Githu ...
- 【App开发】有语音播报功能的摇号软件:演示视频、开发历程
文章目录 1 故事背景 2 开发历程 2.1 技术选用 2.2 语音播报功能 2.3 生成随机数 2.4 前端页面编写 3 演示效果 1 故事背景 昨晚网上有人找我制作一个自动随机数摇号并语音播报出来 ...
- JAVA小功能语音播报功能
JAVA小功能实现----语音播报功能 来点关注吧 1.先创建一个staticTools类添加如下代码 2.导入jacob.jar包 然后进行window配置 3.复制如下代码到staticTools ...
- ie浏览器语音播报功能实现
文章目录 ie浏览器语音播报 spvoice详细接口 示例代码 异步播报 等待播报完毕 参考 ie浏览器语音播报 在ie下用 SpVoice实现语音播报功能 spvoice详细接口 SpVoice I ...
- PHP实现简单的页面语音播报功能
PHP实现简单的页面语音播报功能(setInterval 循环播放) JS代码 $(function () { var set = setInterval(function(){ $.post(roo ...
- php加入语音播报功能_PHP实现语音播报功能
大家估计都知道现在很多AI音响能够给你播报天气,叫你起床...甚至能够接受语音指令!所谓的人工智能音响,听起来很高大上,都说PHP是最好的编程语言,今天我就带大家来实现一个语音播报功能!先大体说一个思 ...
最新文章
- Redis操作Hash相关API
- android按下enter键如何让光标跳到下一个edittext,Android:EditText回车跳到下一个输入框或登录...
- System verilog利用class类打印信息
- python 编译 pyc
- python编程(基于订阅模式的mvc实现)
- bzoj 2151 种树 —— 思路+链表
- mysql innodb 分区表_InnoDB的分区表
- 【Duet display】Mac分屏神器
- RFC2544吞吐量测试详细步骤-MiniSMB-HurricaneII软件操作演示
- 介绍一款很好用的分区软件--分区助手(不用格式化磁盘哟~)
- stm32做的usb游戏手柄xbox360
- Android获取设备的IP地址的两种方法
- 445/139端口的作用与危害
- 怎么用多张图片制作动态图?
- Lync 2013十大新功能
- 从零入门激光SLAM(一)——什么是SLAM
- GC finalize方法
- 成为金融级数据库,腾讯TDSQL 的底气是什么?
- js 点击切换背景图片
- 浙江计算机二级word试题,浙江省计算机办公二级新增试题(word、Excel)
热门文章
- Linux网络编程--sendfile零拷贝高效率发送文件
- linux C 应用消息队列在两个进程间通信
- ROS报错:/usr/include/eigen3/Eigen/src/Core/util/StaticAssert.h:119:9: error: ‘YOU_MIXED_DIFFERENT
- python:第一个简单爬虫程序
- python版:装饰器模式
- [置顶] 运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy),三大件(bigthree problem)...
- 编程学习记录13:Oracle数据库,表的查询
- Java知识系统回顾整理01基础03变量03字面值
- ssm整合之web.xml配置
- 理解Storm Metrics