【PHP】iOS推送通知以及反馈服务

近来项目是完成一个PHP的推送服务器,无论是PHP,APNs还是GCM基本上都是从零开始。

写下一点见解,方便以后继续做代码的搬运工。

因为对PHP跟iOS都不熟悉,可能有错漏。。。穷孩子没有用过iOS的东西。。。

设备如果希望能够及时收到服务器的消息,大概有三种方式:

1)轮询(Pull)方式:客户端与服务器主动连接查询。因为及时性以及耗电量等要求不可得兼,一般不考虑。

2)SMS(Push)方式:在Android平台,可以通过拦截SMS消息并且解析消息内容来了解服务器的意图,并获取其显示内容进行处理。但是这个方案的成本相对较高,需向移动公司缴纳费用

3)持久连接(Push)方式:在Android上有GCM,设置可以跑自己的后台程序链接自己的服务器。在iOS上就限定了只能使用苹果自身的APNs(Apple Push Notification Service)

【PHP实现APNs的推送通知】

准备好pem文件之后,php方面发送推送通知的代码如下:

private static function pushIOS($deviceToken=‘‘,$message=‘‘){

        $body = array("aps" => array("alert" => $message,"badge" => 2,"sound"=>‘default‘));  //推送方式,包含内容和声音

        $ctx = stream_context_create();
        //如果在Windows的服务器上,寻找pem路径会有问题,路径修改成这样的方法:
        $pem = dirname(__FILE__) . ‘/‘ . ‘apns-dev.pem‘;
        stream_context_set_option($ctx,"ssl","local_cert",$pem);
        //linux 的服务器直接写pem的路径即可
        //stream_context_set_option($ctx,"ssl","local_cert","apns-dev.pem");
        $pass = "1234";
        stream_context_set_option($ctx, ‘ssl‘, ‘passphrase‘, $pass);
        //must select between two servers:if for testing,select sandbox server and Dev pem file ; if for relese,use Product pem and server
        //$fp = stream_socket_client("ssl://gateway.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
        $fp = stream_socket_client("ssl://gateway.sandbox.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
        if (!$fp)
        {
            echo "Failed to connect $err $errstrn";
            return;
        }
        print "Connection OK\n";
        $payload = json_encode($body);
        $msg = chr(0) . pack("n",32) . pack("H*", str_replace(‘ ‘, ‘‘, $deviceToken)) . pack("n",strlen($payload)) . $payload;
        echo "sending message :" . $payload ."\n";
        fwrite($fp, $msg);
        fclose($fp);
    }

【PHP实现APNs的Feedback Service】

function send_feedback_request() {
    //connect to the APNS feedback servers
    //make sure you‘re using the right dev/production server & cert combo!
    $stream_context = stream_context_create();
    stream_context_set_option($stream_context, ‘ssl‘, ‘local_cert‘, ‘/path/to/my/cert.pem‘);
    $pass = "1234";
    stream_context_set_option($ctx, ‘ssl‘, ‘passphrase‘, $pass);

    $apns = stream_socket_client(‘ssl://feedback.push.apple.com:2196‘, $errcode, $errstr, 60, STREAM_CLIENT_CONNECT, $stream_context);//如果是开发中的话,地址应该是:feedback.sandbox.push.apple.com:2196
    if(!$apns) {
        echo "ERROR $errcode: $errstr\n";
        return;
    }

    $feedback_tokens = array();
    //and read the data on the connection:
    while(!feof($apns)) {
        $data = fread($apns, 38);
        if(strlen($data)) {
            $feedback_tokens[] = unpack("N1timestamp/n1length/H*devtoken", $data);
        }
    }
    fclose($apns);
    return $feedback_tokens;
}

顺利的话,这个方法的返回值应该是如下形式:

Array
(
    Array
    (
        [timestamp] => 1266604759
        [length] => 32
        [devtoken] => abc1234..............etcetc
    ),
    Array
    (
        [timestamp] => 1266604922
        [length] => 32
        [devtoken] => def56789..............etcetc
    ),
)

苹果的尿性,一点都不人性化。Google的GCM每次推送过去都会返回每条消息的发送结果,如果设备已经卸载了应用导致id不再可用也马上可以看到,群发消息也支持一千条一千条地发送。

苹果的只能一条条发送,并且调用这个不知所谓的反馈服务。

果粉看到这里可以能骂人,不过我是果黑,不管。

时间: 2024-11-04 20:46:15

【PHP】iOS推送通知以及反馈服务的相关文章

iOS 推送通知流程

别的不说,现在AppDelegate.m中添加以下代码块 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     // 将这行代码插入     [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationT

IOS推送通知测试工具PushMeBaby

下载了PushMeBaby在xcode5里中不能使用,类库变了.需要添加Carbon.framework库,在引用的地方改成: #include <Carbon/Carbon.h>,程序就可以 运行了.测试时要变成自己的证书. 下载地址:点击打开链接 IOS推送通知测试工具PushMeBaby,码迷,mamicode.com

Clojure:两步发送iOS推送通知(apns)

首先在project.clj中,添加对notnoop 类库的引用:[com.notnoop.apns/apns "0.2.3"] 然后使用如下方法就可以发送推送消息了: 1 (ns demo.apns 2 (:import (com.notnoop.apns APNS))) 3 4 (defn send-push-notification 5 [device-tokens message] 6 (loop [rest-device-tokens device-tokens 7 sent

IOS推送http2使用netty服务启动异常

IOS推送http2使用netty服务启动异常 现象 使用netty开发×××送HTTP2,本机运行正常,部署至linux服务器异常. 原因 是linux服务器内核版本过低,所使用GLIBC类库版本过低.netty要求GLIBC_2.10,我的服务器最高才GLIBC_2.5. linux查看GLIBC版本命令 strings /lib64/libc.so.6 |grep GLIBC_ 解决办法 升级linux内核版本以及GLIBC类库版本. 以下附netty服务器异常日志 2018-11-18

ios推送通知之ios推送证书的申请和使用配置

很多人初次接触推送通知,不知道怎么去申请ios推送证书和配置推送. 很多人犯的错误就是用推送证书p12去打包ipa,推送不是用来打包的,下面详细介绍ios推证书的申请和配置使用. ios推送证书分为测试调试用的iOS推送证书(开发环境)和上架到App Store的ios 推送证书!(生产环境) APP要推送通知首先要在创建APPID时勾选推送服务. 推送证书是配置上传到推送平台的,如极光推送.个推.小米推送等,不是用来打包ipa的,下面会有介绍. 一.创建唯一标示符App IDs 首先打开开发者

iOS推送通知

一.消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图1-1: 1.Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服务端[消息的发起者]): 2.APNS:Apple Push Notification Service[苹果消息推送服务器]: 3.iPhone:用来接收APNS下发下来的消息: 4.Client App:IOS设备上的应用程序,用来接收iphone传递APNS下发的消息到制

iOS 推送通知中那些让你故意犯的错误~

最近两天的工作中被推送这个玩意儿折磨了好一会,还好经过"不懈地"努力,弄明白了其中的原理.目前大部分app中使用的推送基本上都是第三方集成好的,都有官方的代码,所以写起来还是非常简单的.这里记录的是其中不可避免的,而官方文档中又可能没有提到的一些问题的解决方法. 首大家要搞清楚2个证书的使用位置,一个是开放证书,另一个是生产证书.一般在使用第三方集成的推送库中,都会要求上传这2个已经转化为.pem格式的证书.前者是在测试阶段时使用的,在真机上测试推送时,记得要选择开发模式,而且要记得把

iOS推送通知(Push Notification)的Erlang实现

本文来自:瑞仙的Erlang开发博客 原文链接:http://blog.csdn.net/zhongruixian/article/details/39528765 一.前言 关于cer/pem证书转换,网上很多资料,我这就不说了, 网上有PHP实现的Push Notification,可以参考, 为了更好的做PUSH服务定制,我这里以Erlang(gen_server)实现iOS Push Notification 二.协议 1.协议分析 表1 名称 长度 描述 Command 1 字节 固定

iOS 远程推送通知 详解

1: ios本地通知和远程通知 http://wangjun.easymorse.com/?p=1482 2: 苹果远程通知服务申请激活例图 (外国佬写的.) http://mobiforge.com/developing/story/programming-apple-push-notification-services 3:书籍参考:iPhone 开发秘籍 第16章 推送通知. 好了,进入正文: 首先是申请证书的网址 https://developer.apple.com/ios/manag