如何使用p8身份验证密钥文件通过PHP连接到apn
在苹果将APNs认证密钥更改为p8后,当前的库(如)仍然使用旧的pem和cert文件进行连接如何使用p8身份验证密钥文件通过PHP连接到apn,php,ios,apple-push-notifications,apn,apns-php,Php,Ios,Apple Push Notifications,Apn,Apns Php,在苹果将APNs认证密钥更改为p8后,当前的库(如)仍然使用旧的pem和cert文件进行连接 $push = new ApnsPHP_Push( ApnsPHP_Abstract::ENVIRONMENT_SANDBOX, 'server_certificates_bundle_sandbox.pem' ); // Set the Provider Certificate passphrase // $push->setProviderCertificatePassphra
$push = new ApnsPHP_Push(
ApnsPHP_Abstract::ENVIRONMENT_SANDBOX,
'server_certificates_bundle_sandbox.pem'
);
// Set the Provider Certificate passphrase
// $push->setProviderCertificatePassphrase('test');
// Set the Root Certificate Autority to verify the Apple remote peer
$push->setRootCertificationAuthority('entrust_root_certification_authority.pem');
// Connect to the Apple Push Notification Service
$push->connect()
对于Node.js示例(),我可以这样发送:
var apnProvider = new apn.Provider({
token: {
key: 'APNsAuthKey_Q34DLF6Z6J.p8', // Path to the key p8 file
keyId: 'Q34DLF6Z6J', // The Key ID of the p8 file (available at https://developer.apple.com/account/ios/certificate/key)
teamId: 'RLAHF6FL89', // The Team ID of your Apple Developer Account (available at https://developer.apple.com/account/#/membership/)
},
production: false // Set to true if sending a notification to a production iOS app
});
我怎样才能像在node.js中那样使用PHP向iOS发送远程通知?很抱歉这么晚才开始游戏。如果我正确理解你的问题,我相信这就是你想要的。这就是我使用PHP向Apple APN发送消息的方法。您可能需要对有效负载进行一些研究,因为根据您编写应用程序的方式,有几种方法可以构建有效负载。此外,请记住,您必须能够使用端口2195使其工作。如果您运行的是专用服务器或内部服务器,您应该不会有问题。如果它是共享服务器,它将无法工作
$passphrase = 'xxxxx'; // This is the passphrase used for file ck.pem
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); // ck.pem file must be included to sent token to ios devices
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
stream_context_set_option($ctx, 'ssl', 'verify_peer', true);
stream_context_set_option($ctx, 'ssl', 'allow_self_signed', true);
$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx);
stream_set_blocking ($fp, 0); // Ensure that blocking is disabled
if (!$fp) {
$fds = "Failed to connect: $err $errstr" . PHP_EOL;
return false;
} else {
// Create the payload body
// this example uses a custom data payload. depending on your app you may need to change this
$body['aps'] = array('alert' => $message, 'sound' => 'default', 'badge' => 1);
// Encode the payload as JSON
$payload = json_encode($body);
// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', str_replace(' ', '',$token)) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
// Close the connection to the server
fclose($fp);
}
也许为时已晚,但我一直在挣扎,因为几乎所有的指导都是老一套的 所以我决定用我的答案来回答这个“老”问题
private static function sendNotificationAPN($device_token, $title, $body, $category, $sound, $optionals) {
$alert = array(
'aps' => array(
'alert' => array(
'title' => $title,
'body' => $body
),
'badge' => 0,
'sound' => $sound,
'category' => $category,
'content-available' => true
)
);
foreach ($optionals as $key => $option) {
$alert[$key] = $option;
}
$alert = json_encode($alert);
$url = 'https://api.development.push.apple.com/3/device/' . $device_token['apn'];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $alert);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("apns-topic: '/* your app name */'"));
curl_setopt($ch, CURLOPT_SSLCERT, /* absolute path to cert file */);
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, /* passphrase for cert */);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
$response = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$ret = array(
'body' => $response,
'httpcode' => $httpcode
);
return $ret;
}
你有解决办法吗?:)@Maximus1809还没有:)我正在寻找一种方法来实现这一点,看起来我将不得不制定一个解决方案现在开始研究()这个库支持您所需要的,请使用新的JWT身份验证。