推送前需要做一些准备工作了,就是推送必须的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,截图如下:
好了,这下工作做完了,剩下的就是代码实现了
集成压缩包内容
包名为JPush-iOS-SDK-{版本号}
- lib文件夹:包含头文件 JPUSHService.h,静态库文件jpush-ios-x.x.x.a ,支持的iOS版本为 5.0 及以上版本。(请注意:模拟器不支持APNs)
- pdf文件:集成指南
- demo文件夹:示例
第二步:导入需要依赖的库文件:
必要的框架
- CFNetwork.framework
- CoreFoundation.framework
- CoreTelephony.framework
- SystemConfiguration.framework
- CoreGraphics.framework
- Foundation.framework
- UIKit.framework
- Security.framework
- Xcode7需要的是libz.tbd;Xcode7以下版本是libz.dylib
- Adsupport.framework (获取IDFA需要;如果不使用IDFA,请不要添加)
第三步:在Appdelegate.m中法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
MainViewController *main = [[MainViewController alloc] init];
self.window.rootViewController = main;
[self.window makeKeyAndVisible];
// Required
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
//可以添加自定义categories
[JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |UIUserNotificationTypeSound |UIUserNotificationTypeAlert)categories:nil];
} else {
//categories 必须为nil
[JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert)categories:nil];
}
[JPUSHService setupWithOption:launchOptions appKey:极光平台的keychannel:可以为空apsForProduction:类型为Bool];
return YES;
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
//这个方法是设置别名和tag 可省
// [JPUSHService setTags:nil alias:@"WzxJiang" fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias) {
// NSLog(@"rescode: %d, \ntags: %@, \nalias: %@\n", iResCode, iTags , iAlias);
// }];
// Required
[JPUSHService registerDeviceToken:deviceToken];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"进入前台");
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
// //iOS 7及之后才能用,现在没人适配iOS6了吧...
// // IOS 7 Support Required
// [JPUSHService handleRemoteNotification:userInfo];
// completionHandler(UIBackgroundFetchResultNewData);
//判断app是不是在前台运行,有三个状态(如果不进行判断处理,当你的app在前台运行时,收到推送时,通知栏不会弹出提示的)
// UIApplicationStateActive, 在前台运行
// UIApplicationStateInactive,未启动app
//UIApplicationStateBackground app在后台
if([UIApplication sharedApplication].applicationState == UIApplicationStateActive)
{ //此时app在前台运行,我的做法是弹出一个alert,告诉用户有一条推送,用户可以选择查看或者忽略
UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"推送消息"
message:@"您有一条新的推送消息!"
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"查看",nil];
[alert show];
}else {
//这里是app未运行或者在后台,通过点击手机通知栏的推送消息打开app时可以在这里进行处理,比如,拿到推送里的内容或者附加 字段(假设,推送里附加了一个url为 www.baidu.com),那么你就可以拿到这个url,然后进行跳转到相应店web页,当然,不一定必须是web页,也可以是你app里的任意一个controll,跳转的话用navigation或者模态视图都可以
NSString * str = [userInfo objectForKey:@"url"];
NSLog(@"str = %@",str);
}
//这里设置app的图片的角标为0,红色但角标就会消失
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
completionHandler(UIBackgroundFetchResultNewData);
}