php - 使用Php的iOS MDM推送通知不起作用

标签 php ios mdm talend-mdm

我知道它是重复的of this,但是这个不适用于我。

我要发送通知的PHP代码是

// Put your device token here (without spaces):
$deviceToken = '6hPQc2HvdA20XGlQkznJxlappCrzm3kJccljjOsgF2k=\n'; #base64 encoded
// Put your private key's passphrase here:
$passphrase = 'Temp1234';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', './Certificates_push_dev_new.pem');
stream_context_set_option($ctx, 'ssl', 'cafile', './entrust_2048_ca.cer');

stream_context_set_option($ctx, 'ssl', 'verify_peer', true);
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
// Open a connection to the APNS server
$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;
// Create the payload body

$payload = json_encode(array(
                             'mdm' => '3742A63A-5BB3-4D61-9D4B-E7968DADAF84',
                             'topic' => 'com.apple.mgmt.External.e5814e69-1c24-437f-bae9-562049fd3cd5'
                             ));

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

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

#$msg = chr(0).chr(0).chr(32).bin2hex(base64_decode($deviceToken)).chr(0).chr(strlen($payload)).$payload;
$msg = chr(0).chr(0).chr(32).bin2hex(base64_decode($deviceToken)).chr(0).chr(strlen($payload)).$payload;

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

if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;
// Close the connection to the server
fclose($fp);

带有base64编码的设备 token
$deviceToken = '6hPQc2HvdA20XGlQkznJxlappCrzm3kJccljjOsgF2k=\n'; #base64 encoded

我也尝试了不带base64编码的设备 token ,在这种情况下,我的 token 是
$deviceToken = '\xEA\u0013\xD0sa\xEFt\r\xB4\\iP\x939\xC9\xC6V\xA9\xA4*\xF3\x9By\tq\xC9c\x8C\xEB \u0017i';

要检查证书验证,以下命令可以正常工作。
openssl s_client -connect gateway.push.apple.com:2195 -cert apns-dev.pem -key key.pem -CAfile entrust_2048_ca.cer

在执行上述php代码时,我没有收到任何错误。 但是设备永远不会联系我们的MDM服务器以获取配置更改。

当我的TestMDM installed profile, have "SIGNING CERTIFICATE" SECTION
My MDM installed profile missing "SIGNING CERTIFICATE" SECTION

可能是“签名证书”部分出现问题,设备未收到通知吗?,一个屏幕截图是TestMDM供应商,第二个屏幕截图是我的,即MobiLock

最佳答案

我曾经在Windows上使用PHP亲自推送通知。我注意到的其中一件可能是错误的事情是您将主题包含在推送有效负载中。这不是必需的。

这是我编写的一些PHP代码,使用在TestMDM中注册的设备进行测试。我不是PHP开发人员,但是使用此(http://codular.com/sending-ios-push-notifications-with-php)作为基准,并从TestMDM数据库中获取pushMagic和deviceToken字符串,就可以成功发送推送。

在Windows上,我也使用PFX证书进行推送。

$deviceToken = '<YOUR DEVICE TOKEN AS BASE64 STRING>'; #base64 encoded
$token = bin2hex(base64_decode($deviceToken));

// Put your private key's passphrase here:
$passphrase = '<YOUR PASSWORD>';

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', './Push.pfx');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

$fp = stream_socket_client('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 . "<br />";

$payload = '{ \'mdm\' = \'<YOUR PUSH MAGIC FOR THIS DEVICE>\' }';

$inner = chr(1) . pack('n', 32) . pack('H*', $token)
        . chr(2) . pack('n', strlen($payload)). $payload
        . chr(3) . pack('n', 4) . pack('N', 1)
        . chr(4) . pack('n', 4)
        . pack('N', time() + 86400)
        . chr(5) . pack('n', 1) . chr(10);

$notification = chr(2) . pack('N', strlen($inner)) . $inner;

echo $payload . PHP_EOL;

$result = fwrite($fp, $notification, strlen($notification));

echo $result;

运行脚本后,可以在设备的日志中看到此脚本,表明它正在运行:
Jul 11 10:16:10 Toms-iPod mdmd[11218] <Notice>: (Note ) MDM: mdmd starting...
Jul 11 10:16:10 Toms-iPod mdmd[11218] <Notice>: (Note ) MDM: Network reachability has changed.
Jul 11 10:16:10 Toms-iPod mdmd[11218] <Notice>: (Note ) MDM: Network reachability has changed.
Jul 11 10:16:10 Toms-iPod mdmd[11218] <Notice>: (Note ) MDM: Push token received.
Jul 11 10:16:10 Toms-iPod mdmd[11218] <Notice>: (Note ) MDM: Received push notification.
Jul 11 10:16:10 Toms-iPod mdmd[11218] <Notice>: (Note ) MDM: Polling MDM server https://testmdm.azurewebsites.net/<redacted> for next command.

希望这会有所帮助。

Ť

关于php - 使用Php的iOS MDM推送通知不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44886700/

相关文章:

android - Airwatch 安卓实现

php - 不同大小的排列

iOS,iOS9+ 提供原生模糊 View 效果?

ios - 通知有效但没有声音

ios - 从 URL 获取数据时显示加载指示器的正确方法是什么

ios - 在 iOS 设备上安装 MDM 配置文件时出错

Azure AD 未重定向到 MDM 使用条款 URL

php - 加载数据到文件时 id 自动递增

Php 5.6 (fpm) - 带有 mysql 命令的旧文件可以工作 - 当它被弃用时如何?

php - 为什么 Memcache::get() 的反射与文档不同?