如何用 php代码实现 ios 等多台设备的推送信息功能?
求解如何用 php代码实现 ios 等设备的推送信息功能呢?
可能有6-10万的终端设备都需要接收到推送信息,执行一次,实现多台设备都能接收到信息。
路过的给点有用的建议,谢谢啦!!! php ios 终端
[解决办法]
这个用php不好实现吧。
肯定不建议用长连接一直连着,直到有有消息就返回给用户,这样的话服务器压力肯定很大。
建议可以用心跳来实现这个功能,客户端浏览器定时向服务器获取是否有最新消息。
另外,如果不是php,比如python、nodejs、c++等实现后台,可以采用长轮询。
[解决办法]
这不是 php 能做到的!
php 是服务器端脚本,而不是服务器,更不是网络操作系统
你只不过是需要套用一下移动通讯的操作系统就能实现你的目标
[解决办法]
你要源代码自己去移动版->iphone,正好有个坛友发了个你需要得帖子
我也可以跟你说说我怎么做的,其实很简单,主要是用苹果开发账号生成证书那里要搞搞。
步骤1
-------
首先你得用php在服务端开个接口,提供给iphone手机注册device_token,也就是装了你应用的手机会向这个接口做一个http请求,把每台机器的device_token以及一些参数提交过来,然后你用php接收,存到数据库
步骤2
-----------
用php读数据,把注册的device_token从数据库读出来,拼接成一串规定格式的串,带上生成的苹果证书,往苹果提供的推送服务api做一个socket请求
关键代码1:
stream_context_set_option($ctx, 'ssl', 'local_cert', $pemFile);//$pemFile为证书文件,这个你自己上网找找生成步骤,你必须得有个apple开发帐号
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
// Open a connection to the APNS server,推送服务api,以下是沙箱环境
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT
[解决办法]
STREAM_CLIENT_PERSISTENT, $ctx);
// Create the payload body
$body['aps'] = array(
'alert' => array(
'body' => $message,
//'action-loc-key' => 'Bango App',
),
'badge' => $badge,
'sound' => 'oven.caf',
);
$deviceTokens = array();
$payload = FMFactory::GetJson()->encode($body);
$regs = FMFactory::GetQuery()->from("mobile_pn_register as m","m.*")
->where("m.mobiletype='ios' and m.registered_app_id='{$app_record_id}'")
->query();
if(!count($regs))
{
throw new Exception(MOBILE_NOT_REGISTER_PUSH_NOTIFICATION_YET);
}
//根据协议生成请求串
foreach((array)$regs as $reg)
{
$msg = chr(0) . pack('n', 32) . pack('H*', $reg['devicetoken']) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
}
$passphrase = '';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $pemFile);
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
// Open a connection to the APNS server,推送服务api,以下是沙箱环境
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT
[解决办法]
STREAM_CLIENT_PERSISTENT, $ctx);
[解决办法]
可以试下这样
while(true)
{
$j = count($regs);
for($i=0;$i<$j;)
{
$msg = chr(0) . pack('n', 32) . pack('H*', $reg[$i]['devicetoken']) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
if(!$result)
{//发送失败,socket 重连 $fp?=?stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195',?$err,?$errstr,?60,?STREAM_CLIENT_CONNECT
[解决办法]
STREAM_CLIENT_PERSISTENT,?$ctx);
}
else
{
$i++;
}
}
break;
}
while(true)
{
$j = count($regs);
for($i=0;$i<$j;)
{
$msg = chr(0) . pack('n', 32) . pack('H*', $reg[$i]['devicetoken']) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
if(!$result)
{//发送失败,socket 重连
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT
[解决办法]
STREAM_CLIENT_PERSISTENT, $ctx);
}
else
{
$i++;
}
}
break;
}