带有 PHP 的 iOS 13 APNS

Posted

技术标签:

【中文标题】带有 PHP 的 iOS 13 APNS【英文标题】:iOS 13 APNS with PHP 【发布时间】:2019-09-21 21:09:38 【问题描述】:

ios 13 现在要求您为警报或背景添加 apns-push-type 的标头。如何将此添加到我用于发送通知的当前代码中?

多年来我一直使用此解决方案发送推送通知,但我不知道如何添加他们需要的标头。

function sendPushNotification($uid,$title,$message,$action,$type,$id)

$deviceToken = "*************";
$passphrase = '***********';

$ctx = stream_context_create();

stream_context_set_option($ctx, 'ssl', 'local_cert', 'pem/Certificates.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);

// Open a connection to the APNS server

if (!$fp)
    exit("Failed to connect: $err $errstr" . php_EOL);

//echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body['aps'] = array(
    'alert' => array(
        'title' => $title,
        'body' => $message,
        'action-loc-key' => 'Bango App',
    ),
    'mutable-content'=> 1,
    'badge' => 1,
    'content-available'=>1,
    'sound' => 'oven.caf',
    'action' => $action,
    'type' => $type,
    'id' => $id,

    );



// Encode the payload as JSON
$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));


fclose($fp);

// Close the connection to the server



?>```

【问题讨论】:

我也遇到了同样的问题,你找到解决办法了吗?如果你发现了什么,请分享。 【参考方案1】:

您可以在 $msg 中传递标题,在我的代码中:

$msg = pack("C", 1) . pack("N",$row['id_device_token']) . pack("N", $apple_expiry) . pack("n", 32) . pack('H*', str_replace(' ', '', $row['device_token'])) . pack("n", strlen($payload1)) . $payload1;

其中 $row['id_device_token'] 是“apns-id”,$apple_expiry 是“apns-expiration”。 根据苹果 (Apple Docs) “apns-push-type”标头必须放在“apns-id”之前,所以:

$msg = pack("C", 1) . pack("N","alert") . pack("N",$row['id_device_token']) . pack("N", $apple_expiry) . pack("n", 32) . pack('H*', str_replace(' ', '', $row['device_token'])) . pack("n", strlen($payload1)) . $payload1;

【讨论】:

我已经尝试过这种方法,但它对我不起作用。没有错误没有通知。甚至 Apple 文档也会询问 3 个必填字段。在你的回答中,我发现只有“apns-push-type”。 您是否也修改了客户端通知代码?现在 Apple 返回设备令牌的方式在 iOS 13 中有所不同。请阅读:onesignal.com/blog/… 是的,我已经修改了。我也问过问题。看到这个。 ***.com/questions/58543104/…

以上是关于带有 PHP 的 iOS 13 APNS的主要内容,如果未能解决你的问题,请参考以下文章

Swift iOS 13 推送通知设备令牌在 javascript/php/typescript 中转换

如何在 iOS 13 中删除带有外观的导航栏背景?

应用程序卡在带有 Xcode 11 测试版的 iOS 13 测试版模拟器上,但在带有 Xcode 10 的 iOS 13 测试版模拟器上运行良好

iOS 13:带有 LeftView 间距问题的 UITextField - Xcode 11

带有 iPhone 13 的 iOS 15 不支持附近的交互框架

如何在 iOS 13 中隐藏带有动画的标签栏?