带有 p8 文件的 Apple 推送通知在我的 Mac 上工作,但在 Linux 服务器上不起作用

Posted

技术标签:

【中文标题】带有 p8 文件的 Apple 推送通知在我的 Mac 上工作,但在 Linux 服务器上不起作用【英文标题】:Apple Push Notifications with p8 file working on my Mac, but doesn't work on Linux server 【发布时间】:2020-05-20 22:32:33 【问题描述】:

我正在尝试将我的应用程序的 APNS 从 p12 切换到新的 p8 格式。它在我的 Mac 上运行良好,并且可以毫无问题地发送通知。但是,当我在我的 Amazon Linux 服务器上设置相同的配置时,我什么也得不到。我很难弄清楚有什么不同。这是我正在使用的功能。在我的本地主机上运行时它工作正常,但在远程服务器上却不行。另请注意,来自curl_exec($http2ch)$result 对于远程服务器返回为假。

public function sendNotification($token, $message, $badge, $env)
    $keyfile = 'AuthKey_mykey.p8';                
    $keyid = 'my key id';                        
    $teamid = 'my team id';                       
    $bundleid = 'org.tciweb.y2go';                

    if ($env == 'dev') 
        $url = 'https://api.development.push.apple.com';
     else 
        $url = 'https://api.push.apple.com';
    

    $payload = '"aps":"alert":"'.$message.'","sound":"default"';

    $key = openssl_pkey_get_private('file://'.$keyfile);

    $header = ['alg'=>'ES256','kid'=>$keyid];
    $claims = ['iss'=>$teamid,'iat'=>time()];

    $header_encoded = $this->base64($header);
    $claims_encoded = $this->base64($claims);

    $signature = '';
    openssl_sign($header_encoded . '.' . $claims_encoded, $signature, $key, 'sha256');
    $jwt = $header_encoded . '.' . $claims_encoded . '.' . base64_encode($signature);

    // only needed for php prior to 5.5.24
    if (!defined('CURL_HTTP_VERSION_2_0')) 
        define('CURL_HTTP_VERSION_2_0', 3);
    

    $http2ch = curl_init();
    curl_setopt_array($http2ch, array(
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
        CURLOPT_URL => "$url/3/device/$token",
        CURLOPT_PORT => 443,
        CURLOPT_HTTPHEADER => array(
            "apns-topic: $bundleid",
            "authorization: bearer $jwt"
        ),
        CURLOPT_POST => TRUE,
        CURLOPT_POSTFIELDS => $payload,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HEADER => 1
    ));

    $result = curl_exec($http2ch);
    if ($result === FALSE) 
        // error handling
    

    $status = curl_getinfo($http2ch, CURLINFO_HTTP_CODE);
    echo $status;
    return 0;

我检查了 curl 版本...本地计算机上的 7.64.1 和服务器上的 7.61.1。我还运行了“Push Notifications Tester”来验证密钥和设备令牌是否有效。

我已经做了很多搜索,但我真的很困惑。这可能与HTTP2有关吗?有没有使用 CURL 的替代方法?任何建议表示赞赏。

【问题讨论】:

CURL 返回什么? @hobbsome,只是零。 是 "$this->base64" = "base64_encode"?我不断收到错误“InvalidProviderToken” 【参考方案1】:

将 PHP 升级到 7.3 版解决了这个问题。我最初使用的是 7.0 版。

【讨论】:

以上是关于带有 p8 文件的 Apple 推送通知在我的 Mac 上工作,但在 Linux 服务器上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

iOS 推送通知 keyId

用于开发/沙盒的 APNs 密钥(.p8 文件)

iPhone推送通知声音,“语音通知”

服务器端 Apple 推送通知

Apple 推送通知开发与分发配置文件

Windows服务器上的Apple推送通知证书