2017-07-03 347 views
1

我知道它是重複的of this,但這一個不適合我。使用PHP的iOS MDM推送通知,不工作

我的PHP代碼發送通知是編碼

$deviceToken = '6hPQc2HvdA20XGlQkznJxlappCrzm3kJccljjOsgF2k=\n'; #base64 encoded 

的base64

// 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); 

設備令牌我已經試過設備令牌沒有在這種情況下,我的令牌是

$deviceToken = '\xEA\u0013\xD0sa\xEFt\r\xB4\\iP\x939\xC9\xC6V\xA9\xA4*\xF3\x9By\tq\xC9c\x8C\xEB \u0017i'; 
編碼以及BASE64

要檢查證書驗證,下面的命令工作正常。

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供應商和第二個是我的IE MobiLock的

+1

對不起。我幾乎不記得推送通知如何工作。我最後一次實施它的時間差不多是3年前。托馬斯是對的。從有效的代碼開始。你想檢查你是否有正確的話題。簽名證書和PKCS12在此過程中不起任何作用。所以你可以忽略它。 –

+0

謝謝@VictorRonin –

回答

2

我在Windows上使用PHP時,我已經自己推送通知了。我注意到的其中一件事可能是錯誤的,那就是在推送有效載荷中包含了這個主題。這不是必需的。

下面是我編寫的一些PHP代碼,用於在TestMDM中註冊的設備進行測試。我不是一個PHP開發人員,但是使用這個(http://codular.com/sending-ios-push-notifications-with-php)作爲基準,並從我的TestMDM數據庫中取得pushMagic和deviceToken字符串,我成功地發送了一個推送。

由於我在Windows上,我還使用PFX證書進行推送。

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. 

希望這將有助於:

$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; 

當我運行該腳本,我可以在我的設備,這表明它正在工作的日誌中看到這一點。

T

+0

替換了有效載荷佔位符,例如$ payload ='{\'mdm \'= \'B07F7F6A-48C0-4CC6-AAAD-14B1BCF29E2E \'}'; –

+0

所以這種格式正確的設備令牌和推魔術字符串? ,注意 - MDM安裝在設備上,有兩個證書1)移動設備管理證書,2)我們的服務器的SSL證書,即使用Let's Encrypt Authority生成的 –

+0

我可以用你提供的代碼看不到任何日誌,你對我的希望很大,希望最後也是:),所以請按照這個線程。 –