iOS 后台语音播报功能开发过程中的那些坑
??上個版本的開發(fā)計劃中產(chǎn)品同學(xué)建議在我們的商家版App中做后臺語音播報功能,在評審的時候我就在想,完全可以通過Push靜默推送來實現(xiàn)后臺播放音頻來實現(xiàn)(后續(xù)事實證明,這是個大坑)。
??關(guān)于靜默推送 推薦大家看一下https://www.jianshu.com/p/c211bd295d58
??好了,最后通過push和backGroundModes實現(xiàn)了在后臺語言播放的功能,工程的配置:
??關(guān)于BackGroundModes推薦大家看一下 www.jianshu.com/p/121fc5b7f… ??測試環(huán)境一切正常,testflight也一切正常,然后提交審核,然后就悲劇了。被拒的原因的大概意思就是你開啟了后臺掛起播放音頻的功能需要演示視頻。 ??然后我周末跑去公司錄制了視頻上傳到Y(jié)ouTuBe,為了安心我還上傳到了優(yōu)酷,兩個鏈接扔上去,提交審核,這些穩(wěn)了吧。然后又被拒了。 ??然后被拒原因大概是我還是看不到你哪里用了后臺播放音頻呀。 ??然后我就懵逼了,查了一天的資料,終于大概理解了蘋果審核人員的意思,靜默推送蘋果爸爸的初衷是用了在后臺的時候處理數(shù)據(jù)刷新相關(guān)的,靜默、靜默的意思就是不打擾用戶,然后我用它來做語音播報顯然是違背了靜默推送的初衷,然后只能換思路了。??在iOS 10 UNNotificationServiceExtension 剛出現(xiàn)的時候了解過,然后在后續(xù)沒有用到就忘的差不多了,在對它進(jìn)一步了解之后,我發(fā)現(xiàn)它完全能夠在不開啟后臺運行相關(guān)功能的情況下來實現(xiàn)語音播報功能,好吧,開始動手:
??在你的功能首先創(chuàng)建UNNotificationServiceExtension target
Service Extension的Bundle Identifier不能和Main Target(也就是你自己的App Target)的Bundle Identifier相同,否則會報BundeID重復(fù)的錯誤。 Service Extension的Bundle Identifier需要在Main Target的命名空間下,比如說Main Target的BundleID為io.jpush.xxx,那么Service Extension的BundleID應(yīng)該類似與io.jpush.xxx.yyy這樣的格式。如果不這么做,你可能會遇到一個錯誤。??創(chuàng)建好了把相關(guān)音頻文件導(dǎo)入:
在下面方法做相關(guān)數(shù)據(jù)處理 - (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(@"播放完成");}); } 復(fù)制代碼??記住了在做完相關(guān)操作之后再調(diào)用self.contentHandler(self.bestAttemptContent);方法 進(jìn)入墓碑模式(不執(zhí)行應(yīng)用程序的任何代碼)
??還有很重要的一點,記住push的試試讓后臺同學(xué)要加入一個參數(shù)"mutable-content" = 1;,不然我們的擴(kuò)展類方法是攔截不到推送的哦,要和alert 同級的,位置不要錯。
??接下來運行-測試,完美實現(xiàn)。打包,然后又報錯了,看了原因是因為擴(kuò)展target和我的原來工程的簽名不是同一team,這時候就要用的appid創(chuàng)建的時候創(chuàng)建一個通配符appid了。
??在你開發(fā)者中心創(chuàng)建一個通配符appid包含到你的擴(kuò)展應(yīng)用下,然后生成相關(guān)開發(fā)和生成Profile文件,下載下來,然后打包。成功!!!
??接下來就是等待蘋果爸爸的審核了,不過十拿九穩(wěn)啦~
??參考文檔:www.jianshu.com/p/db9c4aec2…
轉(zhuǎn)載于:https://juejin.im/post/5cb93222f265da0356322dbd
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的iOS 后台语音播报功能开发过程中的那些坑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RHEL7.0系统相关配置
- 下一篇: Spark 个人实战系列(1)--Spa