你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS網絡推送通知

iOS網絡推送通知

編輯:IOS開發綜合

推送通知是由應用服務提供商發起的,通過蘋果的APNs(Apple Push Notification Server)發送到應用客戶端。

推送通知的過程可以分為以下幾步:

應用服務提供商從服務器端把要發送的消息和設備令牌(device token)發送給蘋果的消息推送服務器APNs。
APNs根據設備令牌在已注冊的設備(iPhone、iPad、iTouch、mac等)查找對應的設備,將消息發送給相應的設備。
客戶端設備接將接收到的消息傳遞給相應的應用程序,應用程序根據用戶設置彈出通知消息。

1.應用程序注冊APNs推送消息

說明:

a.只有注冊過的應用才有可能接收到消息,程序中通常通過UIApplication的registerUserNotificationSettings:方法注冊,iOS8中通知注冊的方法發生了改變,如果是iOS7及之前版本的iOS請參考其他代碼。

b.注冊之前有兩個前提條件必須准備好:開發配置文件(provisioning profile,也就是.mobileprovision後綴的文件)的App ID不能使用通配ID必須使用指定APP ID並且生成配置文件中選擇Push Notifications服務,一般的開發配置文件無法完成注冊;應用程序的Bundle Identifier必須和生成配置文件使用的APP ID完全一致。

2.iOS從APNs接收device token,在應用程序獲取device token

說明:

a.在UIApplication的-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken代理方法中獲取令牌,此方法發生在注冊之後。

b.如果無法正確獲得device token可以在UIApplication的-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error代理方法中查看詳細錯誤信息,此方法發生在獲取device token失敗之後。

c.必須真機調試,模擬器無法獲取device token。

3.iOS應用將device token發送給應用程序提供商,告訴服務器端當前設備允許接收消息

說明:

a.device token的生成算法只有Apple掌握,為了確保算法發生變化後仍然能夠正常接收服務器端發送的通知,每次應用程序啟動都重新獲得device token(注意:device token的獲取不會造成性能問題,蘋果官方已經做過優化)。

b.通常可以創建一個網絡連接發送給應用程序提供商的服務器端, 在這個過程中最好將上一次獲得的device token存儲起來,避免重復發送,一旦發現device token發生了變化最好將原有的device token一塊發送給服務器端,服務器端刪除原有令牌存儲新令牌避免服務器端發送無效消息。

4.應用程序提供商在服務器端根據前面發送過來的device token組織信息發送給APNs

說明:

a.發送時指定device token和消息內容,並且完全按照蘋果官方的消息格式組織消息內容,通常情況下可以借助其他第三方消息推送框架來完成。

5.APNs根據消息中的device token查找已注冊的設備推送消息

說明:

a.正常情況下可以根據device token將消息成功推送到客戶端設備中,但是也不排除用戶卸載程序的情況,此時推送消息失敗,APNs會將這個錯誤消息通知服務器端以避免資源浪費(服務器端此時可以根據錯誤刪除已經存儲的device token,下次不再發送)。

#import "AppDelegate.h"
#import "KCMainViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
#pragma mark - 應用程序代理方法
#pragma mark 應用程序啟動之後
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

_window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];

_window.backgroundColor =[UIColor colorWithRed:249/255.0 green:249/255.0 blue:249/255.0 alpha:1];

//設置全局導航條風格和顏色
[[UINavigationBar appearance] setBarTintColor:[UIColor colorWithRed:23/255.0 green:180/255.0 blue:237/255.0 alpha:1]];
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

KCMainViewController *mainController=[[KCMainViewController alloc]init];
_window.rootViewController=mainController;

[_window makeKeyAndVisible];

//注冊推送通知(注意iOS8注冊方法發生了變化)
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
[application registerForRemoteNotifications];

return YES;
}
#pragma mark 注冊推送通知之後
//在此接收設備令牌
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
[self addDeviceToken:deviceToken];
NSLog(@"device token:%@",deviceToken);
}
#pragma mark 獲取device token失敗後
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
NSLog(@"didFailToRegisterForRemoteNotificationsWithError:%@",error.localizedDescription);
[self addDeviceToken:nil];
}
#pragma mark 接收到推送通知之後
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
NSLog(@"receiveRemoteNotification,userInfo is %@",userInfo);
}
#pragma mark - 私有方法
/**
* 添加設備令牌到服務器端
*
* @param deviceToken 設備令牌
*/
-(void)addDeviceToken:(NSData *)deviceToken{
NSString *key=@"DeviceToken";
NSData *oldToken= [[NSUserDefaults standardUserDefaults]objectForKey:key];
//如果偏好設置中的已存儲設備令牌和新獲取的令牌不同則存儲新令牌並且發送給服務器端
if (![oldToken isEqualToData:deviceToken]) {
[[NSUserDefaults standardUserDefaults] setObject:deviceToken forKey:key];
[self sendDeviceTokenWidthOldDeviceToken:oldToken newDeviceToken:deviceToken];
}
}
-(void)sendDeviceTokenWidthOldDeviceToken:(NSData *)oldToken newDeviceToken:(NSData *)newToken{
//注意一定確保真機可以正常訪問下面的地址
NSString *urlStr=@"http://192.168.1.101/RegisterDeviceToken.aspx";
urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url=[NSURL URLWithString:urlStr];
NSMutableURLRequest *requestM=[NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:10.0];
[requestM setHTTPMethod:@"POST"];
NSString *bodyStr=[NSString stringWithFormat:@"oldToken=%@&newToken=%@",oldToken,newToken];
NSData *body=[bodyStr dataUsingEncoding:NSUTF8StringEncoding];
[requestM setHTTPBody:body];
NSURLSession *session=[NSURLSession sharedSession];
NSURLSessionDataTask *dataTask= [session dataTaskWithRequest:requestM completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"Send failure,error is :%@",error.localizedDescription);
}else{
NSLog(@"Send Success!");
}

}];
[dataTask resume];
}
@end

證書

iOS常用的證書包括開發證書和發布證書,無論是真機調試還是最終發布應用到App Store這兩個證書都是必須的,它是iOS開發的基本證書。

a.開發證書:開發證書又分為普通開發證書和推送證書,如果僅僅是一般的應用則前者即可滿足,但是如果開發推送應用則必須使用推送證書。

b.發布證書:發布證書又可以分為普通發布證書、推送證書、Pass Type ID證書、站點發布證書、VoIP服務證書、蘋果支付證書。同樣的,對於需要使用特殊服務的應用則必須選擇對應的證書。

應用標識

App ID,應用程序的唯一標識,對應iOS應用的Bundle Identifier,App ID在蘋果開發者中心中分為通配應用ID和明確的應用ID,前者一般用於普通應用開發,一個ID可以適用於多個不同標識的應用;但是對於使用消息推送、Passbook、站點發布、iCloud等服務的應用必須配置明確的應用ID。

設備標識

UDID,用於標識每一台硬件設備的標示符。注意它不是device token,device token是根據UDID使用一個只有Apple自己才知道的算法生成的一組標示符。

配置簡介

Provisioning Profiles,平時又稱為PP文件。將UDID、App ID、開發證書打包在一起的配置文件,同樣分為開發和發布兩類配置文件。

秘鑰

在申請開發證書時必須要首先提交一個秘鑰請求文件,對於生成秘鑰請求文件的mac,如果要做開發則只需要下載證書和配置簡介即可開發。但是如果要想在其他機器上做開發則必須將證書中的秘鑰導出(導出之後是一個.p12文件),然後導入其他機器。同時對於類似於推送服務器端應用如果要給APNs發送消息,同樣需要使用.p12秘鑰文件,並且這個秘鑰文件需要是推送證書導出的對應秘鑰。

補充--通知中心

對於很多初學者往往會把iOS中的本地通知、推送通知和iOS通知中心的概念弄混。其實二者之間並沒有任何關系,事實上它們都不屬於一個框架,前者屬於UIKit框架,後者屬於Foundation框架。

通知中心實際上是iOS程序內部之間的一種消息廣播機制,主要為了解決應用程序內部不同對象之間解耦而設計。它是基於觀察者模式設計的,不能跨應用程序進程通信,當通知中心接收到消息之後會根據內部的消息轉發表,將消息發送給訂閱者。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved