概述:推送過程簡介服務器
1、App啓動過程當中,使用UIApplication::registerForRemoteNotificationTypes函數與蘋果的APNS服務器通訊,發出註冊遠程推送的申請。若註冊成功,回調函數application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 會被觸發,App能夠獲得deviceToken,該token就是一個與設備相關的字符串.
2、App獲取到DeviceToken後,將DeviceToken發送給本身的服務端。
3、服務端拿到DeviceToken之後,使用證書文件,向蘋果的APNS服務器發起一個SSL鏈接。鏈接成功以後,發送一段JSON串,該JSON串包含推送消息的類型及內容。
4、蘋果的APNS服務器獲得JSON串之後,向App發送通知消息,使得App的回調函數application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo被調用,App從userInfo中便可獲得推送消息的內容。app
一、前期準備函數
在學習推送開發以前,開發者須要兩樣東西,(1)、iPhone真機,由於模擬器不支持推送(2)、付費的開發者帳號。學習
二、新建項目,選擇Single View Application模板。spa
三、註冊通知(Registration Notification)操作系統
(1)在AppDelegate文件的application:didFinishLaunchingWithOptions:方法中添加「註冊推送」的代碼。.net
1
2
3
4
5
6
7
8
9
10
|
- (
BOOL
)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Register for Remote Notifications
if
(iOS8_OR_LATER) {
[[UIApplication sharedApplication] registerForRemoteNotifications];
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes: UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
}
}
|
這樣iOS操做系統就知道該應用程序將須要處理推送消息方面的內容。code
經過上面的代碼,iOS操做系統與蘋果的APNS服務器聯繫,而且得到一個device token,這個device token用於區別運行該App的每個硬件設備。這個device token是用於你本身的服務器給該設備發送推送信息,具體的實現方式就是你的服務器將device token以及須要推送的信息打包發送給蘋果的服務器,而後蘋果的APNS服務器負責將推送的內容分發到對應的設備。blog
須要瞭解的是device token在每個App上面都不同,而且在同一個App上面會由於時間改變而不一樣。因此蘋果推薦在每一次App啓動的時候將device token發送到你的服務器後臺,以確保device token是最新的。token
四、判斷註冊通知失敗仍是成功
1
2
3
4
5
6
7
8
|
- (
void
)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@
"Did Register for Remote Notifications with Device Token (%@)"
, deviceToken);
}
- (
void
)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@
"Did Fail to Register for Remote Notifications"
);
NSLog(@
"%@, %@"
, error, error.localizedDescription);
}
|
五、收到通知消息,進行消息處理
若是收到了通知事件,那麼UIApplicationDelegate接口中的application:didReceiveRemoteNotification將會執行,你能夠在這裏獲取推送的信息,而後作出相應的處理。
1
2
3
4
5
6
7
8
|
- (
void
)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSString *deviceTokenStr = [[[[deviceToken description]
stringByReplacingOccurrencesOfString: @
"<"
withString: @
""
]
stringByReplacingOccurrencesOfString: @
">"
withString: @
""
]
stringByReplacingOccurrencesOfString: @
" "
withString: @
""
];
NSLog(@
"去除device token中的空格和<>字符:%@"
,deviceTokenStr);
//僅僅是我參與的項目中這樣處理,見仁見智
}
|
六、製做證書,使用真機進行推送消息開發
這時候若是運行項目,那麼application:didFailToRegisterForRemoteNotificationsWithError將會執行,由於模擬器不支持推送,須要製做證書,使用真機作推送開發。
七、SSL Certificate證書製做
在蘋果的開發者中心,建立App Id
推送的證書必須使用精確(Explicit)的App ID,而不能使用模糊(Wildcard) App ID。
以下圖所示,
勾選上Push Notifications服務,以下圖所示,
而後按照建立證書的流程,使用建立的App ID,由於須要截圖較多,此處再也不贅述。