服务器端 iPhone APNS 通信

Posted

技术标签:

【中文标题】服务器端 iPhone APNS 通信【英文标题】:Server Side iPhone APNS Communication 【发布时间】:2009-06-30 04:55:02 【问题描述】:

我有一个简单的问题。对于苹果推送通知服务,我需要有自己的服务器,它将推送通知发送到苹果服务器,对吧?

我可以在常规虚拟主机帐户上使用简单的 php 脚本来执行此操作,还是需要一个具有完整管理员访问权限的专用服务器?

如果这在 PHP 中是可能的,任何人都可以指出一些可以帮助我开始的示例吗?现在,我非常有信心实现客户端部分不会有问题,但服务器端对我来说仍然有点神秘......

谢谢!

弗洛里安

【问题讨论】:

【参考方案1】:

您可能可以在受限主机帐户上执行此操作,只要您可以在大部分时间保持与服务器的连接处于打开状态。一些示例代码:

http://code.google.com/p/php-apns/

另请注意,一些公司正在启动服务来专门帮助您进行推送托管(我将保持帖子中立,不提及名称,我不确定哪些服务正在运行)。

【讨论】:

【参考方案2】:

APNS 的主要问题是端口

这么多提供商没有打开 2195 端口

所以一开始就专注于此,然后去找主机提供商

这是我尝试的代码,但一个问题是无法获得设备通知

你好,

我尝试了以下代码(PHP)

$apnsHost = 'gateway.sandbox.push.apple.com';
$apnsPort = 2195;
$apnsCert = 'apple_push_notification_production.pem';

$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);

$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
if($apns)

    echo "Connection Established<br/>";
    $deviceToken = '**********';//masked

    $body = array();
    $body['aps'] = array(’alert’ => "test message");
    //$body['aps']['badge'] = 1;

    $payload = json_encode($body);


    $apnsMessage = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
    print "sending message :" . $apnsMessage . "<br/>";
    print "sending payload :" . $payload . "<br/>";
    fwrite($apns, $apnsMessage);


else
   
    echo "Connection Failed";

    echo $errorString;
    echo $error;

socket_close($apns);
fclose($apns);  

回复已建立连接 发送消息:�� d^÷Îå0ZCd%1ÄuwOOYš'ÊÈârðm¾Í�,"aps":"\u2019alert\u2019":"test message" 发送有效载荷:"aps":"\u2019alert\u2019":"test message"

但我无法收到通知

有什么帮助吗?

【讨论】:

以上是关于服务器端 iPhone APNS 通信的主要内容,如果未能解决你的问题,请参考以下文章

苹果消息推送机制

java通知书怎么实现

是否有必要在服务器端开发具有会话令牌控制的 iPhone Native App?

iPhone 未收到推送通知

iOS消息推送原理

IOS系统推送原理