关闭

iOS 远程推送的详细配置

标签: iOS推送APNS
1218人阅读 评论(0) 收藏 举报
分类:

首先,来说一下苹果的推送机制。顾名思义,推送,是指服务器向客户端发送消息,那么在iOS中,应用是被后台挂起的,并不能一直连接网络,那么服务器怎么才能把消息发送到客户端呢?这就用到推送,苹果的推送机制,是只能由APNS发送推送通知,所以你自己的后台服务器想给客户端推送通知,得把要推送的内容发送给APNS。

说到这里,如果还不了解苹果的推送机制,可以自行查看资料。总之整体的流程就是:APP启动的时候,获取本设备的device_token,然后把这个device_token告诉你自己的服务器,服务器拿到这个device_token后,使用证书文件,向苹果的APNS服务器发起一个SSL连接,连接成功后发送一个JSON串,JSON里面包含device_token、通知内容以及其他的一些东西。苹果的APNS得到JSON后,通过device_token查找设备推送消息。

那么,我们iOS前端的工作量是非常简单的,只需要获取device_token和接到通知后做什么事就可以。那么,怎么样获取设备的device_token,iOS8用到了新的方法。在APP启动的时候就调用,比如在 application: didFinishLaunchingWithOptions: 这个方法里,调用APP的注册远程推送申请方法。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    
    UIUserNotificationSettings * s =[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:s];
    [application registerForRemoteNotifications];
    
    
    return YES;
}

//若注册成功,则会回调一个方法
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSString *decToken = [NSString stringWithFormat:@"%@", deviceToken];
    //获取到之后要去掉尖括号和中间的空格
    NSMutableString *st = [NSMutableString stringWithString:decToken];
    [st deleteCharactersInRange:NSMakeRange(0, 1)];
    [st deleteCharactersInRange:NSMakeRange(st.length-1, 1)];
    NSString *string1 = [st stringByReplacingOccurrencesOfString:@" " withString:@""];
    //保存到本地
    NSUserDefaults *u = [NSUserDefaults standardUserDefaults];
    [u setObject:string1 forKey:@"deviceToken"];
    
}

//当我们正在使用APP,收到了一条通知,那么APP会直接回调这个方法,不会去弹出通知。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"Receive remote notification : %@",userInfo);
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:userInfo[@"aps"][@"alert"] delegate:self cancelButtonTitle:@"好" otherButtonTitles:nil, nil];
    [alert show];
}

在这个方法里面,处理我们接收到的消息即可。

前端的任务就这么多,别忘了把device_token交给你的服务端。


服务端的代码本来不用我们写,但是遇到不会写的,让他们去看苹果的官方文档就行。要是还看不懂,就找一个现成的代码研究一下。

程序猿攻城狮都是万能的,不仅会修电脑,还要会写后台。那么,我们就来看看后台是怎么实现的。

首先,按照上面流程来说,服务端获取到device_token后,使用证书向APNS发送推送请求,那么问题来了。挖掘机技术哪家强?

推送证书哪里来?

需要一个开发者账号。没错,和我们真机调试的证书一样,至少需要99刀。有了账号,我们就可以申请一个证书。下面,跟着一步一步看,比较麻烦。

1.需要在MacOS上生成一个CertificateSigningRequest.certSigningRequest文件。打开应用程序中的“钥匙串访问”,从菜单中选择“证书助理”-》“从证书颁发机构请求证书”



然后保存在本地就行。这样我们就获取了一个证书请求文件。

2.这里就要用到开发者账号了。进入developer.apple.com,选择numberCenter-》Certificates, Identifiers & Profiles-》Identifiers-》APP IDs。点右上角的+号,注册一个APPID,写id名,默认是Explicit App ID写个bundle名。还要勾选住App Services下的Push Notifications。这样就注册好了。

3.生成推送证书。点Certificates,右上角+,创建一个证书,以Development为例,选Apple Push Notification service SSL (Sandbox),然后直接下一步,会让你选一个APPID,选择你刚刚创建好的那个APPID,下一步,提交我们第一步生成的请求文件,然后求送证书就完成了。download下来即可。

4.下载到的是一个cer文件,我们后台肯定不能直接使用。需要做一个整合。以下以PHP为例。双击证书,或者用拖拽,把证书放到钥匙串中。



这样,在钥匙串中找到这个推送证书,前面的名字是一样的,后面是你起的bundle名。接着,就是把cer证书转化成pem文件,供后台使用。右键点击这个证书,选择“导出”,放到本地。会得到一个后缀为p12的文件。然后打开MacOS下的命令行程序,运行以下几条命令,其中会让你输入密码,是不可见的,输入完回车就行,屏幕上是看不到输入的字符的,会输入好几次密码,所以建议每次密码都输一样的。

openssl pkcs12 -clcerts -nokeys -out 文件名A.pem -in 苹果证书.p12

openssl pkcs12 -nocerts -out 文件名B.pem -in 苹果证书.p12

文件名是要自己取的,苹果证书.12 即 对应的你生成的 .12后缀的文件。

最后把用证书拆出来的两个文件合到一起:cat 文件名A.pem 文件名B.pem > lltpush.pem

最终的这个lltpush.pem是我们需要的,给后台用。

这样,就基本完成了。再写后台代码之前,还需要去developer.apple.com上建一个证书和一个描述文件,一点要选支持push的那个APPID,就是我们刚才创建的那个。这样,我们才能真机调试。总结一下,要在developer.apple.com上获取三个东西。



开头说到,后台是搭建在SAE云端的,推送代码都不用些,只要调用SAE封装好的一个类就可以。那么,想要用SAE,自己去注册一个应用,然后进入到应用首页,得配置一下证书才能使用推送。这个很简单,看一下SAE的推送说明文档就OK。





到这个设置页面,把证书上传上去,密码写你在命令行合成时候填的密码。记住你的证书序号,因为写推送的时候,要选择用哪个证书发推送。

SAE就不多介绍了,自己看下文档。现在就开始写代码了,新建一个PHP页面出来。看以下的代码。

<?php
    $cert_id = 1686;
    $device_token = $_REQUEST['device_token'];
    $message = $_REQUEST['message'];
    //这个是简单的例子,更复杂的消息格式请查看苹果官方文档
    $body = array(
                  'aps' => array( 'alert' => $message , 'badge' => 1, 'sound' => 'in.mp3')
                  );
    $apns = new SaeAPNS();
    //push消息到SAE推送服务器
    $result = $apns->push( $cert_id , $body , $device_token );
    
    if( $result && is_array($result) ){
        $dic = array('success' => '0');
        echo json_encode($dic);
        // var_dump( $result );
    } else {
        $dic = array('success' => '1');
        echo json_encode($dic);
        //var_dump($apns->errno(), $apns->errmsg());
    }
    ?>

这个接口呢,需要两个参数,一个是设备的device_token,还有就是你要推送的消息内容。然后调用SAE的方法就可以。发送成功返回JSON串。复杂的代码就不说了。

这只是个测试demo,真正的推送是后台判断的。不是我们去调接口。

就到这里吧。



0
0
查看评论

iOS开发之远程推送Push

远程推送通知 什么是远程推送通知 顾名思义,就是从远程服务器推送给客户端的通知(需要联网)远程推送服务,又称为APNs(Apple Push Notification Services) 为什么需要远程推送通知 传统获取数据的局限性 只要用户关闭了app,就...
  • binyao02123202
  • binyao02123202
  • 2015-03-12 15:01
  • 5793

iOS本地推送与远程推送详解(一图看懂)

一、简介分为本地推送和远程推送2种。可以在应用没有打开甚至手机锁屏情况下给用户以提示。它们都需要注册,注册后系统会弹出提示框(如下图)提示用户是否同意,如果同意则正常使用;如果用户不同意则下次打开程序也不会弹出该提示框,需要用户到设置里面设置。一共有三种提示类型:UIUserNotification...
  • jsd0915
  • jsd0915
  • 2017-05-31 14:05
  • 397

iOS远程推送测试

iOS远程推送测试怎么去配置远程推送证书,这里就不再重复了,大家可以看看本文后面的链接。本文重点是描述测试,包括开发测试以及发布测试。一、开发测试 这里需要用到终端,建议将aps_development.cer、pushMe.php、Push.p12放到一个文件夹中,假设名字是iOSDevelop...
  • yqmfly
  • yqmfly
  • 2015-08-14 11:56
  • 780

iOS10 远程推送和本地推送

远程推送 添加新的框架 UserNotifications.framework #import <UserNotifications/UserNotifications.h>#pragma mark 注册推送 -(void)registerPushServer { i...
  • zihuofeng_
  • zihuofeng_
  • 2016-10-26 20:19
  • 2815

iOS 10 远程推送

iOS 10 之后 终于不用再适配 iOS 7了,如果再适配的话,光推送就要写3套。当然我们说的不算,老板说的算。 好了,废话不多说。直接进入主体。 代码开始前的设置 iOS 10 的推送 与原来的都不一样,他把本地的推送 跟 远程的推送结合到一起了,UserNotifications.framew...
  • qq_25527655
  • qq_25527655
  • 2016-09-20 17:03
  • 4134

ios远程推送常见问题

常见问题: 1、在用证书和秘钥链接服务器时出现提示: Error opening client certificate private key filePushChatKey.pem20839:error:02001002:system library:fopen:No such file ord...
  • LiqunZhang
  • LiqunZhang
  • 2017-03-27 10:54
  • 731

ios远程推送------------->非常详细

最近在研究ios的推送问题,遇到了一些问题,最终整理了一下。放在这里和大家分享 APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释。如下图   Provider就是我们自己程序的后台服务器,APNS是Apple Push Notifi...
  • IOS_dashen
  • IOS_dashen
  • 2015-06-05 11:13
  • 803

iOS学习爬坑记录14:自定义远程推送通知铃声(Custom Alert Sounds)

最近在调试APP的远程推送,需要做成类似微信视频通话或者语音通话的通知铃声。找了好多资料才知道怎么自定义铃声: 官方文档中有铃声格式和长度的说明:(见https://developer.apple.com/library/ios/documentation/NetworkingInternet/C...
  • MIRAGE086
  • MIRAGE086
  • 2015-03-09 10:26
  • 3719

iOS 远程推送 (swift +java后台)

找到刚刚安装的证书 右键导出 选择 p12 类型 然后 输入密码 这个 文件 在 java 上要用到
  • berlor
  • berlor
  • 2016-11-10 09:37
  • 1117

干货——iOS本地推送与远程推送详解

一、简介 分为本地推送和远程推送2种。可以在应用没有打开甚至手机锁屏情况下给用户以提示。它们都需要注册,注册后系统会弹出提示框(如下图)提示用户是否同意,如果同意则正常使用;如果用户不同意则下次打开程序也不会弹出该提示框,需要用户到设置里面设置。一共有三种提示类型: UIUserNoti...
  • qinxianjun163
  • qinxianjun163
  • 2016-06-02 14:17
  • 1718
    个人资料
    • 访问:234678次
    • 积分:3122
    • 等级:
    • 排名:第13373名
    • 原创:102篇
    • 转载:63篇
    • 译文:1篇
    • 评论:24条
    博客专栏