浏览器上的推送通知工作不在命令行上

Posted

技术标签:

【中文标题】浏览器上的推送通知工作不在命令行上【英文标题】:Push notification work on browser doesn't on commandline 【发布时间】:2018-10-08 11:09:14 【问题描述】:

我有运行 apns 的 php 文件。当我在浏览器上调用网页时它确实有效。但是它不适用于终端调用

php deneme.php

我确认 .pem 文件已正确创建。并且还确定它在 php 文件中的位置也是正确的(因为在浏览器上正常工作)。我用完了选项。希望大家给个思路。

deneme.php 文件是:

<?php
    $apnsServer = 'ssl://gateway.sandbox.push.apple.com:2195';

    $privateKeyPassword = 'MyPassword123';
    $message = 'Test Push Notifications';

    $deviceToken =
    '2877b691ffd9a3edfa45ee31ff25083f1845e016e7902d130eb09713b1c2ed2f';

    $pushCertAndKeyPemFile =  $_SERVER['DOCUMENT_ROOT'].'/ck.pem';// 'ck.pem';
    $stream = stream_context_create();
    stream_context_set_option($stream,
        'ssl',
        'passphrase',
        $privateKeyPassword);
        stream_context_set_option($stream,
        'ssl',
        'local_cert',
        $pushCertAndKeyPemFile);

    $connectionTimeout = 20;
    $connectionType = STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT;
    $connection = stream_socket_client($apnsServer,
    $errorNumber,
    $errorString,
    $connectionTimeout,
    $connectionType,
    $stream);
    if (!$connection)
        echo "Failed to connect to the APNS server. Error no = $errorNumber<br/>";
        exit;
     else 
        echo "Successfully connected to the APNS. Processing...</br>";
    
    $messageBody['aps'] = array('alert' => $message,
        'sound' => 'default',
        'badge' => 2,
        );
    $payload = json_encode($messageBody);
    $notification = chr(0) .
    pack('n', 32) .
    pack('H*', $deviceToken) .
    pack('n', strlen($payload)) .
    $payload;
    $wroteSuccessfully = fwrite($connection, $notification, strlen($notification));
    if (!$wroteSuccessfully)
        echo "Could not send the message<br/>";
    
    else 
        echo "Successfully sent the message<br/>";
    
    fclose($connection);
?>

【问题讨论】:

从 CLI 运行时是否有 $_SERVER['DOCUMENT_ROOT']?不这么认为。 你是天才!.... 在 ssh $_server 变量上始终为空。因此,当我输入 /var/www/html/xxx.pem 并且它有效!你拯救了我的一天 没问题,很高兴它有效。 【参考方案1】:

从 CLI 运行时没有可用的 $_SERVER[] 超全局变量,因为没有服务器在运行。将$_SERVER['DOCUMENT_ROOT'].'/ck.pem'; 替换为您的ck.pem 文件的绝对路径。

【讨论】:

以上是关于浏览器上的推送通知工作不在命令行上的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序不在后台运行时如何处理推送通知

为啥 GCM 不在 android 设备中提供推送通知?

推送通知是不是会导致服务器上的连续轮询?

当网站关闭时,推送通知如何在每个浏览器上工作?

单击推送通知时打开应用程序

ios推送通知终止应用程序