標籤:
在實現訊息推送之前先提及幾個於推送相關概念,如:
1、 Provider:就是為指定IOS裝置應用程式提供Push的伺服器,(如果IOS裝置的應用程式是用戶端的話,那麼Provider可以理解為服務端[訊息的發起者]);
2、 APNS:Apple Push Notification Service[蘋果訊息推送伺服器];
3、 iPhone:用來接收APNS下發下來的訊息;
4、 Client App:IOS裝置上的應用程式,用來接收iphone傳遞APNS下發的訊息到制定的一個用戶端 app[訊息的最終響應者];
可以分為三個階段:
階段一:Provider[服務端]把要發送的訊息,目的IOS裝置標識打包,發送給APNS;
階段二:APNS在自身的登入Push服務的IOS裝置列表中,尋找有相應標識的IOS裝置,並將訊息發送到IOS裝置;
階段三:IOS裝置把發送的訊息傳遞給對應的應用程式,並且按照設定彈出Push通知。
具體過程,如:
1、 [Client App]註冊訊息推送;
2、 [Client App]跟[APNS Service]要deviceToken, Client App接收deviceToken;
3、 [Client App]將deviceToken發送給[Provider]Push服務端程式;
4、 當Push服務端程式滿足發送訊息條件了,[Provider]向[APNS Service]發送訊息;
5、 [APNS Service]將訊息發送給[Client App].
二、訊息推送實現:
1、 產生*.certSigningRequest檔案,步驟如下:
[MacBookà應用程式à工具 + 生產力à鑰匙串訪問à認證助手à從認證機構求認證?à認證資訊(使用者電子郵箱地址{填寫您的郵箱,如:[email protected]},常用名稱{任意,如:PushDemo},請求是:{單選,選擇‘儲存到磁碟’})à繼續à儲存],這時會在您指定的地方產生你指定的檔案,預設為CertificateSigningRequest.certSigningRequest檔案,這裡命名為:PushDemo.certSigningRequest.在此*.certSigningRequest已經產生,具體操作步驟如下面兩張圖所示。
如果產生成功,則會在[鑰匙串訪問|登入|密鑰]欄目中列出與*.certSigningRequest關聯的密鑰,這裡是PushDemo,如所示:
2、 建立一個App ID(在蘋果開發人員帳號中配置)
(1) 登入iOS Dev Center,登入成功後,點擊(iOS Provisioning Portal對應連結),如所示:
(2) 建立New App ID[App IDsàManageàNew App ID]( Description{填寫您對此App ID 的描述,如:iShop},Bundle Seed ID(App ID Prefix){選擇綁定App ID首碼,如:預設選擇Generate New},Bundle Identifier(App ID Suffix){填寫綁定App ID尾碼,如:com.yourcorp.iShop}),如所示:
這樣就會產生下面這條記錄,如所示:
(3) 配置上一步中產生的App ID,讓其支援訊息推送[點擊2-6中的Configureà選中Enable for Apple Push Notification serviceà點擊Configure],如所示:
(4) Generate a Certificate Signing Request(產生部署請求認證)[點擊中的2ConfigureàContinueà步驟1產生的*certSigningRequest檔案(這裡是iShop. certSigningRequest)à Generateà產生完成後將其下載下來,命名為:aps_developer_identity.cer],雙擊aps_developer_identity.cer認證{將認證與密鑰關聯,並將認證匯入到MacBook中},如所示:
(5) 建立Development Provisioning Profiles[開發許可設定檔](Provisioning| Development|New Profile),具體操作流程如所示:
點擊中Submit,產生Development Provisioning Profiles[開發許可設定檔],這裡是:iShopDevprofile.mobileprovision如所示:
下載此開發許可認證(用於聯機調試)。
總結,到現在為止,我們已經產生:A:*.certSigningRequest檔案(在步驟(4)中使用,用於產生認證B)、B: aps_developer_identity.cer認證(在Provider[Push伺服器]服務端應用使用)、C:*..mobileprovision開發許可設定檔(在Client App用戶端應用聯機調試使用)。
至此,訊息推送的配置已經全部完成,接下來的工作就是編寫Provider[Push伺服器]服務端應用和Client App用戶端應用的程式。
三、Provider服務端的實現
在這裡只是簡單講述Provider服務端(JAVA實現)步驟如下:
(1) 製作Provider服務端所需要的*.p12檔案:
在上面的實現的(4) 部分的圖所展示的密鑰、認證,我們並沒有使用到它,那麼為什麼要展示出來呢,猜猜是為什嗎?為製作*.p12檔案?哈哈,您猜對了,下面我們就利用它來製作*.p12檔案,步驟:([MacBookà應用程式à工具 + 生產力à鑰匙串訪問[鑰匙串:登入,種類:認證]à選擇剛剛產生的認證(Apple Development IOS Services:*******)à菜單à檔案à匯出項目…à[儲存為:任意檔案名稱(如:iPush),檔案格式:預設(個人資訊交換(.p12))]à輸入密碼以進行匯出[密碼:任意,驗證:與密碼同一]à輸入MACBook登入密碼à允許à最終產生。
關鍵步驟如:
(2) 編寫Client App用戶端的關鍵代碼,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen]bounds]] autorelease]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; //訊息推送支援的類型 UIRemoteNotificationType types = (UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert); //註冊訊息推送 [[UIApplication sharedApplication]registerForRemoteNotificationTypes:types]; return YES; } //擷取DeviceToken成功 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSLog(@"DeviceToken: {%@}",deviceToken); //這裡進行的操作,是將Device Token發送到服務端 } //註冊訊息推送失敗 - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { NSLog(@"Register Remote Notifications error:{%@}",[errorlocalizedDescription]); } //處理收到的訊息推送 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSLog(@"Receive remote notification : %@",userInfo); UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"溫馨提示" message:@"推送成功!" delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil]; [alert show]; [alert release]; } |
(3)編寫Provider服務端關鍵代碼,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import javapns.back.PushNotificationManager; import javapns.back.SSLConnectionHelper; import javapns.data.Device; import javapns.data.PayLoad; public class MainSend { public static void main(String[] args) throws Exception { try { //從用戶端擷取的deviceToken String deviceToken = "3a20764942e9cb4c4f6249274f12891946bed26131b686b8aa95322faff0ad46"; System.out.println("Push Start deviceToken:" + deviceToken); //定義訊息模式 PayLoad payLoad = new PayLoad(); payLoad.addAlert("訊息推送測試!"); payLoad.addBadge(4); payLoad.addSound("default"); //註冊deviceToken PushNotificationManager pushManager = PushNotificationManager.getInstance(); pushManager.addDevice("iPhone", deviceToken); //串連APNS String host = "gateway.sandbox.push.apple.com"; int port = 2195; String path = "/Users/iMilo/Work.localized/iShop/project/service/iPush/"; String certificatePath = (path + "src/ipush/iPush.p12"); //certificatePath 步驟一中產生的*.p12檔案位置 String certificatePassword = "Love24mm"; pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12); //發送推送 Device client = pushManager.getDevice("iPhone"); pushManager.sendNotification(client, payLoad); //停止串連APNS pushManager.stopConnection(); //刪除deviceToken pushManager.removeDevice("iPhone"); System.out.println("Push End"); } catch (Exception ex) { ex.printStackTrace(); } } } |
iOS 訊息推送原理及實現總結