标签:
之前做过环信和友盟的推送,照着官方文档集成其实挺简单的,今天公司需要,特地做了一下极光推送。不用不知道,原来极光推送集成如此简单,不得不说说了。
当然做推送钱需要做一些准备工作了,就是推送必须的p12推送证书:开发环境(开发时测试需要的推送证书)、生产环境(发布到AppStore时需要的推送证书),因为xcode已经升级到了7.0以上,所以一些真机测试的配置文件证书就需要自己手动去创建了,只要有Apple ID就能自动生成,免费测试:
制作证书的过程就不啰嗦了,详细看官方文档或者如下推荐:
http://jingyan.baidu.com/article/c1465413975cba0bfcfc4ccf.html
http://docs.jpush.io/client/ios_tutorials/#ios_1
http://docs.jpush.io/guideline/ios_guide/
http://allluckly.cn/投稿/tuogao28?utm_source=tuicool&utm_medium=referral
创建完证书,就是去极光官网注册账号,创建应用,截图如下:
将创建的证书上传到应用上了,上传成功后的截图如下:
证书上传成功后,生成APP Key,截图如下:
好了,这下工作做完了,剩下的就是代码实现了:
第一步:下载SDK,将需要的两个文件导入项目中:
包名为JPush-iOS-SDK-{版本号}
第二步:导入需要依赖的库文件:
第三步:创建一个工具类,名称为KJJPushHelper,封装注册时的各种方法
.h
//
// KJJPushHelper.h
//
// Created by mac on 16/5/5.
// Copyright © 2016年 mac. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface KJJPushHelper : NSObject
// 在应用启动的时候调用
+ (void)setupWithOption:(NSDictionary *)launchingOption
appKey:(NSString *)appKey
channel:(NSString *)channel
apsForProduction:(BOOL)isProduction
advertisingIdentifier:(NSString *)advertisingId;
// 在appdelegate注册设备处调用
+ (void)registerDeviceToken:(NSData *)deviceToken;
// ios7以后,才有completion,否则传nil
+ (void)handleRemoteNotification:(NSDictionary *)userInfo completion:(void (^)(UIBackgroundFetchResult))completion;
// 显示本地通知在最前面
+ (void)showLocalNotificationAtFront:(UILocalNotification *)notification;
@end
.m
//
// KJJPushHelper.m
// Created by mac on 16/5/5.
// Copyright © 2016年 mac. All rights reserved.
//
#import "KJJPushHelper.h"
#import "JPUSHService.h"
@implementation KJJPushHelper
+ (void)setupWithOption:(NSDictionary *)launchingOption
appKey:(NSString *)appKey
channel:(NSString *)channel
apsForProduction:(BOOL)isProduction
advertisingIdentifier:(NSString *)advertisingId{
// Required
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1
// ios8之后可以自定义category
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
// 可以添加自定义categories
[JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
UIUserNotificationTypeSound |
UIUserNotificationTypeAlert)
categories:nil];
} else {
#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_8_0
// ios8之前 categories 必须为nil
[JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)
categories:nil];
#endif
}
#else
// categories 必须为nil
[JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)
categories:nil];
#endif
// Required
[JPUSHService setupWithOption:launchingOption appKey:appKey channel:channel apsForProduction:isProduction advertisingIdentifier:advertisingId];
return;
}
+ (void)registerDeviceToken:(NSData *)deviceToken {
[JPUSHService registerDeviceToken:deviceToken];
return;
}
+ (void)handleRemoteNotification:(NSDictionary *)userInfo completion:(void (^)(UIBackgroundFetchResult))completion {
[JPUSHService handleRemoteNotification:userInfo];
if (completion) {
completion(UIBackgroundFetchResultNewData);
}
return;
}
+ (void)showLocalNotificationAtFront:(UILocalNotification *)notification {
[JPUSHService showLocalNotificationAtFront:notification identifierKey:nil];
return;
}
@end
第四步:创建一个APPDelegate的分类,在该类中调用KJJPushHelper中的类方法
// AppDelegate+KJJPushSDK.h
//
// Created by mac on 16/5/5.
// Copyright © 2016年 mac. All rights reserved.
//
#import "AppDelegate.h"
@interface AppDelegate (KJJPushSDK)
-(void)JPushApplication:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
@end
// AppDelegate+KJJPushSDK.m
//
// Created by mac on 16/5/5.
// Copyright © 2016年 mac. All rights reserved.
//
#import "AppDelegate+KJJPushSDK.h"
#import "KJJPushHelper.h"
#define JPushSDK_AppKey @"31e01f6a2f6d4b1209061aec"
#define isProduction NO
@implementation AppDelegate (KJJPushSDK)
-(void)JPushApplication:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
[KJJPushHelper setupWithOption:launchOptions appKey:JPushSDK_AppKey channel:nil apsForProduction:isProduction advertisingIdentifier:nil];
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// Required - 注册 DeviceToken
[KJJPushHelper registerDeviceToken:deviceToken];
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
// Required,For systems with less than or equal to iOS6
[KJJPushHelper handleRemoteNotification:userInfo completion:nil];
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
// IOS 7 Support Required
[KJJPushHelper handleRemoteNotification:userInfo completion:completionHandler];
// 应用正处理前台状态下,不会收到推送消息,因此在此处需要额外处理一下
if (application.applicationState == UIApplicationStateActive) {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"收到推送消息"
message:userInfo[@"aps"][@"alert"]
delegate:nil
cancelButtonTitle:@"取消"
otherButtonTitles:@"确定",nil];
[alert show];
}
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
//Optional
NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
[KJJPushHelper showLocalNotificationAtFront:notification];
return;
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[application setApplicationIconBadgeNumber:0];
return;
}
@end
第五步:在AppDelegate中注册即可
//注册极光推送
[self JPushApplication:application didFinishLaunchingWithOptions:launchOptions];
好了,大功告成,插上真机运行:打印结果如下
去官网测试一下:
真机收到消息截图:
集成过程中遇到的问题,困扰了好久,后来找出来了,分享一下:
当时证书一切都没有问题,但是总是出现这个打印:
错误信息JPUSH | W - [JPUSHClientController] Not get deviceToken yet. Maybe: your certificate not configured APNs? or current network is not so good so APNs registration failed? or there is no APNs register code? Please refer to JPush docs.
推送消息时,出现的提示:
我的原因是:
由于项目之前用到了环信SDK,环信得已经注册了通知,在AppDelegate中注册通知,didRegisterForRemoteNotificationsWithDeviceToken与didFailToRegisterForRemoteNotificationsWithError方法,均不执行。。。需到环信注册通知的地方,再次注册极光通知。方可以获取到Token执行。
标签:
原文地址:http://www.cnblogs.com/XYQ-208910/p/5463802.html