iOS APP 推送終結(jié)版

這篇文章我同事總結(jié)的, 感謝茗莢小草, 以下為原文.


iOS 7 - 基本的通知推送
iOS 8 - 通知+自定義button
iOS 9 - 通知+自定義button+快捷回復(fù)

使用Houston在本地調(diào)試遠(yuǎn)程通知

安裝houston

gem install houston

安裝完之后

apn push "<19904e80 0ab7f3e7 bc59ba36 3fda26f3 f4c69568 81cecc7f 4c675143 ba6fc83d>" -c /Users/bjhl/Desktop/apppush_for_CRM/apple_push_notification.pem -m "hello" -b "15"  -d key=CRM -y actionCategory

-c 指定.pem文件的地址蛤织,-m 通知的文本內(nèi)容 夭拌,-b 角標(biāo)的數(shù)量台汇, -y category的標(biāo)識(shí)符
要發(fā)送靜默通知即纲,.pem 文件之后,只添加-n 即可谭网。-n 代表content-availabel
"<>"中的string為deviceToken汪厨。

在使用之前首先需要準(zhǔn)備好pem證書(shū)文件

  • pem文件由鑰匙串中的Push Services證書(shū)和它的私鑰文件導(dǎo)出的p12文件轉(zhuǎn)化的來(lái)的。
  • 在鑰匙串中同時(shí)選中Push Services證書(shū)和它的私鑰文件蜻底,右鍵導(dǎo)出為cert.p12文件骄崩,
  • 使用下面的命令,將p12文件轉(zhuǎn)化為applepushnotification.pem文件
openssl pkcs12 -in cert.p12 -out applepushnotification.pem -nodes -clcerts
  • 有了pem文件就可以開(kāi)始在終端測(cè)試遠(yuǎn)程通知了薄辅,pem文件在鏈接APNS時(shí)需要使用要拂。

Push Services證書(shū)

  • 首先需要生成一個(gè)certSigningRequest(CSR)文件
  • 打開(kāi)應(yīng)用程序中的“鑰匙串訪問(wèn)”軟件,從菜單中選擇 “鑰匙串訪問(wèn)”-》“證書(shū)助理”-》“從證書(shū)頒發(fā)機(jī)構(gòu)請(qǐng)求證書(shū)”站楚,郵箱和名稱(chēng)填寫(xiě)脱惰,然后選擇保存到磁盤(pán),就可以在本地生成一個(gè)CertificateSigningRequest.certSigningRequest文件.
  • developer.apple.com窿春,在App IDs列表找到CRM的拉一,進(jìn)入編輯,勾選Push Notifications旧乞。打開(kāi)推送服務(wù)蔚润。
  • 生成推送證書(shū).cer文件。用于生產(chǎn)服務(wù)端需要的文件.pem尺栖。
  • 勾選Push Notification之后嫡纠,出現(xiàn)一個(gè)列表,用來(lái)Manage and generate your certificates below延赌。對(duì)應(yīng)著生成Development SSL Certificate和Production SSL Certificate除盏。選擇Development SSL Certificate的create Certificate。
  • 首先會(huì)提示你需要一個(gè)CSR文件挫以。就是第一步中使用鑰匙串生成的文件者蠕,上傳,continue掐松,continue踱侣,就可以下載一個(gè)aps_development.cer文件。保存到本地
  • 雙擊該文件大磺,鑰匙串中就會(huì)出現(xiàn)一個(gè)Apple Development IOS push services證書(shū)泻仙。
  • 之后就可以進(jìn)行準(zhǔn)備pem文件操作了。

上述準(zhǔn)備工作做好之后量没,xcode運(yùn)行

通過(guò)didRegisterForRemoteNotificationsWithDeviceToken 獲取deviceToken

  • 可能出現(xiàn)didFailToRegisterForRemoteNotificationsWithError: error = Code=3000 "未找到應(yīng)用程序的“aps-environment”的授權(quán)字符串" ;
  • 需要檢查xcode 的TARGETS-capabilities 打開(kāi)Push Notifications開(kāi)關(guān)玉转。
  • 打開(kāi)Push Notifications開(kāi)關(guān)

app處理接收到的通知

根據(jù)收到通知時(shí),app的不同狀態(tài)殴蹄,app的處理方式不同

  • app不在運(yùn)行狀態(tài)究抓。推送通知顯示猾担,當(dāng)用戶(hù)點(diǎn)擊通知,app的 - application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;方法會(huì)被調(diào)用刺下,通知內(nèi)容通過(guò)launchOptions參數(shù)的形式被傳遞并處理
  • app運(yùn)行在前臺(tái)绑嘹。推送通知不會(huì)被顯示,app收到通知后會(huì)立即調(diào)用方法-application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
  • app在運(yùn)行狀態(tài)橘茉,且不在前臺(tái)工腋,用戶(hù)點(diǎn)擊通知,app進(jìn)入前臺(tái)畅卓,調(diào)起方法 - application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
    image

    iOS7中通知的代理方法
- application:didReceiveLocalNotification:(iOS 4.0–10.0Deprecated)  
- application:didReceiveRemoteNotification:(app在前臺(tái)時(shí)才會(huì)調(diào)用, iOS 3.0–10.0Deprecated)  
- application:didReceiveRemoteNotification:fetchCompletionHandler:(當(dāng)收到遠(yuǎn)程推送擅腰,該方法會(huì)被調(diào)用,iOS 7.0+)  

iOS8中推送代理方法只有兩個(gè):

- application:handleActionWithIdentifier:forRemoteNotification:completionHandler:(iOS 8.0–10.0Deprecated)  
- application:handleActionWithIdentifier:forLocalNotification:completionHandler:(iOS 8.0–10.0Deprecated)  

iOS8中方法中的idenfier參數(shù)就對(duì)應(yīng)著不同的action的唯一標(biāo)識(shí),用戶(hù)點(diǎn)擊通知上任何一個(gè)自定義的action之后翁潘,都會(huì)調(diào)用此方法

iOS 10中推送

 UNUserNotificationCenterDelegate 

可交互的通知

iOS8擁有了全新的通知中心趁冈,有全新的通知機(jī)制。當(dāng)屏幕頂部收到推送時(shí)只需要往下拉拜马,就能看到快速操作界面渗勘,并不需要進(jìn)入該應(yīng)用才能操作。在鎖屏界面俩莽,對(duì)于推送項(xiàng)目也可以快速處理旺坠。基本上就是讓用戶(hù)盡量在不離開(kāi)當(dāng)前頁(yè)面的前提下處理推送信息扮超,再次提高處理效率取刃。
app不在前臺(tái)時(shí),出現(xiàn)推送通知瞒津,下拉或者3D touch 該通知都可以出現(xiàn)自定義的操作蝉衣。

image

一般的遠(yuǎn)程推送消息 payload最大為2kb括尸,256字節(jié)巷蚪,超過(guò)該限制,APNS拒絕轉(zhuǎn)發(fā)濒翻。

payload實(shí)際是一個(gè)JSON字典

  • payload中主要的aps字典部分能做到
  • 展示一個(gè)通知消息給用戶(hù)
  • 展示app的角標(biāo)屁柏,
  • 播放一段聲音
  • 靜默通知, 比如悄悄升級(jí)
  • 需要content-availabel=1,不能包括alert,sound,badge
  • 調(diào)起方法application:didReceiveRemoteNotification:fetchCompletionHandler:
  • 需要檢查xcode 的targets->capabilities,勾選Background Modes中的Remote notifications
  • aps數(shù)據(jù)部分的key:value,(其中的key是有apple定義的)
  • alert:內(nèi)容可以使簡(jiǎn)單的string有送,也可以是Dictionary
  • badge:app的角標(biāo)
  • sound:聲音文件的名字string淌喻,然后在app的bundle中去尋找
  • content-availabel:數(shù)字,為1表示靜默通知
  • category:string,根據(jù)字符串去app中匹配自定義的一組action

初始化

要使用自定義的action雀摘,需要先判斷當(dāng)前系統(tǒng)為8.0+裸删,再使用UIUserNotificationSettings,UIMutableUserNotificationCategory阵赠,UIMutableUserNotificationAction涯塔,自定義通知的操作肌稻。

  • 初始化多個(gè)action
         UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
        //UIUserNotificationActivationModeBackground 不會(huì)調(diào)起app到前臺(tái),在后臺(tái)處理
        //UIUserNotificationActivationModeForeground 點(diǎn)擊該按鈕時(shí)啟動(dòng)app到前臺(tái),且當(dāng)前模式下setAuthenticationRequired默認(rèn)為YES匕荸,
        [action1 setActivationMode:UIUserNotificationActivationModeBackground];
        [action1 setTitle:@"Background"];//展示在通知上的title
        [action1 setIdentifier:@"action1"];//action的唯一標(biāo)識(shí)
        [action1 setDestructive:YES];//當(dāng)前操作按鈕為紅色
        [action1 setAuthenticationRequired:YES];//需要解鎖與否
        ……
        action2, action3, action4, action5, action6, action7
  • 使用一組action初始化UIMutableUserNotificationCategory
        UIMutableUserNotificationCategory *actionCategory = [[UIMutableUserNotificationCategory alloc] init];
        [actionCategory setIdentifier:@"actionCategory"];//這組動(dòng)作的標(biāo)識(shí)爹谭,同后臺(tái)約定
        [actionCategory setActions:@[action1, action2, action3, action4, action5, action6, action7] forContext:UIUserNotificationActionContextDefault];
        //使用UIUserNotificationActionContextDefault沒(méi)有action數(shù)目限制,但是action過(guò)多屏幕太短也無(wú)力……榛搔,UIUserNotificationActionContextMinimal不展示action
  • 使用category初始化UIUserNotificationSettings ,注冊(cè)遠(yuǎn)程通知
        NSSet *category = [NSSet setWithObject:actionCategory];
        UIUserNotificationType types = (UIUserNotificationTypeAlert|UIUserNotificationTypeSound|UIUserNotificationTypeBadge);
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:category];
        
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        [[UIApplication sharedApplication] registerForRemoteNotifications];

iOS8以下的系統(tǒng)诺凡,注冊(cè)遠(yuǎn)程通知:

       [[UIApplication sharedApplication] registerForRemoteNotificationTypes:  
     (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
  • 遠(yuǎn)程通知的處理
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    NSLog(@"application:didReceiveRemoteNotification:fetchCompletionHandler");

    //TODO:對(duì)遠(yuǎn)程通知的處理

    if(completionHandler) {
        completionHandler(UIBackgroundFetchResultNoData);
    }
}
    
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler {
    NSLog(@"handleActionWithIdentifier:forRemoteNotification");
        //TODO:對(duì)遠(yuǎn)程通知的處理,用戶(hù)tap了identifier匹配的action之后的操作

    if(completionHandler) {
        completionHandler();
    }
}

通知中心的快速回復(fù) iOS 9.0–10.0Deprecated

以上為點(diǎn)擊通知的按鈕践惑,進(jìn)行操作腹泌,iOS9增加了一個(gè)供用戶(hù)快速回復(fù)的Category類(lèi)型
UIUserNotificationActionBehaviorTextInput(iOS 9.0–10.0Deprecated

  • 快捷輸入action的初始化
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {
            //iOS 支持在通知中心快速回復(fù)輸入文字
            UIMutableUserNotificationAction *inputAction = [[UIMutableUserNotificationAction alloc] init];
            inputAction.behavior = UIUserNotificationActionBehaviorTextInput;
            inputAction.activationMode = UIUserNotificationActivationModeBackground;
            [inputAction setTitle:@"inputAction"];
            [inputAction setIdentifier:@"inputAction"];
            [inputAction setDestructive:NO];
            //設(shè)置發(fā)送鍵的title
            inputAction.parameters = @{UIUserNotificationTextInputActionButtonTitleKey:@"哇塞"};
        }
  • 對(duì)于快捷輸入的action,需要使用
 - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler; 

方法中的responseInfo中的UIUserNotificationActionResponseTypedTextKey對(duì)應(yīng)的value來(lái)獲取輸入的文字童本。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末真屯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子穷娱,更是在濱河造成了極大的恐慌绑蔫,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泵额,死亡現(xiàn)場(chǎng)離奇詭異配深,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嫁盲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)篓叶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人羞秤,你說(shuō)我怎么就攤上這事缸托。” “怎么了瘾蛋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵俐镐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我哺哼,道長(zhǎng)佩抹,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任取董,我火速辦了婚禮棍苹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茵汰。我一直安慰自己枢里,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著栏豺,像睡著了一般梭灿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冰悠,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天堡妒,我揣著相機(jī)與錄音,去河邊找鬼溉卓。 笑死皮迟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桑寨。 我是一名探鬼主播伏尼,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼尉尾!你這毒婦竟也來(lái)了爆阶?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沙咏,失蹤者是張志新(化名)和其女友劉穎辨图,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肢藐,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡故河,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吆豹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鱼的。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖痘煤,靈堂內(nèi)的尸體忽然破棺而出凑阶,到底是詐尸還是另有隱情,我是刑警寧澤衷快,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布宙橱,位于F島的核電站,受9級(jí)特大地震影響烦磁,放射性物質(zhì)發(fā)生泄漏养匈。R本人自食惡果不足惜哼勇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一都伪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧积担,春花似錦陨晶、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)湿刽。三九已至,卻和暖如春褐耳,著一層夾襖步出監(jiān)牢的瞬間诈闺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工铃芦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雅镊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓刃滓,卻偏偏與公主長(zhǎng)得像仁烹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咧虎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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