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 后台语音播报功能开发过程中的那些坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RHEL7.0系统相关配置
- 下一篇: Spark 个人实战系列(1)--Spa