iPhone消息推送機制實現總結html
iPhone 對於應用程序在後臺運行有諸多限制(除非你越獄)。所以,當用戶切換到其餘程序後,原先的程序沒法保持運行狀態。對於那些須要保持持續鏈接狀態的應用程序(好比社區網絡應用),將不能收到實時的信息。服務器
爲解決這一限制,蘋果推出了APNs(蘋果推送通知服務)。APNs 容許設備與蘋果的推送通知服務器保持常鏈接狀態。當你想發送一個推送通知給某個用戶的iPhone上的應用程序時,你可使用 APNs 發送一個推送消息給目標設備上已安裝的某個應用程序。網絡
Push的原理:app
Push 的工做機制能夠簡單的歸納爲下圖iphone
圖中,Provider是指某個iPhone軟件的Push服務器,此處是建立的應用程序做爲Provider。
APNS 是ApplePush Notification Service(ApplePush服務器)的縮寫,是蘋果的服務器。socket
上圖能夠分爲三個階段。ide
第一階段:Provider應用程序把要發送的消息、目的iPhone的標識打包,發給APNS。
第二階段:APNS在自身的已註冊Push服務的iPhone列表中,查找有相應標識的iPhone,並把消息發到iPhone。
第三階段:iPhone把發來的消息傳遞給相應的應用程序, 而且按照設定彈出Push通知。ui
從上圖咱們能夠看到。code
一、首先是應用程序註冊消息推送。orm
二、IOS跟APNSServer要deviceToken。應用程序接受deviceToken。
三、應用程序將deviceToken發送給PUSH服務端程序。
四、 服務端程序向APNS服務發送消息。
五、APNS服務將消息發送給iPhone應用程序。
建立使用 APNs 的iOS 應用的詳細步驟
1.打開「鑰匙串訪問」應用程序。
2.選擇「KeychainAccess-> Certificate Assistant -> Request a Certificate FromCertificateAuthority」(如圖1所示):
3.輸入所需的信息,勾選「Savedto disk」選項,點擊Continue(如圖2所示):
4.使用默認文件名把證書請求進行保存(圖3):在彈出窗口中,點擊Done。
建立 App ID
每一個使用 APNs 的 iOS 應用必須有一個惟一的 App ID。建立推送通知中要用到的App ID。
1.登陸iPhoneDeveloperProgram:http://developer.apple.com/iphone/。點擊頁面右邊的「 iPhoneDeveloper Program Portal 」(圖4):
2.首先看到的是歡迎頁面(圖5):
3.點擊左邊的「App ID」,而後點擊右邊的「New AppID」按鈕(圖6):
4.在Description 欄輸入「PushAppID」,在「BundleSeed ID」欄中選擇「GenerateNew」。在「BundleIdentifier」欄,輸入「net.learn2develop.MyPushApp」,而後點擊「Submit」(圖7):
5.如今你應該能看到所建立的App ID 了(圖8):
配置 App
一旦建立了 App ID,你還要爲推送通知對 App ID 進行一些配置。
1.點擊App ID 右邊的Configure 連接,會看到以下選項(圖9):
勾選「Enablefor Apple Push Notificationservice」,點擊「Development Push SSLCertificate」右邊的「Configure」按鈕。
2.接下來你會看到「ApplePush Notification service SSL Certificate Assistant」頁面。點擊Continue(圖10):
3.點擊ChooseFile 按鈕,選擇前面保存的證書請求文件存放地址。點擊Generate(圖11):
4.你的SSL 證書會被生成。點擊Continue(圖12):
5.點擊DownloadNow 按鈕,下載 SSL 證書。點擊 Done(圖13):
6. 下載的 SSL 證書文件名爲 aps.developer.identity.cer。雙擊,將證書安裝到鑰匙串中(圖14)。這個證書會在你的程序中用到,它容許程序接收 APNs 發送來的推送通知。
建立 Provisioning Profile
接下來,須要建立 provisioning profile 以便容許應用程序安裝到真實設備上。
1. 回到iPhone Development Program Portal,點擊 Provisioning 欄,點擊 New Profile 按鈕(圖15)
2. Profile Name 欄輸入 MyDevicesProfile,在 App ID 欄選擇 PushAppID。在Devices 欄,勾選全部你想激活的設備(在 iPhone Developer Program Portal 的 Devices 頁中註冊的全部設備)。點擊 Submit(圖16)。
3. provisioning profile 會等待審覈。幾秒鐘後,它會顯示在頁面上。點擊Download 按鈕下載該 provisioning profile(圖17):
4. 下載下來的provisioning profile 名爲 MydevicesProfile.mobileprovision。
激活設備
建立 provision profile 後,你能夠將它安裝到真實設備中。
1. 將iPhone 或 iPod 鏈接到 Mac。
2. 把下載下來的 MyDevicesProfile.mobileprovision 文件拖到Dock 欄的 Xcode 圖標上。
3. Xcode 的 Organizer 程序將啓動,選擇當前連機的設備。能夠看到MyDevicesProfile 已自動安裝到設備上了
建立 iPhone 應用程序
打開Xcode,建立 View-Based Application 項目
展開Xcode中的 Targets項目,選擇ApplePushNotification,按下 ⌘+i,在 info 出口,點擊Properties 標籤欄。
在 Identifier 文本框,輸入net.learn2develop.MyPushApp.
點擊 Build 標籤欄,在 search 輸入框中鍵入Code Signing。在 Any iPhone OS Device 選項,選擇正確的 profile。
在 ApplePushNotificationAppDelegate.m 文件中,輸入如下代碼(加粗部分):
#import"ApplePushNotificationAppDelegate.h"
#import"ApplePushNotificationViewController.h"
@implementationApplePushNotificationAppDelegate
@synthesize window;
@synthesize viewController;
- (void)applicationDidFinishLaunching:(UIApplication*)application{
[windowaddSubview:viewController.view];
[windowmakeKeyAndVisible];
NSLog(@"Registeringfor push notifications...");
[[UIApplication sharedApplication]
registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeAlert |
UIRemoteNotificationTypeBadge|
UIRemoteNotificationTypeSound)];
}
-(void)application:(UIApplication*)appdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
stringWithFormat:@"DeviceToken=%@",deviceToken];
NSLog(str);
}
-(void)application:(UIApplication*)appdidFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
NSString *str = [NSStringstringWithFormat:@"Error: %@", err];
NSLog(str);
}
-(void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
for (id key in userInfo) {
NSLog(@"key:%@, value: %@", key, [userInfo objectForKey:key]);
}
}
- (void)dealloc {
[viewControllerrelease];
[window release];
[super dealloc];
}
@end
按下 ⌘+R 運行程序(在真實設備)。按下 shift+⌘+R顯示DebuggerConsole 窗口。查看設備輸出到控制檯的device token,devicetoken 好比是38c866dd bb323b39 ffa73487 5e157ee5 a85e0b7c e90d56e9fe145bcc 6c2c594b。記下device token(複製、粘貼到一個文本文件裏)
若是查看 iPhone/iPod 上的「Settings」程序,你會發現一個 Notifications 的項
建立 PushNotification Provider
Push Notification Provider 是一個應用程序,用於經過 APNs 發送推送通知給 iPhone 應用。
經過 APNs 發送推送通知有幾個步驟:
1. 使用前面建立的 SSL 證書與 APNs 通信;
2. 構造所要發送的消息載體;
3. 發送載體到APNs;
APNs 是一個基於流的 TCP socket,你的 provider 以 SSL 協議與其通信。推送通知(包括載體)是以二進制流的方式發送的。和APNs 創建鏈接後,你能夠維持該鏈接並在鏈接中斷以前發送多個通知。
技巧: 應避免每發送一次推送通知就創建、關閉一次鏈接。頻繁的創建、關閉鏈接可能會被 APNs 認爲是 DOS 攻擊,從而拒絕發送 provider 的推送通知發送請求。
一個推送通知消息的格式
載體(payload)是 JSON 字符串(最長 256 字節),封裝了你發送給 iOS 應用的信息。這是一個 payload 的例子:
{
"aps": {
"alert" : "Yougot a new message!" ,
"badge" : 5,
"sound" : "beep.wav"},
"acme1": "bar",
"acme2": 42
}
1. 在Xcode 中打開 PushMeBaby。
2. 右擊 Resouces 文件夾,選擇 Add Existing Files…,選擇前面所下載到的aps.developer.identity.cer 文件
3. 在 ApplicationDelegate.m 文件中,修改以下代碼(加粗部分):
- (id)init {
self = [super init];
if(self != nil) {
self.deviceToken= @"38c866dd bb323b39 ffa73487 5e157ee5 a85e0b7ce90d56e9 fe145bcc6c2c594b";
// self.payload = @"{\"aps\":{\"alert\":\"Yougot a new //message!\",\"badge\":5,\"sound\":\"beep.wav\"},\"acme1\":\"bar\",\"acme2\":42}";
self.payload = @"{\"aps\":{\"alert\":\"Yougot a new message!\",\"badge\":5},\"acme1\":\"bar\",\"acme2\":42}";
self.certificate= [[NSBundle mainBundle]
pathForResource:@"aps_developer_identity"ofType:@"cer"];
}
return self;
}
4.按下 ⌘+R,運行程序。將會問你是否容許使用證書,點擊AlwaysAllow(老是容許)
在 iPhone/iPod,確認 ApplePushNotification 程序未運行。點擊 Push 按鈕,會向設備發送一條推送通知。服務器實際上發送了下列消息給APN 服務器:
{
"aps": {
"alert" : "Yougot a new message!" ,
"badge" : 5,
"sound" : "beep.wav"},
"acme1": "bar",
"acme2": 42
}
5.若是消息推送成功,將會在iPhone/iPod 上出現