【问题标题】:APNS not working with Command PromptAPNS 不适用于命令提示符
【发布时间】:2015-11-23 02:09:16
【问题描述】:

我使用一个简单的 php 脚本将推送通知从我的服务器发送到我的 iPhone(见下文)。我已经导入了证书。如果我使用浏览器打开/执行这个 php 文件,我的 iPhone 会收到通知,并且我会收到来自 APNS 的肯定响应

现在,我正在尝试使用以下语句在我的服务器的 命令提示符 中执行相同的 php 文件:

php -f C:/inetpub/wwwroot/pushNotification/new.php

我从 APNS 收到与使用浏览器执行 php 文件时相同的积极响应,但我的 iPhone 从未收到推送通知

有人知道这里出了什么问题吗?

谢谢!

比约恩

php 文件:

    <?php       

            $deviceToken ='xxxxx';
            $passphrase = 'mypass';

            $message = "TEST";

            $ctx = stream_context_create();
            stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck-pub.pem');
            stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

            $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: $err $errstr" . PHP_EOL);

            echo 'Connected to APNS' . PHP_EOL;

            $body['aps'] = array(
                'alert' => $message,
                'sound' => 'default'
                );

            $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)
                echo 'Message not delivered' . PHP_EOL;
            else
                echo 'Message successfully delivered' . PHP_EOL;

            fclose($fp);

?>

命令提示符响应:

Connected to APNS
Message successfully delivered

【问题讨论】:

  • cmd 上,您是否收到其中一条消息(即:已连接到 APNS)??
  • 是的。我编辑了问题,以便您可以看到 cmd 输出。 @Hackerman
  • 尝试在C:/inetpub/wwwroot/pushNotification/文件夹中执行命令并输入php -f new.php(仅用于测试)
  • 哇。它有效@Hackerman。但是有没有可能让它像我的问题中描述的那样工作?
  • 似乎从浏览器(IIS_IUSRS)和命令行(实际用户)运行new.php 之间存在差异......也许是特权或其他东西......你为什么需要以这种方式运行它??...你想创建一个自动化任务??

标签: php push-notification apple-push-notifications windows-server-2008-r2 apns-php


【解决方案1】:

您可以尝试使用以下行创建.cmd 文件(即:test.cmd):

cd C:\inetpub\wwwroot\pushNotification\
php -f news.php

在您的file1.php 中,改用这行代码:

exec('test.cmd');

希望这会有所帮助。

未测试:您也可以通过这种方式传递参数:

exec('test.cmd arg1 arg2');

.cmd 文件中

cd C:\inetpub\wwwroot\pushNotification\
php -f news.php %1 %2

【讨论】:

  • 好吧,这对我来说很好,但现在我遇到了一个新问题。在 file1 中,我将一些参数传递给 new.php: 'php -f C:/inetpub/wwwroot/pushNotification/new.php "'.escapeshellarg($arg1).'" "'.escapeshellarg($arg2).'" "'.escapeshellarg($arg3) 如何将它们传递给 cmd 文件并在其中使用它们?@Hackerman
  • 很高兴帮助@Burn,也很高兴你找到答案
【解决方案2】:

如果您尝试在另一个 php2 文件中执行 php1 文件(使用 exec()),这是基于 Hackerman 的提示的解决方案,您必须更改目录。

您使用以下命令更改 php2 进程的目录:

chdir('php1_directory_path');

之后,您可以执行 php1 文件,就好像 php2 将在 php1 的目录中运行一样,使用:

exec('php -f php1.php')

这个解决方案的优点是你仍然可以将参数传递给 php1:

exec('php -f *php1.php* "'.escapeshellarg(arg1).'" "'.escapeshellarg(arg2))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2013-01-24
    • 2017-12-19
    相关资源
    最近更新 更多