之前開發(fā)過幾個APP,都有推送功能,但由于一直都是其他同事接手,沒怎么接觸過。
剛好當前項目需要配備極光推送,小編做了個小結(jié)
***備注:
1、至于蘋果推送的原理就不再描述,側(cè)重介紹推送開發(fā)的流程及代碼
2、由于很多設(shè)備系統(tǒng)都升級了,所以這里只介紹IOS8.0 以上的推送
一、系統(tǒng)自帶方法
第一步導入#import <UserNotifications/UserNotifications.h>
且要遵守<UNUserNotificationCenterDelegate>的協(xié)議,在Appdelegate.m中。
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif
第二步我們需要在 (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中注冊通知,代碼如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//iOS10特有
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
// 必須寫代理,不然無法監(jiān)聽通知的接收與點擊
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
// 點擊允許
NSLog(@"注冊成功");
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
NSLog(@"%@", settings);
}];
}
else {
// 點擊不允許
NSLog(@"注冊失敗");
}
}];
}
else if ([[UIDevice currentDevice].systemVersion floatValue] >8.0){
//iOS8 - iOS10
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil]];
}
// 注冊獲得device Token
[[UIApplication sharedApplication] registerForRemoteNotifications];
第三步:獲取Device Token (不區(qū)分系統(tǒng)版本,都是一樣的)
// 獲得Device Token
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@"%@", [NSString stringWithFormat:@"Device Token: %@", deviceToken]);
}
// 獲得Device Token失敗
- (void)application:(UIApplication *)application
didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}
蘋果提供了方法處理通知的接收和點擊,將分別介紹iOS10 以上 以及 iOS 10 以下
iOS8 ~ iOS10
方法1:
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
}
方法2:
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:
(void (^)(UIBackgroundFetchResult))completionHandler {
//系統(tǒng)要求必須調(diào)用這個方法
completionHandler(UIBackgroundFetchResultNewData);
}
方法3:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
插曲:先介紹方法1和方法2的區(qū)別。
方法2是方法1的升級版,也就是說,如果同時實現(xiàn)了兩個方法,那么只調(diào)用方法2。
更多詳情:點擊查看Coco-LG
接收、點擊推送 分APP分以下狀態(tài)
狀態(tài)一:APP 前臺狀態(tài)(無彈框)
當有推送消息時,如果方法1 和 方法2都實現(xiàn)了,只調(diào)用方法2 ,在這方法中可以獲取推送內(nèi)容。
備注:IOS 10 以前,如果APP在前臺收到推送消息是不會彈出彈框,所以如果要彈框,只能是自己添加UI。
狀態(tài)二:APP 后臺狀態(tài)(有彈框)
有推送消息時有彈框,點擊彈框,如果方法1 和 方法2都實現(xiàn)了,只調(diào)用方法2 ,在這方法中獲取推送內(nèi)容。
如果只實現(xiàn)方法1,調(diào)用方法1。
備注:只有點擊了才會調(diào)用方法1或方法2
狀態(tài)三:APP 被殺死(有彈框)
點擊推送消息
如果,有實現(xiàn)方法2,會先執(zhí)行方法2,再執(zhí)行方法3。(備注:程序被殺死,方法1在任何情況都是不會被調(diào)用的)
如果,沒有實現(xiàn)方法2,則執(zhí)行方法3。所以要在方法3中獲取推送內(nèi)容
iOS10 以上
方法4:
// 接收通知
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); // 需要執(zhí)行這個方法,選擇是否提醒用戶,有Badge、Sound、Alert三種類型可以設(shè)置
}
方法5:
// 通知的點擊事件
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{
completionHandler(); // 系統(tǒng)要求執(zhí)行這個方法
}
狀態(tài)一:APP 前臺狀態(tài)(有彈框)
1、接收到通知,觸發(fā)方法4
2、點擊彈框,觸發(fā)方法5
狀態(tài)二:APP 后臺狀態(tài)或被殺死(有彈框)
點擊彈框,觸發(fā)方法5
可以在這個方法中獲取推送消息
//適配IOS10 以下的推送
if (!IOS10) {
_remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
}
極光推送(版本:3.0.5)
使用cocoaPods導入極光推送SDK
待續(xù)...(因為上傳圖片失敗...)
參考文章:
頂起_那片天:iOS集成極光推送之后,我還得這樣做
無聊肥貓:iOS9和iOS10推送通知處理小結(jié)
Jeff_Kitty:iOS開發(fā)之極光推送的那些坑
iOS用戶點擊推送消息進入應(yīng)用后,如何跳轉(zhuǎn)到對應(yīng)的ViewController
iOS實現(xiàn)遠程推送原理及過程
極光推送集成文檔