iOS推送(利用極光推送)

来源:http://www.cnblogs.com/MasterPeng/archive/2016/08/05/5741680.html
-Advertisement-
Play Games

本文主要是基於極光推送的SDK封裝的一個快速集成極光推送的類的封裝(不喜勿噴) (1)首先說一下推送的一些原理: Push的原理: Push 的工作機制可以簡單的概括為下圖 圖中,Provider是指某個iPhone軟體的Push伺服器,這篇文章我將使用.net作為Provider。 APNS 是A ...


本文主要是基於極光推送的SDK封裝的一個快速集成極光推送的類的封裝(不喜勿噴)

 

(1)首先說一下推送的一些原理:

Push的原理:

Push 的工作機制可以簡單的概括為下圖

圖中,Provider是指某個iPhone軟體的Push伺服器,這篇文章我將使用.net作為Provider。 
APNS 是Apple Push Notification Service(Apple Push伺服器)的縮寫,是蘋果的伺服器。

上圖可以分為三個階段。

第一階段:.net應用程式把要發送的消息、目的iPhone的標識打包,發給APNS。 
第二階段:APNS在自身的已註冊Push服務的iPhone列表中,查找有相應標識的iPhone,並把消息發到iPhone。 
第三階段:iPhone把發來的消息傳遞給相應的應用程式, 並且按照設定彈出Push通知。

 

    從上圖我們可以看到。

   1、首先是應用程式註冊消息推送。

   2、 IOS跟APNS Server要deviceToken。應用程式接受deviceToken。

   3、應用程式將deviceToken發送給PUSH服務端程式。

   4、 服務端程式向APNS服務發送消息。

   5、APNS服務將消息發送給iPhone應用程式。

    無論是iPhone客戶端跟APNS,還是Provider和APNS都需要通過證書進行連接的。下麵我介紹一下幾種用到的證書。

 

(2)關於基於極光推送SDK類的封裝


  2.1  創建一個繼承於NSObject的類  ,暫時命名為  MyJPush吧

  在.h文件中先添加幾個方法:

  /** 註冊JPush */

  +(void)registerJPush:(NSDictionary *)launchOptions;

 

  /** 添加監聽者 */

  +(void)addJPushListener:(id<CoreJPushProtocol>)listener;

 

  /** 移除監聽者 */

  +(void)removeJPushListener:(id<CoreJPushProtocol>)listener;

 

  /** 註冊alias、tags */

  +(void)setTags:(NSSet *)tags alias:(NSString *)alias resBlock:(void(^)(BOOL res, NSSet *tags,NSString *alias))resBlock;

 

  .m文件的實現:

 

 需要巨集定義一些變數:

   

  #define JPushAppKey @"***********"   //極光推送的APPKey

  #define JPushChannel @"AppStore"         //指明應用程式包的下載渠道

  #define JPushIsProduction NO                 //是否是生產環境

  

  /** 註冊JPush */

  +(void)registerJPush:(NSDictionary *)launchOptions{

    

    // Required

    //可以添加自定義categories

    [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |

                                                      UIUserNotificationTypeSound |

                                                      UIUserNotificationTypeAlert)

                                          categories:nil];

    

    // Required

    //如需相容舊版本的方式,請依舊使用[JPUSHService setupWithOption:launchOptions]方式初始化和同時使用pushConfig.plist文件聲明appKey等配      置內容。

    [JPUSHService setupWithOption:launchOptions appKey:JPushAppKey channel:JPushChannel apsForProduction:JPushIsProduction];

    

}

 

 

 

  /** 添加監聽者 */

  +(void)addJPushListener:(id<CoreJPushProtocol>)listener{

    

    MyJPush *jpush = [MyJPush sharedCoreJPush];

    

    if([jpush.listenerM containsObject:listener]) return;

    

    [jpush.listenerM addObject:listener];

}

 

 

  /** 移除監聽者 */

  +(void)removeJPushListener:(id<CoreJPushProtocol>)listener{

    

    MyJPush *jpush = [MyJPush sharedCoreJPush];

    

    if(![jpush.listenerM containsObject:listener]) return;

    

    [jpush.listenerM removeObject:listener];

}

 

 

  -(NSMutableArray *)listenerM{

    

    if(_listenerM==nil){

        _listenerM = [NSMutableArray array];

    }

    

    return _listenerM;

}

 

 

  -(void)didReceiveRemoteNotification:(NSDictionary *)userInfo{

    

    [self handleBadge:[userInfo[@"aps"][@"badge"] integerValue]];

    

    if(self.listenerM.count==0) return;

    

    [self.listenerM enumerateObjectsUsingBlock:^(id<CoreJPushProtocol> listener, NSUInteger idx, BOOL *stop) {

        

        if([listener respondsToSelector:@selector(didReceiveRemoteNotification:)]) [listener didReceiveRemoteNotification:userInfo];

    }];

}

 

 

 

  /** 處理badge */

  -(void)handleBadge:(NSInteger)badge{

    

    NSInteger now = badge-1;

    [[UIApplication sharedApplication] cancelAllLocalNotifications];

    [UIApplication sharedApplication].applicationIconBadgeNumber=0;

    [UIApplication sharedApplication].applicationIconBadgeNumber=now;

    [JPUSHService setBadge:now];

}

 

 

 

  +(void)setTags:(NSSet *)tags alias:(NSString *)alias resBlock:(void(^)(BOOL res, NSSet *tags,NSString *alias))resBlock{

    

    MyJPush *jpush = [MyJPush sharedCoreJPush];

 

    [JPUSHService setTags:tags alias:alias callbackSelector:@selector(tagsAliasCallback:tags:alias:) object:jpush];

    

    jpush.ResBlock=resBlock;

}

 

 

  -(void)tagsAliasCallback:(int)iResCode tags:(NSSet *)tags alias:(NSString *)alias{

 

    if(self.ResBlock != nil) self.ResBlock(iResCode==0,tags,alias);

}

 

  2.2  其次創建一個基於APPDelegate的類別文件     暫時命名為  AppDelegate+JPush

 

  實現下列幾個方法:

  

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    

    // Required

    [JPUSHService registerDeviceToken:deviceToken];

}

 

  - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

    

    // Required,For systems with less than or equal to iOS6

    [JPUSHService handleRemoteNotification:userInfo];

}

 

  - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {  

 

    // IOS 7 Support Required

    [JPUSHService handleRemoteNotification:userInfo];

    completionHandler(UIBackgroundFetchResultNewData);

    

    CoreJPush *jpush = [CoreJPush sharedCoreJPush];

    [jpush didReceiveRemoteNotification:userInfo];

}

 

這兩個文件可以直接拿到自己的項目中使用,然後在項目中添加以下需要依賴的庫

.CFNetwork.framework

.CoreFoundation.framework

.CoreTelephony.framework

.SystemConfiguration.framework

.Security.framework

. libz.tbd

 

第二步進行項目配置:

. (1) Search Paths 下的 User Header Search Paths 和 Library Search Paths為`$(PROJECT_DIR)/CoreJPush/CoreJPush/Lib`。

. (2) 選中Project-Target-Capabilities-Background Modes,勾選Remote Notifications。

. (3) 請修改CoreJPush框架內Common文件夾下PushConfig.plist的Appkey為您的Appkey。

. (4) 如果你的工程需要支持小於7.0的iOS系統,請到Build Settings 關閉 bitCode 選項,否則將無法正常編譯通過。

. (5)允許XCode7支持Http傳輸方法

        

        如果用的是Xcode7時,需要在App項目的plist手動加入以下key和值以支持http傳輸:

        

          <key>NSAppTransportSecurity</key> 

              <dict> 

          <key>NSAllowsArbitraryLoads</key> 

                <true/> 

            </dict>

 

最重要的一步:

   1.註冊JPush

   請刪除您的AppDelgate中所有有關推送的方法,因為CoreJPush內部已經封裝。

 

    #import "MyJPush.h"

    //註冊JPush

    [MyJPush registerJPush:launchOptions];

  

2.在您任意想得到推送數據的地方,三句代碼搞定:

 

      //1.添加一個監聽者:此監聽者是遵循了CoreJPushProtocol協議

      [MyJPush addJPushListener:self];

      

      

      //2.你需要在合適的地方(比如dealloc),移除監聽者

      [MyJPush removeJPushListener:self];

      

      

      //3.您已經遵循了MyJPushProtocol協議,直接在.m文件裡面敲did ,Xcode會提示你如下方法:

      -(void)didReceiveRemoteNotification:(NSDictionary *)userInfo{

          NSLog(@"ViewController: %@",userInfo);

      }

 

    #pragma mark   -   在極光推送網站發送消息,帶參數,手機接收到消息後進行一系列操作

 

    //獲取推送的信息(包括推送時添加的key和value,通過key獲取value的值)

    -(void)didReceiveRemoteNotification:(NSDictionary *)userInfo{

    NSLog(@"controller: %@",userInfo);

    

    if ([userInfo.allKeys containsObject :@"key"]) {           //這裡的key是自己在極光推送的平臺上發送通知時自己創建的key和value

        NSLog(@"發送通知成功,開始跳轉");

        

        WebViewController *webVc = [[WebViewController alloc]init];

        

        webVc.UrlString = userInfo[@"key"];

        

        [self.navigationController pushViewController:webVc animated:YES];

        

    }

}

 

別的一些操作查看極光推送的文檔就可以了,封裝兩個文件是為了以後配置和使用的時候更加方便,還有比較簡單的證書的配置啊什麼的就不再多說了,網上以及極光推送官網的文檔中有很明確的說明,此處需要使用的是極光推送 jpush-ios-2.1.5以後的版本

 

有需要或者指正的小伙伴可以給我留言哦!

如需源碼,可留言單獨贈送

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • × 目錄 [1]定義 [2]創建 [3]組成[4]引用 前面的話 javascript中的難點是函數、對象和繼承,前面已經介紹過函數系列。從本系列開始介紹對象部分,本文是該系列的第一篇——初識對象 對象定義 javascript的基本數據類型包括undefined、null、boolean、stri ...
  • 前言 這一章的內容學到了事件隊列和非同步的API。js只是運行在其他應用程式的腳本語言。js即依賴於應用程式,也獨立與應用程式。可以使它可以在多平臺,多種環境上運行。ECMAScript標準中沒有關於併發的說明。這章討論的是一些常用的方法,使用事件和非同步API是js編程的基礎部分。非同步API,有set... ...
  • 寫在前面 1.在客戶端、服務端架構中,HTTP協議是主流通信技術; 2.HTTP協議的無狀態特性,節省帶寬,較少伺服器的負載,緩衝技術具有重要的運用;這裡主要講解在客戶端瀏覽器中angular如何讀寫緩存... 如何實現 1.angular提供了ngCookies模塊來實現讀寫緩存的操作,基於ang ...
  • HTML基本元素(HTML框架、HTML表單、HTML5表單新屬性) ...
  • (1)瞭解背景:歷史、現狀、發展、應用領域、特點 ——要瞭解我要學的這門技術/語言的來龍去脈,尤其是現狀,這樣我們才知道學習它的價值等。 (2)搭建運行/測試環境 ——前端還好,要是後臺語言的話據說光搭建環境有的就需要半天,畢竟這些東西做好了,我們才能看到效果,事半功倍。 (3)編寫Hello Wo ...
  • 本以為解決跨域上傳後沒有問題了,不成想被測試找出一個問題,那就是在手機上拍照上傳後圖片會旋轉。很頭痛,不過沒有辦法,問題還是需要解決的。在查閱了一系列資料後我找到了相應的解決方案,利用exif.js獲取圖片旋轉的方向,然後再轉過來圖片,之後再上傳。這個方案需要修改前面的腳本,同樣的,由於要傳base ...
  • 先舉個簡單的例子, var myCanvas = document.getElementById("myCanvas"); var context= myCanvas.getContext("2d"); context.beginPath(); context.moveTo(150, 50); co ...
  • Android和iOS開發都支持C++開發,可以一套代碼多平臺使用。同時C++難以反編譯的特性也可以為Android開髮帶來代碼的保密,另一native特性也可以提高代碼的運行效率。 一、為什麼使用C/C++ 1. 便於移植,用C/C++寫得庫可以方便在其他的平臺上再次使用。 2. 代碼的保護,由於 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...