JPush說明文檔
JPush iOS 推送原理及問題
(參考:http://blog.jpush.cn/apns/)
JPush iOS 初步了解推送方式
(詳解: http://docs.jpush.io/client/ios_sdk/)
從上圖可以看出,JPush iOS Push 包括 2 個部分,APNs 推送(代理),與 JPush 應用內消息。
紅色部分是 APNs 推送,JPush 代理開發者的應用(需要基於開發者提供的應用證書),向蘋果 APNs 服務器推送。由 APNs Server 推送到 iOS 設備上。
藍色部分是 JPush 應用內推送部分,即 App 啟動時,內嵌的 JPush SDK 會開啟長連接到 JPush Server,從而 JPush Server 可以推送消息到 App 里。
APNs 通知
APNs 通知:是指通過向 Apple APNs 服務器發送通知,到達 iOS 設備,由 iOS 系統提供展現的推送。用戶可以通過 IOS 系統的 “設置” >> “通知” 進行設置,開啟或者關閉某一個 App 的推送能力。
JPush iOS SDK 不負責 APNs 通知的展現,只是向 JPush 服務器端上傳 Device Token 信息,JPush 服務器端代理開發者向 Apple APNs 推送通知。
獲取APNS 消息內容通過函數
• 如果 App狀態為正在前台或者后台運行,那么此函數將被調用,並且可通過AppDelegate的applicationState是否為UIApplicationStateActive判斷程序是否在前台運行。此種情況在此函數中處理:
◦ (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo; // apn內容為userInfo
• 如果是使用 iOS 7 的 Remote Notification 特性那么處理函數需要使用
◦ (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler; // apn內容為userInfo
應用內消息
應用內消息:JPush iOS SDK 提供的應用內消息功能,在 App 在前台時能夠收到推送下來的消息。App 可使用此功能來做消息下發動作。
此消息不經過 APNs 服務器,完全由 JPush 提供功能支持。
獲取應用消息內容
在方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *) launchOptions 加入下面的代碼:
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self selector:@selector(networkDidReceiveMessage:) name:kJPFNetworkDidReceiveMessageNotification object:nil];
實現回調方法 networkDidReceiveMessage
- (void)networkDidReceiveMessage:(NSNotification *)notification {
NSDictionary * userInfo = [notification userInfo];
NSString *content = [userInfo valueForKey:@"content"];
NSDictionary *extras = [userInfo valueForKey:@"extras"];
NSString *customizeField1 = [extras valueForKey:@"customizeField1"]; //自定義參數,key是自己定義的 }
JPush- iOS證書 設置指南
(請參考文檔:http://docs.jpush.cn/pages/viewpage.action?pageId=1343727 和 http://docs.jpush.cn/pages/viewpage.action?pageId=8820084)
1.創建應用程序ID
2.配置和下載證書
3.導出 .p12 證書文件
4.上傳證書
JPush-SDK集成步驟
(請參考文檔: http://docs.jpush.cn/pages/viewpage.action?pageId=2621727)
1.在JPush的管理Portal上 上傳證書並創建應用。如果對APNs證書不太了解 請參考 iOS 證書設置指南
1.1 創建成功后自動生成 AppKey 用以標識該應用。
2. 導入API開發包到應用程序項目
2.1 將SDK包解壓,將解壓后的lib子文件夾(包含APService.h、libPushSDK.a)添加到你的工程目錄中。
3.必要的框架
• CFNetwork.framework
• CoreFoundation.framework
• CoreTelephony.framework
• SystemConfiguration.framework
• CoreGraphics.framework
• Foundation.framework
• UIKit.framework
• Security.framework
• libz.dylib
4.Build Settings
4.1 設置 Search Paths 下的 User Header Search Paths 和 Library Search Paths,比如SDK文件夾(默認為lib)與工程文件在同一級目錄下,則都設置為"$(SRCROOT)/[文件夾名稱]"即可。
5.創建並配置PushConfig.plist文件
5.1 在你的工程中創建一個新的Property List文件,並將其命名為PushConfig.plist,填入Portal為你的應用提供的APP_KEY等參數。
{
"APS_FOR_PRODUCTION" = "0";//開發為0 生產為1
"CHANNEL" = "Publish channel";
"APP_KEY" = "AppKey copied from JPush Portal application";
}
5.2 CHANNEL
指明應用程序包的下載渠道,為方便分渠道統計。根據你的需求自行定義即可。
5.3 APP_KEY
• 在管理Portal上創建應用時自動生成的(AppKey)用以標識該應用。請確保應用內配置的 AppKey 與第1步在 Portal 上創建應用時生成的 AppKey 一致,AppKey 可以在應用詳情中查詢。
5.4 APS_FOR_PRODUCTION
• 1.3.1版本新增,表示應用是否采用生產證書發布( Ad_Hoc 或 APP Store ),0 (默認值)表示采用的是開發者證書,1 表示采用生產證書發布應用。請注意此處配置與 Web Portal 應用環境設置匹配。
• 在1.2.2或之前版本的配置文件中,有 TEST_MODE 這個鍵,新版的SDK不再使用,可以將它刪除。
6.添加代碼
API
APIs 主要集中在 APService 接口類里。
// 以下四個接口是必須調用的
+ (void)setupWithOption:(NSDictionary *)launchingOption; // 初始化
+ (void)registerForRemoteNotificationTypes:(NSUInteger)types
categories:(NSSet *)categories; // 注冊APNS類型
+ (void)registerDeviceToken:(NSData *)deviceToken; // 向服務器上報Device Token
+ (void)handleRemoteNotification:(NSDictionary *)
remoteInfo; // 處理收到的APNS消息,向服務器上報收到APNS消息
調用代碼
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
// Required
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
//可以添加自定義categories
[APService registerForRemoteNotificationTypes: (UIUserNotificationTypeBadge |
UIUserNotificationTypeSound |
UIUserNotificationTypeAlert)
categories:nil];
}
else
{
//categories 必須為nil
[APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)
categories:nil];
}
#else
//categories 必須為nil
[APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)
categories:nil];
#endif
// Required
[APService setupWithOption:launchOptions];
return YES;
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// Required
[APService registerDeviceToken:deviceToken];
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
// Required
[APService handleRemoteNotification:userInfo];
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
// IOS 7 Support Required
[APService handleRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
7.監聽通知
API里面提供了下面 5 種類型的通知:
extern NSString * const kJPFNetworkDidSetupNotification; // 建立連接
extern NSString * const kJPFNetworkDidCloseNotification; // 關閉連接
extern NSString * const kJPFNetworkDidRegisterNotification; // 注冊成功
extern NSString * const kJPFNetworkDidLoginNotification; // 登錄成功
extern NSString * const kJPFNetworkDidReceiveMessageNotification; // 收到消息(非APNS)
8.繼續下看
(常見問題 參考: http://docs.jpush.cn/pages/viewpage.action?pageId=7864782)
8.1 如何獲得AppKey ?
從我們自己創建得PushConfig.plist文件 獲得
- (NSString*)getAppKey
{
NSURL *urlPushConfig = [[[NSBundle mainBundle] URLForResource:@"PushConfig" withExtension:@"plist"] copy];
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfURL:urlPushConfig];
if (!dictionary)
{
return nil;
}
//appkey
NSString *strAppKey = [dictionary valueForKey:@"APP_KEY"];
if (!strAppKey)
{
return nil;
}
return [strAppKey lowercaseString];//將其中的大寫字母 轉 為小寫
}
8.2 注冊成功時 調用/** 獲得注冊ID
* get RegistrationID
*/
+ (NSString *)registrationID;