您的位置:首页 > 移动开发 > IOS开发

渣蜀黍 - iOS 个人笔记(四)_极光推送使用步骤

2015-04-15 10:32 453 查看
1.进入极光创建项目



首先根据步骤生成push证书:
http://docs.jpush.cn/pages/viewpage.action?pageId=1343727
ios开发证书就得上传后缀名为.p12的文件

导出.p12的步骤:


在 Mac OS 上将 iPhone 开发人员证书转换为 P12 文件

从 Apple 下载 Apple iPhone 证书后,将其导出为 P12 证书格式。在 Mac® OS 上执行以下操作:

打开钥匙串访问应用程序(位于应用程序/实用工具文件夹中)。

如果尚未将该证书添加到钥匙串,请选择“文件”>“导入”。然后浏览到您从 Apple 获取的证书文件(.cer 文件)。

在钥匙串访问中选择密钥类别。

选择与 iPhone 开发证书相关联的私钥。

该私钥由 iPhone 开发人员识别:与之配对的<名字><姓氏>公共证书。

选择“文件”>“导出项目”。

以个人信息交换 (.p12) 文件格式保存您的密钥。

系统将提示您创建一个尝试在其他计算机上导入此密钥时需要使用的密码。

上传文件提交即可;

2.下载 iOS SDK
https://www.jpush.cn/common/products
将SDK包解压,在XCode中选择“Add files to 'Your project name'...”,将解压后的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


设置 Search Paths 下的 User Header Search Paths 和 Library Search Paths,比如SDK文件夹(默认为lib)与工程文件在同一级目录下,则都设置为"$(SRCROOT)/[文件夹名称]"即可。


5、创建并配置PushConfig.plist文件

在你的工程中创建一个新的Property List文件,并将其命名为PushConfig.plist,填入Portal为你的应用提供的APP_KEY等参数。

CHANNEL
指明应用程序包的下载渠道,为方便分渠道统计。根据你的需求自行定义即可。

APP_KEY
管理Portal上创建应用时自动生成的(AppKey)用以标识该应用。请确保应用内配置的
AppKey 与第1步在 Portal 上创建应用时生成的 AppKey 一致,AppKey 可以在应用详情中查询。



APS_FOR_PRODUCTION
1.3.1版本新增,表示应用是否采用生产证书发布( Ad_Hoc 或 APP Store ),0 (默认值)表示采用的是开发者证书,1 表示采用生产证书发布应用。请注意此处配置与 Web Portal 应用环境设置匹配。

在1.2.2或之前版本的配置文件中,有 TEST_MODE 这个键,新版的SDK不再使用,可以将它删除。
APP_KEY为:




6.调用代码

监听系统事件,相应地调用 JPush SDK 提供的 API 来实现功能。

关于极光推送,由于在iOS8之后,有了新的API,因此极光也给我们提供了适配的API。

下面我就把对极光推送相关API的封装提取出来。

下面是对极光推送而封装的一个工具类:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

/*!
* @brief 极光推送相关API封装
* @author 渣蜀黍
*/
@interface JPushHelper : NSObject

// 在应用启动的时候调用
+ (void)setupWithOptions:(NSDictionary *)launchOptions;

// 在appdelegate注册设备处调用
+ (void)registerDeviceToken:(NSData *)deviceToken;

// ios7以后,才有completion,否则传nil
+ (void)handleRemoteNotification:(NSDictionary *)userInfo completion:(void (^)(UIBackgroundFetchResult))completion;

// 显示本地通知在最前面
+ (void)showLocalNotificationAtFront:(UILocalNotification *)notification;

@end

#import "JPushHelper.h"
#import "APService.h"

@implementation JPushHelper

+ (void)setupWithOptions:(NSDictionary *)launchOptions {
// Required
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1
// ios8之后可以自定义category
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
// 可以添加自定义categories
[APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
UIUserNotificationTypeSound |
UIUserNotificationTypeAlert)
categories:nil];
} else {
#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_8_0
// ios8之前 categories 必须为nil
[APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)
categories:nil];
#endif
}
#else
// categories 必须为nil
[APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)
categories:nil];
#endif

// Required
[APService setupWithOption:launchOptions];
return;
}

+ (void)registerDeviceToken:(NSData *)deviceToken {
[APService registerDeviceToken:deviceToken];
return;
}

+ (void)handleRemoteNotification:(NSDictionary *)userInfo completion:(void (^)(UIBackgroundFetchResult))completion {
[APService handleRemoteNotification:userInfo];

if (completion) {
completion(UIBackgroundFetchResultNewData);
}
return;
}

+ (void)showLocalNotificationAtFront:(UILocalNotification *)notification {
[APService showLocalNotificationAtFront:notification identifierKey:nil];
return;
}

@end

推送功能测试:
#import "AppDelegate.h"
#import "JPushHelper.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.

[JPushHelper setupWithOptions:launchOptions];

self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[JPushHelper registerDeviceToken:deviceToken];
return;
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
[JPushHelper handleRemoteNotification:userInfo completion:nil];
return;
}

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0
// ios7.0以后才有此功能
- (void)application:(UIApplication *)application didReceiveRemoteNotification
:(NSDictionary *)userInfo fetchCompletionHandler
:(void (^)(UIBackgroundFetchResult))completionHandler {
[JPushHelper handleRemoteNotification:userInfo completion:completionHandler];

// 应用正处理前台状态下,不会收到推送消息,因此在此处需要额外处理一下
if (application.applicationState == UIApplicationStateActive) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"收到推送消息"
message:userInfo[@"aps"][@"alert"]
delegate:nil
cancelButtonTitle:@"取消"
otherButtonTitles:@"确定", nil nil];
[alert show];
}
return;
}
#endif

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
[JPushHelper showLocalNotificationAtFront:notification];
return;
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
NSLog(@"Error in registration. Error: %@", err);
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
[application setApplicationIconBadgeNumber:0];
return;
}

@end

进入极光后台 发送消息。

======================================================================================================================================

网上借鉴,个人总结,有不同观点欢迎讨论,谢谢。
By:渣蜀黍
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios library