遠程推送代碼實現
在iOS7下
- 注冊遠程通知
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// UIRemoteNotificationTypeBadge = 1 << 0, 應用圖標右上角數字
// UIRemoteNotificationTypeSound = 1 << 1, 聲音
// UIRemoteNotificationTypeAlert = 1 << 2, 提示
// UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3, 新聞,國內幾乎沒人使用
// 遠程通知類型
UIRemoteNotificationType remoteTypes = UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert;
// 注冊遠程通知(在iOS8被廢棄了)
[application registerForRemoteNotificationTypes:remoteTypes];
return YES;
}
- 實現注冊遠程通知返回deviceToken的回調方法
/**
* 當APNs返回deviceToken會調用,該方法
*
* @param application 當前應用對象
* @param deviceToken 設備令牌
*/
- (void) application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"%@",deviceToken);
}
- 實現注冊遠程通知失敗回調方法,用于檢查失敗原因方便調試
/**
* 當從APNs獲取deviceToken失敗的時候會回調該方法
*
* @param application 應用
* @param error 錯誤
*/
- (void) application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
NSLog(@"%@",error);
}
- 實現點擊遠程通知,進入App調用的方法
/**
* 處理點擊遠程通知的頁面跳轉處理
*/
- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSLog(@"%s",__FUNCTION__);
}
在Xcode6.4 iOS7的環(huán)境下運行程序,得到如下錯誤
Error Domain=NSCocoaErrorDomain Code=3010 "remote notifications are not supported in the simulator" UserInfo=0x7fc91b467e70 {NSLocalizedDescription=remote notifications are not supported in the simulator}
由于在Xcode6.4下模擬器不能調試推送,DeviceToken都獲取不到,我這邊沒有iOS7的真機設備,所以只能說大致的流程是這樣子的.
遠程推送通知iOS7與iOS8最主要不同點就是注冊遠程通知以及iOS8提供了對Catgory的支持,其他的基本都是相同的.
在iOS8以后
egisterForRemoteNotificationTypes:方法在iOS8.0 和以后不再支持了. 一般來說,遇到這樣情況,那么在registerForRemoteNotificationTypes方法的注釋中,說明在iOS8以后應該怎么做! 我點去這個方法
他說:這個方法在iOS8.0被廢棄了,讓使用registerForRemoteNotification 和 registerUseNotificationSettings來替代
我要支持iOS7和iOS8需要修改 didFinishLaunchingWithOptions: 方法中注冊遠程通知的代碼,修改后的完整代碼,如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 如果application能夠響應這個方法,那么證明當前iOS版本為iOS8.0及以后
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
// 1.請求用戶權限(注冊用戶通知設置信息),這個方法與本地通知相同
// 1.1 請求通知類型
UIUserNotificationType types = UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound;
// 1.2 創(chuàng)建用戶通知設置信息,categories是用來定制通知的時候的按鈕的與本地通知相同
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:types categories:nil];
// 1.3 注冊用戶通知設置信息
[application registerUserNotificationSettings:setting];
// 2.注冊遠程通知
[application registerForRemoteNotifications];
return YES;
}
// 能走到下面說明是iOS8.0之前
// UIRemoteNotificationTypeBadge = 1 << 0, 應用圖標右上角數字
// UIRemoteNotificationTypeSound = 1 << 1, 聲音
// UIRemoteNotificationTypeAlert = 1 << 2, 提示
// UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3, 新聞,國內幾乎沒人使用
// 遠程通知類型
UIRemoteNotificationType remoteTypes = UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert;
// 注冊遠程通知(在iOS8被廢棄了)
[application registerForRemoteNotificationTypes:remoteTypes];
return YES;
}
修改完畢,再次運行程序到真機上,這是用戶手機上有提示信息
點擊 "好" 即可,如果點擊了"不允許"的話,還去設置中進行設置.
等待一分鐘左右,會從返回APNs測試服務器返回一個deviceToken,它代表著是那個真機設備.將來Provider發(fā)送通知是需要使用到她
<afc70037 3adb7d1c 3529032b be1582b9 49a1a89d 995da320 b6d78c93 b7d9a3a4>
- 使用Provider發(fā)送遠程通知
- Provider集成是服務端的事情,不用我們搞.