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

Posted

技术标签:

【中文标题】ios推送通知php代码中面临的问题【英文标题】:Facing problems in ios push notification php code 【发布时间】:2015-05-27 07:13:58 【问题描述】:

我在 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;
    

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

$result = pushnotificationios( $deviceToken, $message, $badges);
 echo "<pre>"; print_r($result);

而且响应时间太长。

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

如果发生对我有好处的应用程序,请提供帮助。

【问题讨论】:

注意到找到任何解决方案.. :-( 嗨 Suresh,1) 问题可能出在 pem 文件创建中,请检查您是否为 PROD 应用程序使用了正确的证书。 2)有时推送通知到达后可能不会从Apple服务器发送,通知的生命时间仅为30分钟。如果未在该时间内发送通知,则不会再次发送消息。 添加此代码并检查与APNS服务器的连接是否正常。 if (!$fp) exit("Failed to connect: $err $errstr" . PHP_EOL); 您使用的是哪个托管服务器??首先检查 POST 2195 是否打开,如果没有,然后要求主机提供打开端口 尝试从服务器发送一个强制通知。有时消息或数据包卡在服务器上。 【参考方案1】:

在生产模式下不要使用沙盒网址

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

【讨论】:

当我实现这一点并进行生产时,通知正在工作,但在苹果批准后它突然不起作用,我不知道怎么做? 然后检查是否从ios端的开发或分发证书中提取pem文件 没有 ios 团队说“分发证书不是从开发中提取的”,它们是不同的。【参考方案2】:

制作:

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

.

发展:

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

在我的应用程序中。我直接得到deviceToken NSData

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

    NSString *deviceTokenString = [NSString stringWithFormat:@"%@", deviceToken];
    // this is producing something like:
    // <xxxxxxx 9b0f527f xxxxxxxx 2727ed28 xxxxxxxx 4e693a61 xxxxxxx ac2f7dbb>
    // 
    // and i am directly saving that to my servers database

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

/***
* Function: template_user_info 
* 
* Parameter
*   • $message_input
*       - String message
*   • $token_array
*       - Array contains: `token`  ex. "<xxxxxxx 9b0f527f xxxxxxxx 2727ed28 xxxxxxxx 4e693a61 xxxxxxx ac2f7dbb>"
*       Note:
*       this removes the '<' and '>' to make the device token valid
*       `$device_token = str_replace(">","",str_replace("<","",$device_token));`
* ---
*/

public function __push_notification($message_input, $token_array) 

    $push_config = array(

        "development" => array(
            "status"    => true,
            "cert"      => realpath('xxx.pem'),
            "pass"      => 'xxxxxx',
            "server"    => 'ssl://gateway.sandbox.push.apple.com:2195'
        ),
        "production"  => array(
            "status"    => true,
            "cert"      => realpath('xxx.pem'),
            "pass"      => 'xxxxxx',
            "server"    => 'ssl://gateway.push.apple.com:2195'
        )
    );

    $message = stripslashes($message_input);

    foreach ($push_config as $key => $value) 
    
        if ($value['status'] === true)
            $this->__exe_push_notification($message, $value, $token_array);
    


private function __exe_push_notification($message, $config, $token_array)

    $cert   = $config['cert'];
    $pass   = $config['pass'];
    $server = $config['server'];

    $payload = '
        "aps" :
            
                "alert" : "'.$message.'",
                "badge" : 1, 
                "sound" : "bingbong.aiff"
            
    ';

    $ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', $cert);
    stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);

    $fp = stream_socket_client($server, $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

    if (!$fp) 
    
        // echo "Failed to connect $err $errstr <br>";

        return;
    
    else 
        // echo "Post notification sent<br>";

    $dev_array = array();

    $dev_array = $token_array;

    foreach ($dev_array as $device_token) 
    
        $device_token = str_replace(">","",str_replace("<","",$device_token));

        $msg =  chr(0) .
                pack("n", 32) . 
                pack('H*', str_replace(' ', '', $device_token)) . 
                pack("n", strlen($payload)) . 
                $payload;

        // echo "sending message :" . $payload . "n";

        fwrite($fp, $msg);
    
    fclose($fp);

如果您仍然无法发送通知,请查看Troubleshooting Push Notifications

编辑

我一直在看你的推送通知推送,前一阵子,然后我注意到你的'badge' =&gt; "+1" 你不能像那样增加徽章。

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

可能是问题的根源。badge 必须是一个数字,这里:Table 3-1

也检查一下这个discussion 可能对你也有帮助..

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

【讨论】:

这项工作在开发模式下而不是在生产模式下.. ssl://gateway.sandbox.push.apple.com:2195 我付钱给你它的工作但已经在开发模式下使用它但不是在生产模式下工作。 你试过使用上面的代码吗?不用担心付钱,我只是在开玩笑.. 哈哈哈.. 如果这不起作用,那很奇怪,因为我们目前正在使用它.. 哈哈哈 是----------------------------- ---------------- hmm 最后的评论,也许是firewall blocking access to the ports.. 检查这个苹果 [Troubleshooting Push Notifications] (developer.apple.com/library/ios/technotes/tn2265/_index.html).. 抱歉没有帮助,你.. :( 这个网站被全世界的专业人士使用;您可能需要清理您的答案以适合目标受众。【参考方案3】:

是的..最后我得到了解决方案。

问题出在端口上。我使用 Bluehost 服务器。 Bluehost 阻止推送通知使用的端口。现在我改变了我的服务器和通知为我工作.. 谢谢大家

【讨论】:

所以,它真的是港口......很高兴你做到了,恭喜...... :) 为此,我在两个或三个不同的服务器上检查相同的功能。 IOS PushNotification 在共享服务器上不起作用。 我也面临同样的问题...您能否提供详细信息如何允许 BLUEHOST 服务器上的某些端口...??? 嗨,我们使用 ssl://gateway.sandbox.push.apple.com:2195 url 进行 ios 推送通知,一些共享服务器阻止端口 2195,因此对于苹果推送通知,我们从不使用共享服务器。 你使用了哪个端口?

以上是关于ios推送通知php代码中面临的问题的主要内容,如果未能解决你的问题,请参考以下文章

2195端口是强制要求开放的吗? IOS 推送通知在 php 中不起作用,而 Ios 推送通知在 laravel 中没有进入移动设备

多个设备的 ios 推送通知

iOS推送通知无法使用PHP

PHP:向 ios 发送推送通知

php iOS推送通知不起作用

iOS推送通知在生产中不起作用