推送的注冊(cè):
/**
* 系統(tǒng)大于10.0注冊(cè)推送
*/
- (void)registerrNotificationFromiOS10UP:(UIApplication *)application
{
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
// 必須寫(xiě)代理窃诉,不然無(wú)法監(jiān)聽(tīng)通知的接收與點(diǎn)擊
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
CCLog(@"用戶(hù)授權(quán)向APNs注冊(cè)饵史,獲取deviceToken");
[application registerForRemoteNotifications];
} else {
CCLog(@"用戶(hù)拒絕推送消息,注冊(cè)通知失敗==%@",error);
}
}];
}
/**
* iOS10以下iOS8以上注冊(cè)推送
*/
- (void)registRemoteForiOS8ToiOS10 {
UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notiSettings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
方法回調(diào)
//啟動(dòng)時(shí)聂薪,保存數(shù)據(jù)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSDictionary *launchDic = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
if ([launchDic isKindOfClass:[NSDictionary class]]) {
//保存遠(yuǎn)程推送信息
[self saveReceiveRemoteNotificationInfo:launchDic];
}
}
iOS10及以上方法回調(diào)
//不點(diǎn)擊痹换,在前臺(tái)時(shí)調(diào)用的方法
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
{
//建議將根據(jù)Notification進(jìn)行處理的邏輯統(tǒng)一封裝,后期可在Extension中復(fù)用~
[AppDelegate saveReceiveRemoteNotificationInfo:notification.request.content.userInfo];
[[NSNotificationCenter defaultCenter] postNotificationName:kReceiveRemoteNotification object:nil]; //接收到遠(yuǎn)程推送的通知精置,更新消息的請(qǐng)求等
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
}
/**
* (10.0系統(tǒng))用戶(hù)與通知進(jìn)行交互后的response计寇,比如說(shuō)用戶(hù)直接點(diǎn)開(kāi)通知或通知上的 按鈕來(lái),打開(kāi)App、用戶(hù)點(diǎn)擊通知的按鈕或者進(jìn)行輸入文本框的文本
*/
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void(^)())completionHandler
{
//在此番宁,可判斷response的種類(lèi)和request的觸發(fā)器是什么蹲堂,可根據(jù)遠(yuǎn)程通知和本地通知分別處理,再根據(jù)action進(jìn)行后續(xù)回調(diào)
NSDictionary *userInfo = response.notification.request.content.userInfo;
//處理遠(yuǎn)程推送跳轉(zhuǎn)
[AppDelegate dealWithRemoteNotificationInfo:userInfo];
}
iOS10以下:
//在前臺(tái)或者后臺(tái)點(diǎn)擊時(shí)執(zhí)行,通過(guò)判斷[UIApplication sharedApplication].applicationState
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
//處理遠(yuǎn)程推送跳轉(zhuǎn)
if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive) {
//顯示自定義的推送界面贝淤,刷新消息
}
else {
//點(diǎn)擊事件,刷新消息,進(jìn)行消息處理
[AppDelegate dealWithRemoteNotificationInfo:userInfo];
}
}
推送的Extension
分為service和UI的擴(kuò)展柒竞,service允許進(jìn)行網(wǎng)絡(luò)請(qǐng)求,音視頻處理等播聪,不知道為什么會(huì)造成推送消息的延遲朽基。公司通過(guò)服務(wù)器推送很慢,大概有30s的延遲离陶,是因?yàn)樘幚硗扑托畔⑼瓿傻腷lock沒(méi)有回調(diào)造成的稼虎。
但是相同的訂單通知,iOS10以下的手機(jī)很快就收到暫時(shí)沒(méi)有發(fā)現(xiàn)問(wèn)題所在招刨。
消息格式,mutable-content必須設(shè)置為字符串"1"
{"aps":{"alert":"Testing.. ","badge":1,"sound":"","mutable-content":"1"},"customContent":{"這是要播報(bào)的內(nèi)容"}}
DEBUG通知的extension --推送通知打斷點(diǎn)
選中擴(kuò)展target霎俩,在頂部工具欄的debug標(biāo)簽下選擇attach to process 選擇擴(kuò)展的名字.只有在iOS10系統(tǒng)以上,"mutable-content"設(shè)置為1沉眶,并且發(fā)送過(guò)一次推送后打却,才能打斷點(diǎn)。擴(kuò)展代碼應(yīng)該是懶加載的谎倔,推送一次過(guò)后才能打斷點(diǎn)柳击。
不能在extension中修改sound的值,否則會(huì)跳過(guò)之后的代碼片习,直接播放音頻文件捌肴。
我們的需求是iOS10以下播放錄的wav音頻文件(之前的音頻文件,來(lái)不及錄制新的音頻藕咏,希望在iOS10上實(shí)現(xiàn)靈活的語(yǔ)音功能状知,故用文字轉(zhuǎn)語(yǔ)音),iOS10以上用文字轉(zhuǎn)語(yǔ)音孽查。本來(lái)打算在iOS10中的extension里判斷是音頻文件就把sound的值msg.wav替換為default饥悴,然后用文字轉(zhuǎn)語(yǔ)音播放要朗讀的內(nèi)容。但是理想很豐滿(mǎn)現(xiàn)實(shí)很骨感卦碾。在通過(guò)kvc設(shè)置userinfo铺坞,修改sound的值時(shí)起宽,語(yǔ)音直接播放了msg.wav音頻文件洲胖,并且extension里之后的代碼都不執(zhí)行,直接跳過(guò)了坯沪。