ios10推送--從證書創建到消息處理

ios10更新以來,推送改的還是很多的,讓我們從頭說來
先說系統注冊遠程通知,ios10之后,注冊方法變成了這樣

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionCarPlay) completionHandler:^(BOOL granted, NSError *_Nullable error) {
            if (!error) {
                NSLog(@"request authorization succeeded!");
            }
        }];
        [[UIApplication sharedApplication] registerForRemoteNotifications];

注意,用這個方法,需要你引入這個,并遵循代理(因為之后的處理收到的消息時會用到)

#import <UserNotifications/UserNotifications.h>
UNUserNotificationCenterDelegate

ios8之后,還需要添加這個方法

//ios8之后,需要添加這個方法
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    [application registerForRemoteNotifications];
}

成功之后,會走注冊成功的代理

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

在這個方法里,你可以獲取到apns服務器返回的devicetoken,用這個token來注冊第三方的推送平臺
順便說一下,第三方推送的過程,1.程序向蘋果服務器,注冊獲取devicetoken,2.第三方服務器根據devicetoken,注冊程度,返回一個cid,3.如果程序在運行,ios10之前,是直接走的是第三方的透傳消息成功通道,ios10之后,先走的是系統自己的收到通知的方法,然后再走的是第三方的成功方法,4.程序在后臺,第三方會通過apns服務器來推送消息

NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
[customPlatform  registerDeviceToken:token];//根據自己的使用的平臺來替換customPlatform

如果第三方平臺注冊成功了,會走平臺自己的成功回調,返回一個cid(第三方平臺的一個id,綁定了你的devicetoken)
第三方平臺注冊賬號,綁定你的app這個就不說了,每個第三方都很明白的寫出來了。
好了,到現在你的注冊已經搞定了------注意,模擬器也可以成功注冊(雖然一直走的是系統注冊失敗的方法,但是你在第三方的成功回調中,會得到cid),但是不支持推送測試的。
--------------我是分割線---------------
真機測試推送,創建證書流程
如果你之前創建的有測試用的app id,但是沒有開啟推送功能,很好辦
找到這個app id,點擊edit,勾選里邊的

屏幕快照 2016-12-23 下午1.57.56.png

如果你的app id這個東西死活都點擊不了,那說明,你的app id命名不對,命名不能包含通配符*
接下來就是添加csr證書了,這個網上很多教程,很簡單就搞定了
這個時候你的app id推送這一欄應該是這樣的


push.png

我這里已經配好了開發者,如果你還沒有配置開發者推送證書的話,那么兩個都應該是黃色的點
接下來,創建開發者推送證書

屏幕快照 2016-12-23 下午2.06.23.png

下一步

aa.png

然后選擇你剛才的app id

id.png

接下來還是csr,如果你之前創建過的有csr直接用就行,這樣,開發者推送證書就搞定了(如果別人要用,要把這個證書導出,在鑰匙串哪里,直接導出,后綴是p12的,最好設置一個密碼,第三方用這個證書配置你app的時候,要用到密碼的)
接下來,就是描述文件了,描述文件就是把你的app id跟證書綁定到一塊的東西

pp.png

如果已經存在的有開發者描述文件了,直接點進去,選擇edit(如果沒有,那就直接添加一個,過程是一樣的)

d.png

app id選擇你剛才的,證書選擇你的開發者證書(不是剛才創建的那個推送證書)設備一般都是全選,一路點擊到底,最后down下來。
到此,你的開發者推送證書也已經搞定了,接下來就要開始愉快的測試了
--------------我是可愛的分割線-----------------
如果想要真機測試收到消息,在xcode中,(好像是ios10之后)必須要手動開啟推送服務

sehzhi1.png
shezhi2.png

ios10之前,收到通知處理相關邏輯是這個

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler{
  NSLog(@"收到的推送信息為------%@",userInfo);
  completionHandler(UIBackgroundFetchResultNewData);
}

這里的userinfo就是收到的東西,是一個字典,格式為

dic.png

你可以根據需要,取出里邊的東西
ios10之后,收到通知是這個方法,不管是本地的還是遠程,都是這個方法,你可以在這里寫上彈窗來提提示用戶(應用在打開的情況下,沒有在后臺也沒殺死)

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    NSDictionary *dic = notification.request.content.userInfo;
 completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
}

如果要處理收到的通知(例如,點擊通知跳轉或者彈窗等)是在這個方法里寫(如果你寫了上邊的那個處理方法,這個方法可以不用寫,api是向下兼容的,如果不寫下邊這個,也是可以的),只有程序在后臺或者殺死,才能收到系統的彈窗

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
#pragma mark -- 測試點擊 --
    NSString* alertStr = nil;
    NSDictionary *dic = response.notification.request.content.userInfo;
    NSDictionary *apsInfo = [dic objectForKey:@"aps"];
    NSObject *alert = [apsInfo objectForKey:@"alert"];
    if ([alert isKindOfClass:[NSString class]])
    {
        alertStr = (NSString*)alert;
    } else if ([alert isKindOfClass:[NSDictionary class]])
    {
        NSDictionary* alertDict = (NSDictionary*)alert;
        alertStr = [alertDict objectForKey:@"body"];
    }
//這里,以跳轉為例(這里,是程序在后臺,但是沒有殺死的情況)
    TongzhiController *tongzhi = [[TongzhiController alloc] init];
    UINavigationController *na = [[UINavigationController alloc] initWithRootViewController:tongzhi];
    [self.window.rootViewController presentViewController:na animated:YES completion:nil];
    NSLog(@"-------%@", response.notification.request.content.userInfo);
    completionHandler();
}

如果程序已經被殺死,點開還想跳轉目的界面,需要在delegete中啟動的方法里寫(這里需要注意一下,如果你已經在點擊通知的那個方法已經寫好了處理,即使程序被殺死,你的處理也會執行,下邊這個方法,不寫也沒問題)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//收到的遠程推送內容
NSDictionary *dic = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
//這里以alert提示為例,你也可以寫別的處理
if (dic) {
        UIAlertView *textAlert = [[UIAlertView alloc] initWithTitle:@"kill" message:(dic[@"aps"])[@"alert"] delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確認", nil];
        [textAlert show];
    }

至此,注冊通知,證書配置,消息處理,就搞定了,如果有什么錯誤的地方,還請大牛指正。????

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容