iOS-推送,證書申請,本地推送

   介紹一點點背景資料ios

衆所周知,使用推送通知是一個很棒的、給應用添加實時消息通知的方式。這樣作的結局是,開發者和用戶之間,彼此永遠保持着一種使人愉悅的親密關係。web

然而不幸的是,iOS的推送通知並不是那麼容易駕馭,每每會搞的開發者精疲力盡,灰心喪氣,沒法持久。如今,救星來了!只要通讀本教程,你就能擺脫這些煩惱,成爲一名活力四射,精壯(Robust I mean!)的開發者。編程

正式開始以前的準備工做json

咱們先來從Apple Developer網站上建立一個關聯App ID和開發供應配置文件的SSL證書,來開始這段美好的教程。接着,咱們看看在iOS下是如何在解析網站(Parse website)配置解析程序(Parse app)的。最後,咱們把這些理論付諸實踐,建立一個帶有推送功能的App,而且將消息推到用戶。api

在開始這段美好旅程以前,你們必定要注意iOS模擬器是不支持推送的,因此你必須想辦法找一臺真機過來。還有就是要有蘋果開發者協議,以後才能在真機上面進行開發和測試。服務器

建立SSL證書app

首先,須要在蘋果開發者網站上建立一個App ID以及關聯的SSL證書,有了這個證書,解析服務器才能將找到你的App ID,繼而將通知推送到該應用。curl

建立一個證書請求ide

首先的首先,咱們須要有一個證書籤名請求文件,以後建立SSL證書纔有意義。建立文件的方法以下:測試

1.在Mac上運行鑰匙串訪問(keychain)

2.選擇鑰匙串訪問 > 證書助理 > 從證書頒發機構中請求一個證書

3.輸入你的名字和郵件地址,CA郵件地址默認就能夠,不要試圖去進行任何改動。

4.選擇「保存到硬盤」,這樣就會將剛建立的證書請求文件下載到電腦桌面上了。

建立並調教一個App ID

每一個安裝在你開發者設備上的iOS程序都須要一個獨有的App ID,方便起見,App ID以反向路徑規則命名,形如com.parseSampleApp,可是必定要注意App ID裏不能包含星號("*")。建立步驟以下:

1.登錄網站Apple Developer Member Center並進入iOS Provisioning Portal

2.從左邊欄裏點擊App IDs。

3.選擇New App ID,而後建立一個新的App ID。必定要確保Bundle Identifier一欄中沒有星號。

4.在你的App ID下面找到Configure,選中。

5.將「Enable for Apple Push Notification service」勾選上,而後點擊Development Push SSL Certificate下面的Configure,而後會出現Apple Push Notification service SSL Certificate Assistant設置嚮導。

6.點擊Continue繼續,而後點擊Choose File,選中剛建立見的.certSigningRequest文件。

7.點擊Generate開始生成,而後點擊Download下載生成的SSL證書。

8.經過keychain程序來安裝下載好的SSL證書。

9.接着在「個人證書」選項先面,找到你剛纔安裝名稱形如「Apple Development IOS Push Services: xxx」的證書。

10.雙擊證書,選擇「導出」,導出後的文件後綴名爲.p12。這個時候千萬注意!出現密碼提示的時候必定不要添任何東西。

這裏值得注意的一點就是,至此咱們只是將應用的推送通知功能在開發模式中開啓了,因此應用開始正式發佈以前,必定記得要將第四步到第九步的流程從新走一遍,並將第五步中的「Development Push SSL Certificate」改爲「Production Push SSL Certificate」。這樣就完美了。

建立一個Provisioning Profile(配置簡介)

Provisioning Profile會驗證運行所開發應用的設備。並且無論你是新建一個App ID仍是去修改現成的,都得從新生成並安裝一遍Provisioning Profile。步驟以下:

1.在iOS Provisioning Portal中選擇Provisioning變遷。

2.點擊New Profile

3.填好對應的信息,確保一下三項(developer certificate、上面剛建立好的App ID以及用於測試的設備)都沒有遺漏,全都選中。

4.點擊Actions一欄下面的Download按鈕下載生成好的Provisioning Profile。

5.雙擊下載好的文件,默認是由iPhone Configuration Utility程序開。

配置Parse App

要想在推送通知中使用Parse功能,必須將此項特性設置成開啓狀態,而後將上面建立好的推送SSL證書上傳上去。步驟以下:

1.在Parse website上找到你的Parse app,而後選擇Settings標籤頁。

2.在iOS Push Notification Settings下面,點擊Choose File,而後將以前用keychain導出的.p12文件上傳上去。

3.若是但願用戶可以發送推送通知,咱們須要將Client push enabled?選項中的Yes勾選上。這個功能對於像即時聊天的軟件很是有用,咱們如今將它勾選上,固然開發者須要自行決定是否要開啓這項功能。

4.點擊Save保存。

至此,全部的前提條件都搞完了,立刻進入最激動人心的建立一個具有推送通知應用的環節了,喝口水,開搞。

建立一個具有推送通知的應用

首先,咱們須要先對Xcode項目進行一些設置,確保App ID和provisioning profile都被設置成良好的狀態。作開發嗎,

1.在Supporting Files文件夾下選中ProjectName-Info.plist,對右側視圖中的Bundle Identifier選項進行修改,和你本身建立的App ID保持一致(形如:com.parseSampleApp)。

2.在左側的菜單中選中剛建立的project文件,在下面找到Build Settings而後搜索Code Signing Identity。

3.將對應provisioning profile的全部的值所有設置好。

4.選擇左手邊Targets下面的項目名稱,再次找到Build Settings,來到Code Signing Identity區域,確保全部的值都和新的provisioning profile保持一致。

代碼環節

接下來就開始進入編程模式了。咱們須要對應用程序代理(app delegate)進行少許的修改,從而使得咱們的應用能夠接受到推送通知。步驟以下:

1.註冊設備須要在app delegate的[application:didFinishLaunchingWithOptions:]方法中調用[application registerForRemoteNotificationTypes:]方法,代碼以下:

  1. - (BOOL)application:(UIApplication *)application 
  2.  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
  3.     ... 
  4.     // Register for push notifications 
  5.     [application registerForRemoteNotificationTypes:  
  6.                                  UIRemoteNotificationTypeBadge | 
  7.                                  UIRemoteNotificationTypeAlert |              
  8.                                  UIRemoteNotificationTypeSound]; 
  9.     ... 

2.一旦成功,以上方法會在app delegate中執行回調方法[application:didRegisterForRemoteNotificationsWithDeviceToken:] 。咱們須要實現這個方法,用它來告知Parse咱們的設備信息。代碼以下:

  1. - (void)application:(UIApplication *)application  
  2. didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken 
  3.     [PFPush storeDeviceToken:newDeviceToken]; // Send parse the device token 
  4.     // Subscribe this user to the broadcast channel, ""  
  5.     [PFPush subscribeToChannelInBackground:@"" block:^(BOOL succeeded, NSError *error) { 
  6.         if (succeeded) { 
  7.             NSLog(@"Successfully subscribed to the broadcast channel."); 
  8.         } else { 
  9.             NSLog(@"Failed to subscribe to the broadcast channel."); 
  10.         } 
  11.     }]; 

3.廣播頻道(broadcast channel)用於同時聯繫到全部用戶,因此不少時候開發者可能須要本身建立一些更精準化的頻道。一旦推送通知被接受可是應用不在前臺,就會被顯示在iOS推送中心。反之若是應用恰好處於活動狀態,則交於應用去自行處理。具體咱們能夠在app delegate中實現[application:didReceiveRemoteNotification]方法。一下示例代碼只是簡單的將這一需求交由Parse去處理,Parse會建立一個模態警報顯示推送內容。

  1. - (void)application:(UIApplication *)application  
  2. didReceiveRemoteNotification:(NSDictionary *)userInfo { 
  3.     [PFPush handlePush:userInfo]; 

好了,如今開始在你的iOS設備上運行一下,一切順利的話,就能夠看到從用戶到推送通知之間的一條模態警報請求許可。

發送推送通知

從Parse website發送

Parse容許你從Parse website發送推送通知,API和SDK都可。找到Parse app,選擇Push Notifications標籤,你能夠在文本框裏添加一條消息,而後廣播給因此用戶。你可使用Parse web API經過發送一個POST請求來發送推送到任何頻道。如下示例是一條廣播通知,內容是「Hello World」,使用curl進行發送。

  1. curl -X POST "https://api.parse.com/1/push" -H "Content-Type: application/json" \ 
  2. --data '{"key":"your_push_master_key", "channel":"", "type":"ios",\ 
  3. "data":{"alert":"Hello World!"}}' 

從應用發送

從應用發送須要開啓Parse app中的Client push enabled功能。實現從應用發送推送通知的方式多種多樣,你能夠在iOS API documentation中找到一切。

  1. // Broadcast "Hello World" 
  2. [PFPush sendPushMessageToChannelInBackground:@"" withMessage:@"Hello World!"]; 

 

複製代碼
//本地推送。 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; [application registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound]; return YES; } -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSLog(@"push_test"); NSLog(@"deviceToken:%@",deviceToken); UILocalNotification *notification = [[[UILocalNotification alloc] init] autorelease]; //設置10秒以後 NSDate *pushDate = [NSDate dateWithTimeIntervalSinceNow:10]; if (notification != nil) { // 設置推送時間 notification.fireDate = pushDate; // 設置時區 notification.timeZone = [NSTimeZone defaultTimeZone]; // 設置重複間隔 notification.repeatInterval = kCFCalendarUnitDay; // 推送聲音 notification.soundName = UILocalNotificationDefaultSoundName; // 推送內容 notification.alertBody = @"推送內容"; //顯示在icon上的紅色圈中的數子 notification.applicationIconBadgeNumber = 1; //設置userinfo 方便在以後須要撤銷的時候使用 NSDictionary *info = [NSDictionary dictionaryWithObject:@"name"forKey:@"key"]; notification.userInfo = info; //添加推送到UIApplication UIApplication *app = [UIApplication sharedApplication]; [app scheduleLocalNotification:notification]; } } -(void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { NSLog(@"error:%@",error); } - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification*)notification { NSLog(@"receive"); UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"iWeibo" message:notification.alertBody delegate:nil cancelButtonTitle:@"肯定" otherButtonTitles:nil]; [alert show]; // 圖標上的數字減1 application.applicationIconBadgeNumber -= 1; }
複製代碼
相關文章
相關標籤/搜索