由于現(xiàn)在二維碼支付越來越流行。越來越多的小伙伴參與到聚合支付的行業(yè)中邻薯。那在app的開發(fā)中,金額播報(bào)這個(gè)功能肯定是必要的一項(xiàng)了!
下面直接進(jìn)入主題
金額播報(bào)的情形(主流app工具如“支付寶”“收錢吧”)
1恍飘、iOS 10以下的設(shè)備收到錢之后不管App是殺死還是進(jìn)入后臺狀態(tài)都會播報(bào)”xxxx收款成功”一句固定的語音
2、iOS 10以上的設(shè)備谴垫,收到錢之后章母,不管APP是殺死還是壓入后臺狀態(tài),在收到轉(zhuǎn)賬的時(shí)候翩剪,會播報(bào)”xxx到賬 xxx 元”
實(shí)現(xiàn)以上功能注意的點(diǎn):
iOS 10以上和iOS10以下設(shè)備,實(shí)現(xiàn)方式不一樣
1.iOS10以前的收款播報(bào)是在后臺或者app被殺死的時(shí)候乳怎,播放一個(gè)固定的聲音,可以借助遠(yuǎn)程推送定制鈴聲的功能來實(shí)現(xiàn)前弯,只要在本地添加一段提前錄制好的語音蚪缀,并且在推送內(nèi)容的時(shí)候?qū)ound字段,修改成語音的名稱即可恕出。(ios 10 之前也可以有另類的方法做到询枚,后臺金額播報(bào),后面會有介紹)
2.iOS10以后剃根,無論是app在后臺,或者沒有開啟前方,都可以進(jìn)行具體的播報(bào)金額. 用到的是iOS 10的推送擴(kuò)展( Notification Extension)
推薦的語音播報(bào)的兩種方式
1.科大訊飛的語音合成 ?(有兩個(gè)GG 兩個(gè)MM的聲音可以選) ? ? ? ? ? ? ? ? ? ? ? ?-> ? ? ?科大訊飛語音合成
2.系統(tǒng)語音合成? ? ? ? ?->?系統(tǒng)語音播報(bào)
#import <AVFoundation/AVFoundation.h>
AVSpeechUtterance * aVSpeechUtterance = [[AVSpeechUtterance alloc] initWithString:@"想說啥就說啥"];
aVSpeechUtterance.rate = AVSpeechUtteranceDefaultSpeechRate;?
aVSpeechUtterance.voice =[AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];?
[self.aVSpeechSynthesizer speakUtterance:aVSpeechUtterance];?
下面我們一步一步來完成這個(gè)功能的實(shí)現(xiàn)
iOS 10以上處理方法 Notification Extension ?
原理如下狈醉,想要深入研究的可以看看 ? ?NotificationServiceExtension
1.
生成以下的文件
點(diǎn)開的.m文件
#import "NotificationService.h"
#import@interface NotificationService ()
@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
@property (nonatomic, strong) AVSpeechSynthesizer *aVSpeechSynthesizer;
@end
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
self.bestAttemptContent.title = [NSString stringWithFormat:@"%@",request.content.body];
self.bestAttemptContent.subtitle = @"";
self.bestAttemptContent.body = @"";
self.aVSpeechSynthesizer = [[AVSpeechSynthesizer alloc] init];
//request 可以獲取所有推送信息,里面可以取得播報(bào)內(nèi)容
AVSpeechUtterance * aVSpeechUtterance = [[AVSpeechUtterance alloc] initWithString:@"這里放入播報(bào)的聲音文字就行了"];
aVSpeechUtterance.rate = AVSpeechUtteranceDefaultSpeechRate; ??
aVSpeechUtterance.voice =[AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"]; ??
[self.aVSpeechSynthesizer speakUtterance:aVSpeechUtterance];
self.contentHandler(self.bestAttemptContent);
}
你以為這就結(jié)束了嗎惠险?苗傅??NO,NO,NO 下面很關(guān)鍵
1. 后端給你推送過來的json 必須添加 ? ? "mutable-content":1 ? ? (后臺一直引用不出來這個(gè)參數(shù)方法班巩,請讓他升級推送渣慕!)
2.播放的語音時(shí)長最好不要超過30秒 ? (我也不信誰能播放30秒)
3.iOS10以下推送的sound 有值嘶炭,想要iOS10 以上沒有推送聲音 可以設(shè)置 self.bestAttemptContent.sound = nil;
4.斷點(diǎn)調(diào)試的時(shí)候,跑正確的target
iOS10以上推送金額播報(bào)大致就是這樣的一個(gè)流程逊桦。本文章也只提供一個(gè)大致的思路和實(shí)現(xiàn)方法眨猎。具體的細(xì)節(jié)處理 可以自己去琢磨。比如支付寶的金額播報(bào)强经,他們的錢的單位和0 - 9 的數(shù)字都是固定語音睡陪,大概就是將推送獲取的金額,然后音頻拼接起來,有興趣的可以自己研究匿情。
下面簡單說說iOS10以下的后臺金額播報(bào)
首先兰迫,未開啟app的話不可能詳細(xì)的金額播報(bào)啦!炬称!
方式一 汁果,app進(jìn)入后臺后 就進(jìn)行無聲的音樂播放,每三分鐘撥一次玲躯,保證app一直后臺活躍据德,并且 ?
然后接到推送后,就可以播報(bào)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler {
//回調(diào)
NSLog(@"Received remote notification with userInfo %@", userInfo);
completionHandler(UIBackgroundFetchResultNewData);
//語音播報(bào)
AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:@“userinfo有你要讀的東西”];
AVSpeechSynthesizer *synth = [[AVSpeechSynthesizer alloc] init];
[synth speakUtterance:utterance];
}
重點(diǎn):
1."content-avilable" =1 ? 后端必須傳這個(gè)字段府蔗。 (靜默推送) ? ?
2.
勾選后晋控,可能會被蘋果拒絕!你可以上傳一段你使用后臺播放的用途姓赤!這個(gè)通過率大概30% 赡译,看運(yùn)氣!
如果你有更好的建議不铆,想法蝌焚,或者疑問,歡迎留言誓斥!