亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS開發微信收款到賬語音提醒功能思路詳解

2020-07-26 02:42:09
字體:
來源:轉載
供稿:網友

一、背景

為了解決小商戶老板們在頻繁交易中不方便核對、確認到賬的痛點,產品MM提出了新版本需要支持收款到賬語音提醒功能。這篇文章總結了開發過程中遇到的坑和一些小技巧。

二、技術方案

后臺喚醒App

收款到賬語音提醒需要收款方在收到款后,播放一段TTS合成語音播報金額,微信在前臺時可以通過模板消息將需要播報的金額帶下來,再請求TTS數據并播放,但是app在掛起或者被kill掉的情況下要如何請求語音數據并播放呢?

iOS提供了兩種方式喚醒處于掛起或已經被kill掉的app。分別是Silent Notification和VoIP Push Notification,客戶端在被喚醒之后將獲得30s的后臺運行時間,這段運行時間足以請求合成語音數據并播放。

1.Silent Notification:

Silent Notification在iOS7以上便可以支持,但是每小時能推送的Silent Notification次數有限制。

2.VoIP Push Notification

VoIP Push Notification則是在iOS8以上才支持的新Push類型,相比于Silent Notification,VoIP Push具有高優先級、低延遲的優勢,并且沒有次數限制。
對比這兩種技術方案,VoIP Push Notification明顯更適合用于收款到賬語音提醒的喚醒方案。

TTS合成語音

TTS語音合成方案分為離線合成方案和在線合成方案,離線合成方案省去網絡請求,合成速度更快,節省網絡流量,但是合成音的聽起來比較機械,語速和停頓的處理較差一些。如果對合成音的效果要求不是特別高,可以考慮采用iOS自帶的AVSpeechSynthesis框架,免去語音庫的合入,減少安裝包大小。

在線合成方案的效果則相對更像人聲,富有感情。考慮到產品體驗,我們采用了搜索產品部提供的在線語音合成方案,接入方式可以看這篇文章。合成音格式支持wav,mp3,silk,amr,speex,對比后發現,在合成相同文本的情況下,amr的壓縮率最高,但是能聽到音質下降明顯。silk格式壓縮率次高,且能保持相對清晰的音質,單條合成語音大小在2KB左右。

喚醒后播放音頻文件

在請求到合成語音后,要在后臺或者鎖屏狀態下播放音頻文件,AVAudio Session的Category值需要使用AVAudioSessionCategoryPlayback或是AVAudioSessionCategoryPlayAndRecord,CategoryOptions根據實際需要可選擇MixWithOthers(與其他聲音混音)或是DuckOthers(調低其他聲音的音量)。

需要注意的是,只有iOS10以上才支持app被喚醒后在后臺/鎖屏狀態下播放音頻。所以iOS10以下的設備,在收到VoIP Push后只能在local push上設定一段固定鈴聲,這也是為什么iOS10以下只有“微信支付收款到賬”,而沒有后面具體的金額數值。

三、靜音開關檢測

不幸的是,在產品發布后沒多久就受到了某互聯網大佬的吐槽。

從產品體驗上來說,收款到賬的金額播報是隨著local push的彈出一起播放的,更像是一種特殊的push鈴聲,而蘋果對push鈴聲的處理是受到靜音開關控制的,所以講道理,這個吐槽是合理的。然而前面提到App在被VoIP Push喚醒之后,需要將AudioSessionCategory設置為AVAudioSessionCategoryPlayback或AVAudioSessionCategoryPlayAndRecord才可以在后臺播放音頻文件,這兩種模式是不受靜音開關控制的。要實現這個需求,就必須獲取當前靜音開關的狀態。而蘋果在iOS5之后并沒有明確地提供一種方式讓開發獲取靜音開關的狀態,這就陷入了一個尷尬的局面。

蘋果在iOS5之前可以使用以下方式監聽靜音鍵開關

- (BOOL)isMuted {  CFStringRef route;  UInt32 routeSize = sizeof(CFStringRef);  OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &routeSize, &route);  if (status == kAudioSessionNoError)  {   if (route == NULL || !CFStringGetLength(route))    return YES;  }  return NO; }

蘋果在iOS5之后便禁止了使用這種方式監聽靜音按鍵,背后的原因應該是蘋果希望開發者使用AVAudioSession來提供統一的音頻播放效果。

最后我在Reddit上找到了一種曲線救國的方式,實現起來也不復雜:使用AudioServicesPlaySystemSound播放一段0.2s的空白音頻,并監聽音頻播放完成事件,如果從開始播放到回調完成方法的間隔時間小于0.1s,則意味當前靜音開關為開啟狀態。

void SoundMuteNotificationCompletionProc(SystemSoundID ssID,void* clientData){ MMSoundSwitchDetector* detecotr = (__bridge MMSoundSwitchDetector*)clientData; [detecotr complete];}- (instancetype)init { self = [super init]; if (self) {  NSURL *pathURL = [[NSBundle mainBundle] URLForResource:@"mute" withExtension:@"caf"];  if (AudioServicesCreateSystemSoundID((__bridge CFURLRef)pathURL, &_soundId) == kAudioServicesNoError){   AudioServicesAddSystemSoundCompletion(self.soundId, CFRunLoopGetMain(), kCFRunLoopDefaultMode, SoundMuteNotificationCompletionProc,(__bridge void *)(self));   UInt32 yes = 1;   AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(_soundId),&_soundId,sizeof(yes), &yes);  } else {   MMErrorWithModule(LOGMODULE, @"Create Sound Error.");   _soundId = 0;  } } return self;}- (void)checkSoundSwitchStatus:(CheckSwitchStatusCompleteBlk)completHandler { if (self.soundId == 0) {  completHandler(YES);  return; } self.completeHandler = completHandler; self.beginTime = CACurrentMediaTime(); AudioServicesPlaySystemSound(self.soundId);}- (void)complete { CFTimeInterval elapsed = CACurrentMediaTime() - self.beginTime; BOOL isSwitchOn = elapsed > 0.1; if (self.completeHandler) {  self.completeHandler(isSwitchOn); }}

四、設置聲音閾值

另外一個用戶反饋較多的問題是聽不到播報聲音,通過查看日志發現是觸發語音播報時,用戶設置的系統音量過小所導致。首先想到的解決方案是直接設置AVAudioPlayer的volume(或者是AudioQueue中的kAudioQueueParam_Volume),然而實驗過后發現這樣行不通,volume屬性受制于系統音量(比如系統volume是0.5,AVAudioPlayer的音量是0.6,則最終的音量為0.5*0.6 =0.3)。要解決音量過小的問題,還是需要通過調節系統音量。最終的解決方案借鑒了進入收付款展示二維碼時自動調節屏幕亮度的方案:如果屏幕亮度未達到閾值,則調高屏幕亮度到閾值,離開頁面時,將亮度設回原亮度。同理,播放提示音時,若用戶設置的系統音量小于閾值,則調節到閾值。提示音播放完畢后,將提示音調回原音量。

控制系統音量有兩種方式:

方式一:通過MPMusicPlayerController設置音量

MPMusicPlayerController *mpc = [MPMusicPlayerController applicationMusicPlayer];//This property is deprecated -- use MPVolumeView for volume control instead.mpc.volume = 0; //0.0~1.0

第一種方式簡單粗暴,在設置的時候會彈出系統音量提示框,如果用戶在使用app的過程突然彈出音量框,會對用戶造成困擾,不建議使用這種方式,并且蘋果在iOS7.0以后已將該屬性標為deprecated。

方式二:通過MPVolumeView設置音量

第二種方式則是將一個看不見的MPVolumeView添加到當前視圖上,系統音量提示框就不會顯示了

需要注意的是,在調節完系統音量需要將MPVolumeView移除,否則后續用戶手動調節音量會出現系統音量提示框不顯示的情況。

調節音量的方式,則是先取到MPVolumeView中名為MPVolumeSlider的子View,并對其發送模擬用戶操作的事件。

- (void)setSystemVolume:(float)volume { UISlider* volumeViewSlider = nil; for (UIView *view in [self.m_privateVoulmeView subviews]){  if ([view.class.description isEqualToString:@"MPVolumeSlider"]){   volumeViewSlider = (UISlider*)view;   break;  } } if (volumeViewSlider != nil) {  [volumeViewSlider setValue:volume animated:NO];  //通過send  [volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside]; }}

總結

以上所述是小編給大家介紹的iOS開發微信收款到賬語音提醒功能思路詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一男人av| 国产精品视频999| 欧美高清视频免费观看| 中文字幕视频一区二区在线有码| 欧美一区二粉嫩精品国产一线天| 国产精品久久久久久久久久ktv| 一区二区欧美亚洲| 中文字幕日韩视频| 欧美成人午夜激情视频| 九色成人免费视频| 日韩高清免费观看| 国产日韩在线亚洲字幕中文| 国产成人精品久久二区二区| 亚洲天天在线日亚洲洲精| 日韩精品极品毛片系列视频| 国产成人久久精品| 欧美一级电影免费在线观看| 日韩精品久久久久| 国产精品∨欧美精品v日韩精品| 国产成人精品在线视频| 亚洲free嫩bbb| 理论片在线不卡免费观看| 亚洲免费伊人电影在线观看av| 亚洲欧美国产日韩天堂区| 91影院在线免费观看视频| 色阁综合伊人av| 在线观看欧美日韩国产| 久久99青青精品免费观看| 色久欧美在线视频观看| 韩国v欧美v日本v亚洲| 久久精品这里热有精品| 66m—66摸成人免费视频| 亚洲国产小视频在线观看| 亚洲色图第一页| 国产欧美精品xxxx另类| 国产一区二区成人| 日韩高清av一区二区三区| 668精品在线视频| 国产午夜精品理论片a级探花| 欧美日韩国产丝袜美女| 国内外成人免费激情在线视频网站| 亚洲激情电影中文字幕| 色噜噜国产精品视频一区二区| 欧美区在线播放| 日韩精品视频在线播放| 亚洲精品网址在线观看| 亚洲精品电影久久久| 国产亚洲人成网站在线观看| 欧美激情视频给我| 原创国产精品91| 91系列在线播放| 欧美日韩一区二区在线| 亚洲国产天堂久久国产91| 欧美激情手机在线视频| 亚洲香蕉av在线一区二区三区| 久久久久久亚洲精品中文字幕| 亚洲aa在线观看| 国产综合在线观看视频| 欧美理论电影网| 欧美日韩成人免费| 久久精品国产免费观看| www欧美xxxx| 亚洲自拍偷拍视频| 亚洲理论在线a中文字幕| 亚洲性生活视频| 538国产精品一区二区在线| 国产91亚洲精品| 亚洲免费av电影| 日韩av一区二区在线观看| 欧美性xxxxx极品娇小| 成人亲热视频网站| 日韩69视频在线观看| 81精品国产乱码久久久久久| 另类少妇人与禽zozz0性伦| 欧美福利视频网站| 亚洲欧美日韩国产中文| 国产精品1区2区在线观看| 日本精品免费观看| 中文字幕在线看视频国产欧美在线看完整| 中文字幕一区二区三区电影| 国产香蕉精品视频一区二区三区| 欧美亚洲成人精品| 中文字幕亚洲一区二区三区| 亚洲电影免费在线观看| 色偷偷91综合久久噜噜| 精品视频中文字幕| 国产欧美日韩丝袜精品一区| 性金发美女69hd大尺寸| 日韩av电影国产| 精品国产一区二区三区久久狼5月| 亚洲女人初尝黑人巨大| 亚洲成人精品久久久| 精品欧美激情精品一区| 51久久精品夜色国产麻豆| 国产欧美一区二区| 久久精品国产免费观看| 在线观看亚洲区| 日韩av在线最新| 亚洲美女又黄又爽在线观看| 中文字幕日韩高清| 国产成人一区二区三区电影| 搡老女人一区二区三区视频tv| 高清欧美性猛交| 美女久久久久久久久久久| 国产欧美久久久久久| 亚洲国产精品va在看黑人| 亚洲free性xxxx护士hd| 久久亚洲欧美日韩精品专区| 97欧美精品一区二区三区| 日韩在线观看精品| 亚洲精品视频网上网址在线观看| 欧美激情精品久久久久久变态| 九九热精品视频国产| 国产精品99久久久久久人| 亚洲欧美日韩一区在线| 亚洲精品福利免费在线观看| 国语自产在线不卡| 最近2019年好看中文字幕视频| 欧美久久精品一级黑人c片| 91高清视频在线免费观看| 国产精品久久久久久久一区探花| 国产欧亚日韩视频| 欧美激情欧美激情在线五月| 亚洲白拍色综合图区| 亚洲人午夜精品| 欧美一级视频免费在线观看| 亚洲三级黄色在线观看| 亚洲人成在线免费观看| 国产一区视频在线| 久热精品视频在线观看| 亚洲人成亚洲人成在线观看| 亚洲最大福利视频网站| 久久久国产视频| 色综合天天综合网国产成人网| 国产精品看片资源| 亚洲已满18点击进入在线看片| 日韩欧美在线看| 国产精品久久网| 国产精品一区二区三区毛片淫片| 91丨九色丨国产在线| 日本精品久久久久影院| 欧美日韩性生活视频| 久久精品国产成人精品| 69国产精品成人在线播放| 在线电影av不卡网址| 精品视频中文字幕| 欧美成人自拍视频| 欧美午夜美女看片| 国产精品综合网站| 国产精品扒开腿做爽爽爽视频| 国产精品久久国产精品99gif| 欧美日韩亚洲高清| 91香蕉嫩草神马影院在线观看| 日韩视频亚洲视频| 欧美成人免费观看| 国产精品九九九| 蜜臀久久99精品久久久无需会员| 亚洲 日韩 国产第一| 欧美亚洲免费电影| 欧美亚洲另类制服自拍| 欧美成人第一页| 69久久夜色精品国产69乱青草| 日韩精品福利在线| 亚洲精品电影久久久|