一、簡介
1.概念
遠程推送通知:顧名思義,就是從遠程服務器推送給客戶端的通知,即需要聯網。
遠程推送服務,又稱為APNs(Apple Push Notification Services)
2.原因
使用遠程推送通知的原因是傳統獲取數據的局限性,只要用戶關閉了app,就無法跟app的服務器溝通,無法從服務器上獲得最新的數據內容。而遠程推送通知可以解決以上問題,不管用戶打開還是關閉app,只要聯網了,都能接收到服務器推送的遠程通知。
二、遠程推送實現
1.開發iOS程序的推送功能, iOS端需要做的事:
- 請求APNs服務器獲得deviceToken
- 得到APNs服務器返回的deviceToken
- 發送deviceToken給公司的服務器
- 監聽用戶對通知的點擊
2.代碼演練
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
// 客戶端如果想接收APNs的遠程推送通知,必須先注冊(得到用戶的授權),一般在App啟動完畢后就馬上注冊
// 程序一啟動就會調用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// iOS8及以后遠程通知必須先注冊設置
if([[UIDevicecurrentDevice].systemVersiondoubleValue] >= 8.0) { // iOS8
UIUserNotificationTypetype = UIUserNotificationTypeBadge| UIUserNotificationTypeSound| UIUserNotificationTypeAlert;
UIUserNotificationSettings*settings = [UIUserNotificationSettingssettingsForTypes:type categories:nil];
[application registerUserNotificationSettings:settings];
} else { // iOS8以下版本
UIRemoteNotificationTypetype = UIRemoteNotificationTypeBadge| UIRemoteNotificationTypeSound| UIRemoteNotificationTypeAlert;
// 在注冊app的Bundle ID時必須使用唯一的標識,不能用*,才可以有推送功能
// iOS7中只需要注冊通知類型就會同時注冊了遠程通知,iOS8及以后版本需要分別注冊設置和注冊通知
// 只要執行了該句代碼,就會自動向APNs服務器發送UUID和當前程序的Bundle ID請求DeviceToken
[application registerForRemoteNotificationTypes:type];
}
returnYES;
}
// 注冊成功推送設置時調用該方法
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
if (notificationSettings !=nil) {
// 注冊遠程通知——>用戶授權——>允許接收遠程推送
[application registerForRemoteNotifications];
}
}
// APNs服務器返回DeviceToken時調用
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// 將deviceToken發送給三方服務器,三方服務器給APNs服務器發送遠程推送請求,APNs推送至對應的移動設備
NSLog(@"%@", deviceToken);
}
// 遠程通知注冊失敗時調用
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"%@", error);
}
/*
iOS7以前假的多任務:如果應用程序在后臺, 只有用戶點擊了通知之后才會調用,如果應用程序在前臺,會直接調用該方法, 即便應用程序關閉也可以接收到遠程通知
*/
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary
*)userInfo {
// 該方法不能在后臺刷新界面,只有用戶點擊進入應用(進入前臺時會刷新界面)
NSLog(@"%@", userInfo);
}
/* iOS7以后的真實多任務: 應用程序在前臺或者后臺,都會直接調用該方法,即便應用程序關閉也可以接收到遠程通知
*/
// 一般使用這個方法代替上面的方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
NSNumber *contentid = userInfo[@"content-id"];
if (contentid) {
//注意: 在此方法中一定要調用這個調用block, 告訴系統是否處理成功.
// 以便于系統在后臺更新UI等操作
/*
UIBackgroundFetchResultNewData, 成功接收到數據
UIBackgroundFetchResultNoData, 沒有;接收到數據
UIBackgroundFetchResultFailed 接收失敗
*/
completionHandler(UIBackgroundFetchResultNewData);
} else
{
completionHandler(UIBackgroundFetchResultFailed);
}
}
@end
三、調試iOS遠程推送功能的必備條件
1.真機
2.調試推送需要的證書文件
- aps_development.cer : 某臺電腦就能調試某個app的推送服務
- ios_development.cer : 讓電腦具備真機調試的能力(調試設備)
- iphone6_qq.mobileprovision : 某臺電腦就能利用某臺設備調試某個程序
四、發布具有遠程推送服務的app
- aps_production.cer : 如果發布的程序中包含了推送服務,就必須安裝這個證書
- ios_distribution.cer : 讓電腦具備發布程序的能力
- qq.mobileprovision : 某臺電腦就能發布某個程序