iOS 遠程推送通知

1.什麼是推送通知html

  1. 在某些特殊狀況下,應用程序被動收到的以不一樣種界面形式出現的提醒信息
  2. 推送通知的做用:可讓不在前臺運行的app通知app發生了改變
  3. iOS中得推送通知種類
    1. 遠程推送通知(Remote Notification)
    2. 本地推送通知(Local Notification)

2.推送通知的5種形式git

3.推送通知的特色github

  1. App關閉時,能夠接收通知並顯示
  2. App打開並處於後臺時,通知會顯示
  3. App打開並處於前臺時,通知不會顯示
  4. 點擊通知後,默認會自動打開發出通知的App

4.遠程推送通知服務器

  1. 在聯網的狀況下,由遠程服務器推送給客戶端的通知,又稱APNs(Apple Push Notification Services)
  2. 無論應用是打開仍是關閉的狀況下,都能接收到服務器推送的遠程通知

5.遠程通知的實現基礎app

  • 在聯網狀態下,全部蘋果設備都會與蘋果服務器創建長鏈接
    1. 長鏈接的做用:時間校準,系統升級,查找個人iPhone
    2. 長鏈接的好處:數據傳輸速度快,數據保持最新狀態

6.遠程推送的實現原理測試

  1. 安裝App時
    1. 發送UDID和BundleID給APNs加密後返回deviceToken
    2. 登錄服務時,將用戶身份和deviceToken發給服務器,服務器記錄
  2. 李四給張三發消息
    1. 發送消息及張三的用戶身份
    2. 服務器按照張三的身份找到存儲的deviceToken,將消息和deviToken發送給APNs
    3. APNs經過deviceToken推送消息給張三

7.實現遠程推送功能的前提fetch

  1. 真機
  2. 調試階段的證書
    1. aps_development.cer 電腦能夠調試有推送功能的app的證書
    2. iOS_development.cer 電腦能夠真機調試的證書
    3. xxx.mobileprovision 描述文件,其中肯定了哪臺手機和電腦能夠進行調試
  3. 發佈階段的證書
    1. aps.cer 用該證書中說明的那臺電腦發佈的app具備遠程推送功能時,用來使該app有推送功能的證書
    2. iOS_distribution.cer 電腦有發佈app的能力的證書
    3. xxx.mobileprovision 描述文件,其中描述了哪臺電腦能夠發佈app

8.實現遠程推送功能的步驟ui

  1. 在啓動方法中註冊通知
  2. 註冊成功後收到設備的deviceToken
  3. 實現用戶點擊通知後的響應(兩種狀況)
    1. 程序沒有關閉,在後臺實現AppDelegate中的didReceiveRemoteNotification方法
    2. 程序已經關閉,執行AppDelegation中的didFinishesLaunchingWithOption方法

9.遠程推送的具體實現過程加密

  1. 去開發者平臺,生成兩個支持遠程推送的證書
  2. 先點擊App IDS添加一個準確的能夠支持push功能的應用程序的BundleID
  3. 到生成的證書的那個節點下,先添加一個development階段的支持push功能的cer文件
  4. 到最後一個provision節點下添加一個development階段的支持push功能建立的那個App ID,cer文件要選擇最新生成的支持push功能的cer文件,最後生成,下載,雙擊安裝
  5. 爲了肯定cer文件和provision文件安裝成功,能夠到鑰匙串和Xcode中的設備節點中分別查看(遠程推送證書的申請流程請移步http://www.cnblogs.com/czq1989/p/5311302.html)
  6. 新建一個工程,先修改info.plist文件中Bundle ID爲第二步建立的那個ID
  7. 爲了兼容7.0因此修改配置中的deployment target爲7.0
  8. 在AppDelegate中,發請求,詢問是否要開通push功能,若是用戶點擊容許,則接收從服務器端發回的deviceToken(須要真機聯網)
  9. 配置經過點擊了通知打開應用程序後要作的事情,能夠在AppDelegate中經過實現didReceiveRemoteNotification方法,就能夠獲取到用戶點擊了通知這個動做

10.遠程推送過程當中AppDelegate中所要響應的方法spa

  下面的方法都是寫在AppDelegate.m文件中

/*
 1.有一種打開,叫作點擊圖標後的打開
 2.還有一種打開,叫作 點擊了 通知 以後的打開
 當經過 點擊通知  這種方法打開應用程序,執行didFinishLaunching方法時,launchOptions
 參數中,就存着通知發來的消息,也就是 相似於
 didReceiveRemote方法中的那個userInfo
*/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    if ([UIDevice currentDevice].systemVersion.doubleValue <= 8.0) {
        //向服務器發請求,要註冊推送功能,以此獲取到服務器返回的deviceToken
        //type 用來講明 支持的通知形式
        //如 橫幅 聲音  角標
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert];
    }else{
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge| UIUserNotificationTypeSound|UIUserNotificationTypeAlert  categories:nil];
        [application registerUserNotificationSettings:settings];
        //申請使用通知
        [application registerForRemoteNotifications];
    }
    NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
    UILabel *label = [[UILabel alloc]init];
    label.frame = CGRectMake(0, 40, 300, 200);
    label.numberOfLines = 0;
    label.textColor = [UIColor whiteColor];
    label.font = [UIFont systemFontOfSize:24];
    label.backgroundColor = [UIColor blueColor];
    label.text =[NSString stringWithFormat:@"%@",userInfo];
    [self.window.rootViewController.view addSubview:label];
    return YES;
}

//只要獲取到用戶贊成,則服務器端返回deviceToken
//會自動執行下面的方法
//1417f54c c7f0adb0 48e3558f 2b8a8bad 0a6a5152 54af017e 32137cda 8cbdb9d0
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSLog(@"%@",deviceToken);
}

/*
 用戶點擊了通知,進入到應用程序中,須要捕獲到這個時機
 從而決定這一次的進入應用程序,到底要顯示或執行什麼動做,下面的方法就會在點擊通知時自動調用
*/
/*
 1.應用程序在前臺時:通知到,該方法自動執行
 2.應用程序在後臺且沒有退出時:通知到,只有點擊了通知查看時,該方法自動執行
 3.應用程序退出:通知到,點擊查看通知,不會執行下面的didReceive方法,而是隻執行didFinishLauncing方法
*/
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    //NSLog(@"%@",userInfo);
    //爲了測試在應用程序退出後,該方法是否執行
    //因此往第一個界面上添加一個label,看標籤是否會顯示一些內容
    UILabel *label = [[UILabel alloc]init];
    label.frame = CGRectMake(0, 250, 300, 200);
    label.numberOfLines = 0;
    label.textColor = [UIColor whiteColor];
    label.font = [UIFont systemFontOfSize:24];
    label.backgroundColor = [UIColor grayColor];
    label.text =[NSString stringWithFormat:@"%@",userInfo];
    [self.window.rootViewController.view addSubview:label];
}

/*
 此方法是新的用於響應遠程推送通知的方法
 1.若是應用程序在後臺,則通知到,點擊查看,該方法自動執行
 2.若是應用程序在前臺,則通知到,該方法自動執行
 3.若是應用程序被關閉,則通知到,點擊查看,先執行didFinish方法,再執行該方法
 4.能夠開啓後臺刷新數據的功能
   step1:點擊target-->Capabilities-->Background Modes-->Remote Notification勾上
   step2:在給APNs服務器發送的要推送的信息中,添加一組字符串如:
    {"aps":{"content-available":"999","alert":"bbbbb.","badge":1}}
    其中content-availabel就是爲了配合後臺刷新而添加的內容,999能夠隨意定義
*/
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    UILabel *label = [[UILabel alloc]init];
    label.frame = CGRectMake(0, 250, 300, 200);
    label.numberOfLines = 0;
    label.textColor = [UIColor whiteColor];
    label.font = [UIFont systemFontOfSize:24];
    label.backgroundColor = [UIColor grayColor];
    label.text =[NSString stringWithFormat:@"%@",userInfo];
    [self.window.rootViewController.view addSubview:label];
    //NewData就是使用新的數據 更新界面,響應點擊通知這個動做
    completionHandler(UIBackgroundFetchResultNewData);
}

11.PushMeBaby

  1. 做用:測試APNs的開源Mac項目,充當服務器,能夠將內容提交給蘋果的APNs服務器,而後APNs服務器再推送內容給用戶的設備
  2. 使用
    1. 註銷報錯的代碼
    2. 修改ApplicationDelegate.m文件中self.deviceToken
    3. 添加推送證書到項目中,並更名爲apns.cer
    4. 運行填寫信息,點擊Push按鈕完成發送
    5. 注意:出現SSLwrite():-36 94錯誤  http://www.cnblogs.com/czq1989/p/5314940.html

          沒法拿到證書的路徑:http://www.cnblogs.com/czq1989/p/5312146.html

demo:https://github.com/TigerCui/RemoteNotificationDemo.git

相關文章
相關標籤/搜索