面对ios推送通知php代码中的问题

Sur*_*ten 9 php ios

我在php中使用此代码...

function pushnotificationios( $deviceToken, $message, $badges){
        $passphrase = "12345";
        $ctx = stream_context_create();
        stream_context_set_option($ctx, 'ssl', 'local_cert', $_SERVER['DOCUMENT_ROOT'].'/include/ck.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); 
        $body['aps'] = array(
            //'badge' => $badges,
            'badge' => "+1",
            'alert' => $message['message'],
            'sound' => 'default',
            'content-available' => '1'
        );
        $body['msg'] =$message;
        $payload = json_encode($body);
        $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
        $result = fwrite($fp, $msg, strlen($msg));
 //echo "<pre>"; print_r($result);
        fclose($fp);
        return $result;
    }
Run Code Online (Sandbox Code Playgroud)

.pem文件及其密码是否正确.但是当我点击这个功能时,只有在生产模式下,它才会让我返回false;

$result = pushnotificationios( $deviceToken, $message, $badges);
 echo "<pre>"; print_r($result);
Run Code Online (Sandbox Code Playgroud)

这需要太多时间来回应.

目前我找不到任何解决方案..我的api将去苹果,我的通知无效.有趣的是它是一个聊天应用程序,整个应用程序基于通知.对我来说这是糟糕的一天.

如果有什么事情对我有用,请帮忙.

Bab*_*bar 5

在生产模式下,请勿使用沙箱网址

 $fp = stream_socket_client(
        "ssl://gateway.push.apple.com:2195", $err,
    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 
Run Code Online (Sandbox Code Playgroud)


0ye*_*eoj 2

\n

生产:

\n\n

ssl://gateway.push.apple.com:2195

\n
\n\n

\n\n
\n

发展:

\n\n

ssl://gateway.sandbox.push.apple.com:2195

\n
\n\n

在我的应用程序中。我直接把deviceToken它放进去NSData

\n\n
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken\n{\n    NSString *deviceTokenString = [NSString stringWithFormat:@"%@", deviceToken];\n    // this is producing something like:\n    // <xxxxxxx 9b0f527f xxxxxxxx 2727ed28 xxxxxxxx 4e693a61 xxxxxxx ac2f7dbb>\n    // \n    // and i am directly saving that to my servers database\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的服务器中的内容。

\n\n
/***\n* Function: template_user_info \n* \n* Parameter\n*   \xe2\x80\xa2 $message_input\n*       - String message\n*   \xe2\x80\xa2 $token_array\n*       - Array contains: `token`  ex. "<xxxxxxx 9b0f527f xxxxxxxx 2727ed28 xxxxxxxx 4e693a61 xxxxxxx ac2f7dbb>"\n*       Note:\n*       this removes the \'<\' and \'>\' to make the device token valid\n*       `$device_token = str_replace(">","",str_replace("<","",$device_token));`\n* ---\n*/\n\npublic function __push_notification($message_input, $token_array) \n{\n    $push_config = array(\n\n        "development" => array(\n            "status"    => true,\n            "cert"      => realpath(\'xxx.pem\'),\n            "pass"      => \'xxxxxx\',\n            "server"    => \'ssl://gateway.sandbox.push.apple.com:2195\'\n        ),\n        "production"  => array(\n            "status"    => true,\n            "cert"      => realpath(\'xxx.pem\'),\n            "pass"      => \'xxxxxx\',\n            "server"    => \'ssl://gateway.push.apple.com:2195\'\n        )\n    );\n\n    $message = stripslashes($message_input);\n\n    foreach ($push_config as $key => $value) \n    {\n        if ($value[\'status\'] === true)\n            $this->__exe_push_notification($message, $value, $token_array);\n    }\n}\n\nprivate function __exe_push_notification($message, $config, $token_array)\n{\n    $cert   = $config[\'cert\'];\n    $pass   = $config[\'pass\'];\n    $server = $config[\'server\'];\n\n    $payload = \'{\n        "aps" :\n            {\n                "alert" : "\'.$message.\'",\n                "badge" : 1, \n                "sound" : "bingbong.aiff"\n            }\n    }\';\n\n    $ctx = stream_context_create();\n    stream_context_set_option($ctx, \'ssl\', \'local_cert\', $cert);\n    stream_context_set_option($ctx, \'ssl\', \'passphrase\', $pass);\n\n    $fp = stream_socket_client($server, $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);\n\n    if (!$fp) \n    {\n        // echo "Failed to connect $err $errstr <br>";\n\n        return;\n    }\n    else \n        // echo "Post notification sent<br>";\n\n    $dev_array = array();\n\n    $dev_array = $token_array;\n\n    foreach ($dev_array as $device_token) \n    {\n        $device_token = str_replace(">","",str_replace("<","",$device_token));\n\n        $msg =  chr(0) .\n                pack("n", 32) . \n                pack(\'H*\', str_replace(\' \', \'\', $device_token)) . \n                pack("n", strlen($payload)) . \n                $payload;\n\n        // echo "sending message :" . $payload . "n";\n\n        fwrite($fp, $msg);\n    }\n    fclose($fp);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您仍然无法发送通知,请检查此故障排除推送通知

\n\n

编辑

\n\n

不久前我一直在查看您的推送通知推送,然后我注意到您的\'badge\' => "+1"\n您不能像那样增加徽章。

\n\n

唯一的选择是在您的应用程序中管理它并使用数据库来保持正轨。

\n\n

也许它是导致问题的原因..并且必须badge是一个数字,如下:表 3-1

\n\n

并且检查此讨论也可能对您有帮助。

\n\n

编辑 02/12/19 \n我已经更新了推送通知的 php 代码以支持开发和生产。

\n