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,勾選里邊的
如果你的app id這個東西死活都點擊不了,那說明,你的app id命名不對,命名不能包含通配符*
接下來就是添加csr證書了,這個網上很多教程,很簡單就搞定了
這個時候你的app id推送這一欄應該是這樣的
我這里已經配好了開發者,如果你還沒有配置開發者推送證書的話,那么兩個都應該是黃色的點
接下來,創建開發者推送證書
下一步
然后選擇你剛才的app id
接下來還是csr,如果你之前創建過的有csr直接用就行,這樣,開發者推送證書就搞定了(如果別人要用,要把這個證書導出,在鑰匙串哪里,直接導出,后綴是p12的,最好設置一個密碼,第三方用這個證書配置你app的時候,要用到密碼的)
接下來,就是描述文件了,描述文件就是把你的app id跟證書綁定到一塊的東西
如果已經存在的有開發者描述文件了,直接點進去,選擇edit(如果沒有,那就直接添加一個,過程是一樣的)
app id選擇你剛才的,證書選擇你的開發者證書(不是剛才創建的那個推送證書)設備一般都是全選,一路點擊到底,最后down下來。
到此,你的開發者推送證書也已經搞定了,接下來就要開始愉快的測試了
--------------我是可愛的分割線-----------------
如果想要真機測試收到消息,在xcode中,(好像是ios10之后)必須要手動開啟推送服務
ios10之前,收到通知處理相關邏輯是這個
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler{
NSLog(@"收到的推送信息為------%@",userInfo);
completionHandler(UIBackgroundFetchResultNewData);
}
這里的userinfo就是收到的東西,是一個字典,格式為
你可以根據需要,取出里邊的東西
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];
}
至此,注冊通知,證書配置,消息處理,就搞定了,如果有什么錯誤的地方,還請大牛指正。????