远程推送、自定义后台推送

这几天被远程推送给整怕了,没少请教朋友、老师的。现在来分享一下我的成果。
先说说问题以及解决办法,最后上代码。
第一、运行代码的时候会出现这样的问题。


44F8E8BA98F4F1C90D0B913537E3E270.jpg

或者

FE9B67A5-96FF-4902-A5F9-0AF04B3A12F7.png

这里你会发现一个很奇怪的现象,如果你是iOS9以上的,是没有问题的,但是iOS9以下的就会出现这个问题,百度了许多也没有找到什么结局方案。
好了,言归正传,直接说解决方法。
1⃣️、你检查一下项目中的两个地方开启了没有。
如图:

远程推送、自定义后台推送_第1张图片
DF238902-E47C-4B21-A16B-5C165CFADE66.png

或者

远程推送、自定义后台推送_第2张图片
E9A2646C-1138-47B0-8097-6AD4F743ED86.png

2⃣️、怎么实现远程推送(这里就拿极光推送为例)
A、创建证书请求签名 在spolight中搜索 keychain


远程推送、自定义后台推送_第3张图片
1785F13C-BA48-43E1-8ED9-433986D6C45F.png

B、请求证书


远程推送、自定义后台推送_第4张图片
A88BF7FF-D48D-4C0F-A7B5-551EB047E044.png

C、填写邮箱和名称,注意一定要选择存储到磁盘


远程推送、自定义后台推送_第5张图片
0DB2C42E-79B1-4913-B618-245F9A5A61BF.png

D、到了这里就是重点了,进入开发者中心。要启用远程推送通知,你必须创建一个明确的App ID,根据这个明确App ID创建远程推送通知的开发证书和发布证书

1,进入开发者中心 https://developer.apple.com/
2,进入证书管理(Certificates, Identifiers & Profiles)
3,创建一个明确的App ID

远程推送、自定义后台推送_第6张图片
29357383-5DEA-4395-9AFD-2A695DEC969C.png

4,指定AppID的描述名称,只是为了便于识别

远程推送、自定义后台推送_第7张图片
0286A989-F9F4-41FD-B4EA-8B27650DC7C7.png

5,往下拉页面,使用明确Bunld ID

远程推送、自定义后台推送_第8张图片
51B44833-A07B-4D80-A9DF-974422FBB05F.png

6,在往下拉界面,选择push notifcation

远程推送、自定义后台推送_第9张图片
287924C6-16C6-49E8-A079-C768A26FD231.png

7,点击 continue 进入下个界面 push notifation是可以配置的 让点击submit

远程推送、自定义后台推送_第10张图片
D94D98BB-31C7-4B9C-94CB-84E7B0FADBBF.png

8,进入下一个界面点击 "Done" 到此为止 一个明确的App ID已经配置成功

9,点击编辑


远程推送、自定义后台推送_第11张图片
554EE32E-9883-4F57-A255-12B5CFE8E018.png

10,点击刚才界面的Edit按钮,进入下面的界面

远程推送、自定义后台推送_第12张图片
C923244E-89EF-41B6-AE44-B7163037FB87.png

11,创建请求证书签名 (选择刚刚在A步骤里面创建的文件)

远程推送、自定义后台推送_第13张图片
137B7A3D-0E42-4248-9D1B-FC910465BAFA.png

12,到了这里你就完成大半了,你可以看看这里是不是变绿色了。

远程推送、自定义后台推送_第14张图片
E067B9E2-7588-4F0F-A960-D7BA26607C47.png

13,点击下载证书

远程推送、自定义后台推送_第15张图片
824A037B-4B2F-422A-8762-6E7CEE206ED5.png

14,安装证书。注意先安装顺序
首先安装 ios_development.cer 双击就可

远程推送、自定义后台推送_第16张图片
725CE36C-2072-4A1D-9760-5AA3C5EAA18F.png

注意:钥匙串中系统-证书要有,登陆-我证书中也要有,如只有一处有,拷贝一份到另外一个地方放

远程推送、自定义后台推送_第17张图片
B789203E-A648-4682-80B5-08CEEE03A118.png

然后再安装 aps_development.cer 双击就可,步骤同上。

E、导出P12文件,设置密码(这里的密码要记住,等会在极光要验证)

远程推送、自定义后台推送_第18张图片
F51E645B-1275-4EA0-9211-E4D554CC92A1.png

F、进入极光,安装极光文档创建应用 https://www.jpush.cn

远程推送、自定义后台推送_第19张图片
290B413F-2D53-4516-A455-5104069FDA85.png

最后出现这个界面

远程推送、自定义后台推送_第20张图片
A79C0DF1-0F1F-435A-9ED0-F4A8944022E4.png

注意如果在保存修改的时候出现这个问题 开发或者生产证书出错

A67738D5-14E1-4298-9E41-5A1808ADEE0C.png

解决方案:

  1. 首先产生从证书管理中心从新下载一个新的aps_deleveper.cer替换这个,安装新下载的aps_deleveper.cer,需要把原来的那个给删除,才能保证这个新的能够安装上去,然后重新导出一个.p12,在上传JPush(一般这样搞下就可以了)
  2. 有时候是证书安装时候,有问题把证书重写删除重新安装一下
  3. 如果上面方法,搞了一遍还不行,终极解决方案,把所有的证书都删除了重新搞

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之前的方法

  1. 如果应用程序在"后台",点击远程推送通知进来的时候会调用该方法
  2. 当应用程序在 "前台" 一旦接收到远程推送通知就会执行该方法
  3. 如果用户退出了应用程序,点击远程推送通知不会执行该方法
    实现点击远程通知,进入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程序
点击"始终允许",弹出如下窗口

远程推送、自定义后台推送_第21张图片
5B93B275-A0A3-4974-9C06-D061CB429852.png

效果图:

远程推送、自定义后台推送_第22张图片
image.png
远程推送、自定义后台推送_第23张图片
image.png

终于写完了。喜欢我的朋友可以加关注,麻烦点个喜欢,谢谢!

刚刚新建了一个分享交流群,366270001,期待你们的加入。

你可能感兴趣的:(远程推送、自定义后台推送)