我使用本教程设置了一个 PHP 脚本来发送推送通知。我运行脚本没有任何错误,但我的设备上没有显示任何内容。我究竟做错了什么?
问问题
2201 次
2 回答
7
为推送通知创建一个通用函数根据您的应用要求在函数 devicetoken、消息和额外参数中传递以下参数。如果您使用的是开发人员 pem 文件,则必须使用“gateway.sandbox.push.apple.com:2195”,如果您使用的是分发器 panm 文件,则必须使用“gateway.push.apple.com:2195”
public function pushtoios($devicetoken, $message, $params = array()) {
$passphrase = 'apple';
$ctx = stream_context_create();
/*Development pam file*/
//stream_context_set_option($ctx, 'ssl', 'local_cert', your path.'apns-dev.pem');
/*Distributer pam file*/
stream_context_set_option($ctx, 'ssl', 'local_cert', your path.'apns-distr.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
/*For Development pam file*/
//$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx);
/*For Distributer pam file*/
$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp)
exit("Failed to connect amarnew: $err $errstr" . PHP_EOL);
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);
$body['type'] = $params['type'];
$body['params'] = $params;
$payload = json_encode($body);
$msg = chr(0) . pack('n', 32) . pack('H*', $devicetoken) . pack('n', strlen($payload)) . $payload;
$result = fwrite($fp, $msg, strlen($msg));
if (!$result) {
return false;
} else {
return true;
}
fclose($fp);
}
于 2015-10-10T05:50:49.683 回答
0
我有同样的问题,但现在通过编辑我忽略的这一行来解决......
$output = json_encode($payload);
至
$payload = json_encode($payload);
第一个会给出 strlen 错误,但在我的服务器上不会产生错误。在真实服务器上尝试失败后,在本地主机上运行时出现 strlen 错误。
我还为 local_cert 添加了一个 ssl 密码,因为我的 pem 文件有密码。
以下是有效的最终代码...请用您自己的信息替换 your_token_hex_string 和 your_passphrase。
$device = 'your_token_hex_string';
$payload['aps'] = array('alert' => 'This is the alert text', 'badge' => 1, 'sound' => 'default');
$payload = json_encode($payload);
$options = array('ssl' => array(
'local_cert' => 'apns_dev.pem',
'passphrase' => 'your_passphrase'
));
$streamContext = stream_context_create();
stream_context_set_option($streamContext, $options);
$apns = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext);
$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $device)) . chr(0) . chr(strlen($payload)) . $payload;
fwrite($apns, $apnsMessage);
fclose($apns);
于 2011-01-28T18:09:58.480 回答