2011-04-25 380 views
20

我試圖編寫類似於http://whatismyudid.com/的函數,然後通過驗證,它將返回用戶UDID並將其存儲到數據庫中以供將來與該用戶參考。從.mobileconfig獲取設備UDID

我已經編寫了一個.mobileconfig xml文檔,可以在Profile Installer中打開,但是當我告訴它安裝配置文件時,它將以[alert] Invalid Profile響應,但沒有提示主體。沒有說明,沒有代碼,沒有幫助。

我是新來的移動配置遊戲,所以任何幫助都會讓我興奮不已。

這裏是我的配置文件:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>PayloadContent</key> 
    <dict> 
     <key>URL</key> 
     <string>http://apps.mortlabs.com/device/retrieve.php</string> 
     <key>DeviceAttributes</key> 
     <array> 
      <string>UDID</string> 
      <string>IMEI</string> 
      <string>ICCID</string> 
      <string>VERSION</string> 
      <string>PRODUCT</string> 
     </array> 
    </dict> 
    <key>PayloadOrganization</key> 
    <string>MortLabs.com</string> 
    <key>PayloadDisplayName</key> 
    <string>Profile Service</string> 
    <key>PayloadVersion</key> 
    <integer>1</integer> 
    <key>PayloadUUID</key> 
    <string>B958E359-34C2-42F4-BD0C-C985E6D5376B</string> 
    <key>PayloadIdentifier</key> 
    <string>com.mortlabs.profile-service</string> 
    <key>PayloadDescription</key> 
    <string>This temporary profile will be used to find and display your current device's UDID.</string> 
    <key>PayloadType</key> 
    <string>Profile Service</string> 
</dict> 
</plist> 

剖面由導航到http://apps.mortlabs.com/device/enroll.php與移動Safari

回答

13

我發現通過使用上述Apache正在與Ipad/Iphone進行對話 - 由Kyle2011發佈的帖子在https://discussions.apple.com/thread/3089948?start=0&tstart=0填充瞭解決方案的其餘部分。

header("Location: https://www.example.com/enrolment?params={$params}"); 

凡招生是一個目錄 - - 這然後調用:

在您需要使用類似於下面一行到瀏覽器的目錄重定向retrieve.php頁面底部

基本上DirectoryIndex(通常是index.php),然後可以將東西顯示給用戶。

要填充你需要在你的retrieve.php腳本的頂部以下行到$ params變量

$data = file_get_contents('php://input'); 

然後,您可以解析$數據串來獲得你所需要的(嘗試file_put_contents("data.txt", $data);或Kyle2011的榜樣)

我還通過在Mac終端上使用udidgen而不是僅僅使用whatismyudid.com,將Payload UDID更改爲不同的東西。

更新:在iOS 7.1中,某些文件(.plist IIRC)需要通過https://提供服務 - 如果所有內容都通過http://提供,它們將無法安裝 - 可能最適合包括.ipa通過https://確保Apple未來的更改不會導致問題。

+0

Kev!太棒了,我會盡快嘗試,讓你知道它是如何工作的。如果它解決了問題,那麼我給你道具。 – joseym 2011-06-25 17:06:30

+0

可以通過asp.net獲取嗎? – 2013-02-08 06:20:52

+0

我怎樣才能從.mobileconfig文件的asp.net c#中獲得udid? – 2013-02-08 06:32:22

1

嘗試設置的URL地址,而不PHP擴展初始化。這解決了我的問題。 現在我唯一的問題是,我無法找到如何檢索從iOS設備發送到我的服務器的數據。 它似乎不在$ _POST變量中。

+1

剛回來,但我想我可以幫助你解決你的問題,然後我會嘗試你的建議!這些信息應該存儲在php輸入流中,所以你應該可以像'$ return = file_get_contents('php:// input');' – joseym 2011-05-10 15:11:43

+0

去除.php沒有幫助,不幸 – joseym 2011-05-11 21:29:12

1

您得到的錯誤是因爲iOS期望您的配置文件服務URL(它發送其UDID的URL)返回配置文件(即.mobileconfig文件)。我目前捕獲設備UDID而不返回此配置文件;我的設備會生成您描述的警報,但數據位於我的服務器上。

僅供參考,這裏是非常簡單的PHP我用它來採集數據文件:

<?php 
// set file to write 
$file = 'device_data/data.p7s'; 

$fp = fopen($file, 'w') or die('Could not open file!'); 
fwrite($fp, $HTTP_RAW_POST_DATA) or die('Could not write to file'); 
fclose($fp); 
?> 

這裏的關鍵是使用$HTTP_RAW_POST_DATA變量的準確捕捉HTTP請求主體爲發送,而不試圖將其解析爲通常的名稱/值對。在這一點上,我建議reading the documentation,但它確實沒有告訴你很多。

安全提示:無論用戶在請求正文中發送了什麼,您都正在寫入服務器上的文件。如果用戶決定發送一個shell腳本,PHP文件或其他可執行內容,然後訪問您創建的文件的URL,他們可以執行剛剛上傳到您的Web服務器上的代碼。因此,確保您寫入的文件不能通過HTTP訪問! (A .htaccess文件會執行此操作,或者寫入web根目錄之外的某個位置。)

6

關於最後一頁(FOLDER)的注意事項。

如果您想使用頁面腳本進行最終重定向而不是文件夾。

你可以改變這一點:

標題( 「位置: https://www.example.com/enrolment?params= {$ PARAMS}」);

通過

標題( 「位置: https://www.example.com/enrolment.php?params= {$ PARAMS}」,真實,301);

來源:header function on php.net manual

它的工作!

+3

對於其他人,如果您沒有301重定向,您將收到一個無效的配置文件。 – Rudiger 2014-02-21 03:34:39