首先,对不起,如果这是一个偏离主题的问题。我觉得这是一个合法回应的最佳去处,因为你们和男孩从未让我失望。
所以,我聘请了一位iOS APP开发人员来帮助我完成一个项目。我从来没有进入iOS应用程序编程,所以我只是在做他告诉我的事情。我的项目是一个PHP应用程序,它向iOS用户发送通知,这些用户作为注册用户(拥有APNS令牌)存储在数据库中。但是,当通过Apple推送通知服务发送通知时,我们遇到了大量的障碍。
开发人员告诉我下面的代码是发送通知的唯一方法:
$token = 'created From APNS - stored on a DB';
$message = "hello world";
$unread_msg_count = 'x';
$passphrase = 'xxxxxxx'; // 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 stored in same directory
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.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp) {
$fds = "Failed to connect: $err $errstr" . PHP_EOL;
return false;
} else {
// Create the payload body
$body['aps'] = array('alert' => $message, 'sound' => 'default', 'badge' => 1);
$body['server'] = array("unread_msg_count" => $unread_msg_count);
// 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);
return $result;
}
ck.pem
文件与上述脚本位于同一目录中,开发人员确保它是正确的文件。
这里的问题是我使用godaddy来托管我的网站,使用他们的共享托管平台。使用共享主机时,godaddy不允许使用除端口80和端口443之外的任何端口。由于上面的APNS方法需要使用端口2195,我最终必须设置本地XAMPP服务器来尝试发送通知。这一切看起来都很笨重,通知也没有用。
我正在研究APNS是如何工作的,而且我可以告诉我开发人员提供给我的方法被认为是遗留代码According to Apples Documentation。似乎首选方法现在使用HTTP2,它需要端口443而不是端口2195.如果这是真的,我应该能够直接从godaddys服务器推送通知,而不需要我自己的本地服务器。
我提出了向我的开发人员使用HPPT2的可能性,他告诉我他提供给我的方法是唯一可行的方法。我对专业人士的问题是,我的开发人员是正确的还是我应该使用HTTP2?如果我的开发人员是正确的,那么他提供给我的方法是否可以正确编码以便在TestFlight环境中使用?