这几天被远程推送给整怕了,没少请教朋友、老师的。现在来分享一下我的成果。
先说说问题以及解决办法,最后上代码。
第一、运行代码的时候会出现这样的问题。
或者
这里你会发现一个很奇怪的现象,如果你是iOS9以上的,是没有问题的,但是iOS9以下的就会出现这个问题,百度了许多也没有找到什么结局方案。
好了,言归正传,直接说解决方法。
1⃣️、你检查一下项目中的两个地方开启了没有。
如图:
或者
2⃣️、怎么实现远程推送(这里就拿极光推送为例)
A、创建证书请求签名 在spolight中搜索 keychain
B、请求证书
C、填写邮箱和名称,注意一定要选择存储到磁盘
D、到了这里就是重点了,进入开发者中心。要启用远程推送通知,你必须创建一个明确的App ID,根据这个明确App ID创建远程推送通知的开发证书和发布证书
1,进入开发者中心 https://developer.apple.com/
2,进入证书管理(Certificates, Identifiers & Profiles)
3,创建一个明确的App ID
4,指定AppID的描述名称,只是为了便于识别
5,往下拉页面,使用明确Bunld ID
6,在往下拉界面,选择push notifcation
7,点击 continue 进入下个界面 push notifation是可以配置的 让点击submit
8,进入下一个界面点击 "Done" 到此为止 一个明确的App ID已经配置成功
9,点击编辑
10,点击刚才界面的Edit按钮,进入下面的界面
11,创建请求证书签名 (选择刚刚在A步骤里面创建的文件)
12,到了这里你就完成大半了,你可以看看这里是不是变绿色了。
13,点击下载证书
14,安装证书。注意先安装顺序
首先安装 ios_development.cer 双击就可
注意:钥匙串中系统-证书要有,登陆-我证书中也要有,如只有一处有,拷贝一份到另外一个地方放
然后再安装 aps_development.cer 双击就可,步骤同上。
E、导出P12文件,设置密码(这里的密码要记住,等会在极光要验证)
F、进入极光,安装极光文档创建应用 https://www.jpush.cn
最后出现这个界面
注意如果在保存修改的时候出现这个问题 开发或者生产证书出错
解决方案:
- 首先产生从证书管理中心从新下载一个新的aps_deleveper.cer替换这个,安装新下载的aps_deleveper.cer,需要把原来的那个给删除,才能保证这个新的能够安装上去,然后重新导出一个.p12,在上传JPush(一般这样搞下就可以了)
- 有时候是证书安装时候,有问题把证书重写删除重新安装一下
- 如果上面方法,搞了一遍还不行,终极解决方案,把所有的证书都删除了重新搞
G、剩下就是上代码了。
按照极光文档集成
1,在didFinishLaunchingWithOptions:(NSDictionary *)launchOptions这个方法里写入
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:@"你的APPKEY" channel:@"Publish channel" apsForProduction:NO];
// 去掉应用图标上数字
application.applicationIconBadgeNumber = 0;
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
/*
UIUserNotificationTypeNone = 0, 没有通知权限
UIUserNotificationTypeBadge = 1 << 0, 显示应用图标右上角的数字
UIUserNotificationTypeSound = 1 << 1, 发送通知的时候播放声音
UIUserNotificationTypeAlert = 1 << 2, 显示横幅或弹窗
*/
UIUserNotificationType types = UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound;
// 创建用户通知设置对象
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:types categories:nil];
// 注册用户通知设置
[application registerUserNotificationSettings:setting];
}
2,获取token
但APNs服务器返回deviceToken的时候调用该方法
@param application 应用
-
@param deviceToken deviceToken 包含(手机的UUID,应用BundleID)
- (void) application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [JPUSHService registerDeviceToken:deviceToken];}
3,实现推送提示 可以自定义弹出框
iOS7之前的方法
- 如果应用程序在"后台",点击远程推送通知进来的时候会调用该方法
- 当应用程序在 "前台" 一旦接收到远程推送通知就会执行该方法
- 如果用户退出了应用程序,点击远程推送通知不会执行该方法
实现点击远程通知,进入App调用的方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSLog(@"%s",func);// [JPUSHService handleRemoteNotification:userInfo]; NSString *message = [[userInfo objectForKey:@"aps"]objectForKey:@"alert"]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil ,nil]; application.applicationIconBadgeNumber -= 1; [alert show];}
3⃣️、连接服务器,自定义后台推送
这里就需要借助 Provider发送远程通知
Provider集成是服务端的事情,不用我们搞,我们这里就使用一个Mac版的程序,测试下我们iPhone的程序.
步骤:
打开 PushMeBaby 项目 压缩包地址:http://pan.baidu.com/s/1qYd5ER6
把我们生成的SSL开发证书"aps_development.cer"拖入到项目中pushMebaby
修改ApplicationDelegate.m的init方法,init方法代码如下
self.deviceToken = @"";
self.payload = @"{\"aps\":{\"alert\":\"自定义后台推送\",\"badge\":1}}";
self.certificate = [[NSBundle mainBundle] pathForResource:@"apns" ofType:@"cer"];
修改deviceToken为上面获取到deviceToken,注意这个deviceToken 没有前后的尖括号
self.deviceToken = @"afd72037 3adb7d1c 3529032b be1582b9 49a1a89d 995da320 b6d78c93 b7d9a3a4";
修改证书名称为我们刚拖入进来证书名称 "aps_development"
self.certificate = [[NSBundle mainBundle] pathForResource:@"aps_development" ofType:@"cer"];
运行PushMeBaby程序
点击"始终允许",弹出如下窗口
效果图:
终于写完了。喜欢我的朋友可以加关注,麻烦点个喜欢,谢谢!
刚刚新建了一个分享交流群,366270001,期待你们的加入。