APNS與VoIP

APNS

一膀斋、簡述APNS

APNS全稱是Apple Push Notification service(蘋果推送通知服務(wù)) 痕慢。是蘋果工程師們的杰作旷余。早期iOS設(shè)備CPU和內(nèi)存資源有限棚菊,為節(jié)約資源,系統(tǒng)不允許app進程常駐后臺警检,但是開發(fā)商需要有一個穩(wěn)定的網(wǎng)絡(luò)通道能每隔一段時間推送新的內(nèi)容到用戶設(shè)備,就是這個矛盾催促了apns的誕生害淤。

二扇雕、APNS機制

apns的機制,官網(wǎng)上一張圖窥摄,已經(jīng)說明了一切~


apns推送機制

三镶奉、APNS的限制

能夠有效收到apns推送,首先必須要確保設(shè)備處于online的狀態(tài)崭放。其次蘋果只會存儲發(fā)送給用戶一條最新的推送哨苛,之前發(fā)送的推送會被舍棄。而且每條離線推送是有過期時間的币砂。蘋果apns服務(wù)器每天要處理至少幾十億設(shè)置上百億條推送消息建峭,所以偶然的一次推送不成功,就不要糾結(jié)了~

四道伟、申請APNS推送證書

apns推送證書

如上圖所示迹缀,apns推送有生產(chǎn)證書和發(fā)布證書兩種,一般生產(chǎn)證書比較少會使用(前期與后臺調(diào)試使用蜜徽,只能直推祝懂,可真機測試)。發(fā)布證書是上線使用的拘鞋,根據(jù)發(fā)布證書生成p12文件砚蓬,與配置文件一起發(fā)給后臺即可。
這里提一下盆色,有使用推送功能的小伙伴灰蛙,別忘了勾選上appid設(shè)置里的Push Notifications。

五隔躲、代碼設(shè)置

  • 在didFinishLaunchingWithOptions方法里注冊apns推送摩梧。
UIApplication *application = [UIApplication sharedApplication];
application.applicationIconBadgeNumber = 0;
if (IOS10) { //iOS10+
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if (!error) {
                NSLog(@"succeeded!");
            }
        }];
        [application registerForRemoteNotifications];
    } else if (IOS8_10){ //iOS8-iOS10
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound) categories:nil];
        [application registerUserNotificationSettings:settings];
        [application registerForRemoteNotifications];
    } else { //iOS8以下
        [application registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
    }
  • 在didRegisterForRemoteNotificationsWithDeviceToken方法里獲取apns的deviceToken。
// 1.獲取deviceToken宣旱,并去除非法字符
    NSString *deviceTokenStr = [[deviceToken description] stringByReplacingOccurrencesOfString:@" " withString:@""];
    deviceTokenStr = [deviceTokenStr stringByReplacingOccurrencesOfString:@"<" withString:@""];
    deviceTokenStr = [deviceTokenStr stringByReplacingOccurrencesOfString:@">" withString:@""];
// 2.保存deviceToken
    NSUserDefaults *groupDefault = [[NSUserDefaults alloc] initWithSuiteName:EUCGroupDefaultsName];
    [groupDefault setValue:checkValue(deviceTokenStr) forKey:EUCDeviceTokenKey];
    [groupDefault synchronize];
  • 在didFailToRegisterForRemoteNotificationsWithError方法里清空問題deviceToken仅父。
    NSUserDefaults *groupDefault = [[NSUserDefaults alloc] initWithSuiteName:EUCGroupDefaultsName];
    [groupDefault setValue:checkValue(@"") forKey:EUCDeviceTokenKey];
    [groupDefault synchronize];
  • iOS8在didRegisterUserNotificationSettings方法里注冊推送。
[application registerForRemoteNotifications];
  • 在didReceiveRemoteNotification方法里做跳轉(zhuǎn)處理,本地推送也會執(zhí)行此方法笙纤。

VoIP

一耗溜、簡述VoIP

VOIP全稱voice-over-ip,是iOS8新引入的一種推送方式類型省容。它可以使用戶收到一個來電時喚醒App抖拴。有了這種新推送,麻麻再也不用擔(dān)心App長時間在后臺被系統(tǒng)殺死的問題了腥椒,因為這種推送消息可以在后臺喚醒App阿宅。

二、申請VoIP推送證書

voip推送證書

VoIP推送證書只有發(fā)布證書笼蛛,所以調(diào)試起來是個問題家夺。小伙伴在處理這個問題上一定要有耐心

三伐弹、xcode配置

  • xcode9之前配置主target下capabilities的Background Modes
    VoIP配置2
  • xcode9+配置plist文件
    VoIP配置1
  • Link Binary With Libraries里引入PushKit系統(tǒng)動態(tài)庫


    引入系統(tǒng)庫

四拉馋、代碼設(shè)置

  • 在didFinishLaunchingWithOptions方法里注冊VoIP推送
    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0)
    {
        PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
        pushRegistry.delegate = self;
        pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
    }
  • 在pushKit回調(diào)方法didUpdatePushCredentials里獲取VoIP的deviceToken
// 1.獲取deviceToken,并去除非法字符
NSString *deviceTokenStr = [[credentials.token description] stringByReplacingOccurrencesOfString:@" " withString:@""];
deviceTokenStr = [deviceTokenStr stringByReplacingOccurrencesOfString:@"<" withString:@""];
deviceTokenStr = [deviceTokenStr stringByReplacingOccurrencesOfString:@">" withString:@""];
// 2.本地保存deviceToken
NSUserDefaults *groupDefault = [[NSUserDefaults alloc] initWithSuiteName:EUCGroupDefaultsName];
[groupDefault setValue:checkValue(deviceTokenStr) forKey:EUCDeviceTokenKey];
[groupDefault synchronize];
  • 在pushKit回調(diào)方法didInvalidatePushTokenForType里清除問題deviceToken
NSUserDefaults *groupDefault = [[NSUserDefaults alloc] initWithSuiteName:EUCGroupDefaultsName];
[groupDefault setValue:checkValue(@"") forKey:EUCDeviceTokenKey];
    [groupDefault synchronize];
  • 在pushKit回調(diào)方法didReceiveIncomingPushWithPayload處理VoIP推送惨好。一般做本地推送處理或者結(jié)合callKit彈出電話頁面煌茴。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市日川,隨后出現(xiàn)的幾起案子蔓腐,更是在濱河造成了極大的恐慌,老刑警劉巖龄句,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件回论,死亡現(xiàn)場離奇詭異,居然都是意外死亡分歇,警方通過查閱死者的電腦和手機傀蓉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來职抡,“玉大人葬燎,你說我怎么就攤上這事「克Γ” “怎么了谱净?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長擅威。 經(jīng)常有香客問我壕探,道長,這世上最難降的妖魔是什么郊丛? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任李请,我火速辦了婚禮派继,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捻艳。我一直安慰自己,他們只是感情好庆猫,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布认轨。 她就那樣靜靜地躺著,像睡著了一般月培。 火紅的嫁衣襯著肌膚如雪嘁字。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天杉畜,我揣著相機與錄音纪蜒,去河邊找鬼。 笑死此叠,一個胖子當著我的面吹牛纯续,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灭袁,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼猬错,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了茸歧?” 一聲冷哼從身側(cè)響起倦炒,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎软瞎,沒想到半個月后逢唤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡涤浇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年鳖藕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片只锭。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡吊奢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纹烹,到底是詐尸還是另有隱情页滚,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布铺呵,位于F島的核電站裹驰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏片挂。R本人自食惡果不足惜幻林,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一贞盯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沪饺,春花似錦躏敢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至遭居,卻和暖如春啼器,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俱萍。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工端壳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枪蘑。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓损谦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親岳颇。 傳聞我的和親對象是個殘疾皇子成翩,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 極光推送: 1.JPush當前版本是1.8.2,其SDK的開發(fā)除了正常的功能完善和擴展外也緊隨蘋果官方的步伐赦役,SD...
    Isspace閱讀 6,724評論 10 16
  • 前言 現(xiàn)在第三方推送也很多 麻敌,比如極光,融云掂摔,信鴿术羔,其原理也是相同利用APNS推送機制 ,公司讓做自己的推送乙漓。避免...
    修_遠閱讀 10,848評論 9 19
  • 注:此文只現(xiàn)在已經(jīng)不能適配iOS10了级历,iOS10推送采用了新的方法,做iOS9及以下的系統(tǒng)可讀此篇文章叭披。 最近公...
    TIME_for閱讀 33,292評論 85 322
  • 概述 在多數(shù)移動應(yīng)用中任何時候都只能有一個應(yīng)用程序處于活躍狀態(tài)寥殖,如果其他應(yīng)用此刻發(fā)生了一些用戶感興趣的那么通過通知...
    莫離_焱閱讀 6,520評論 1 8
  • 尺素不吃素閱讀 165評論 0 0