Получение UDID устройства из.mobileconfig
Я пытаюсь написать функцию, аналогичную http://whatismyudid.com/ которая после утверждения вернет UDID пользователя и сохранит его в базе данных для последующего обращения к этому пользователю.
Я написал.mobileconfig XML документ, который открывается в установщике профиля просто отлично, но когда я говорю ему, чтобы установить профиль, он отвечает [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 с помощью мобильного сафари.
4 ответа
Я обнаружил, что с помощью вышесказанного Ipad / Iphone говорил с Apache - пост Kyle2011 по адресу https://discussions.apple.com/thread/3089948?start=0&tstart=0 заполнил остальную часть решения.,
В основном в нижней части страницы retrieve.php вам нужно перенаправить браузер в каталог, используя строку, подобную следующей:-
header("Location: https://www.example.com/enrolment?params={$params}");
Если регистрация - это каталог, то он вызывает DirectoryIndex (обычно index.php), который затем может отображать данные для вашего пользователя.
Чтобы заполнить переменную $params, вам нужна следующая строка в верхней части скрипта retrieve.php
$data = file_get_contents('php://input');
Затем вы можете разобрать строку $data, чтобы получить то, что вам нужно (попробуйте file_put_contents("data.txt", $data);
или пример Kyle2011)
Я также изменил UDID полезной нагрузки на что-то другое, используя udidgen
в терминале на Mac, а не просто с помощью whatismyudid.com.
Обновление: Начиная с iOS 7.1, некоторые файлы (.plist IIRC) должны обслуживаться через https:// - их не удастся установить, если все обслуживается через http:// - возможно, лучше всего обслуживать все, включая.ipa поверх https: // чтобы гарантировать, что будущие изменения на стороне Apple не вызовут проблем.
Заметка о последней странице (ПАПКА).
Если вы хотите использовать скрипт страницы для окончательного перенаправления вместо папки.
Вы можете изменить это:
header("Местоположение: https://www.example.com/enrolment?params={$ params}");
от
header("Местоположение: https://www.example.com/enrolment.php?params={$ params}", true, 301);
Источник: функция заголовка в руководстве php.net
это работает!
Попробуйте установить URL на адрес без расширения.php. Это решило проблему для меня. Теперь моя единственная проблема в том, что я не могу узнать, как извлечь данные, отправленные с устройства iOS на мой сервер. Кажется, он не находится в переменной $_POST.
Ошибка, которую вы получаете, заключается в том, что iOS ожидает, что URL-адрес службы вашего профиля (тот, которому она отправляет свой UDID) возвращает профиль конфигурации (т.е. .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-запроса точно в том виде, в котором оно было отправлено, без попытки разбить его на обычные пары имя / значение. Я бы посоветовал прочитать документацию на данный момент, но она действительно мало о чем говорит.
Совет по безопасности: все, что пользователь отправляет в теле запроса, вы записываете в файл на своем сервере. Если пользователь решает отправить сценарий оболочки, файл PHP или другой исполняемый контент, а затем посещает URL создаваемого вами файла, он может выполнить код, только что загруженный на ваш веб-сервер. Поэтому убедитесь, что файл, в который вы пишете, не доступен по HTTP! (A .htaccess
файл сделает свое дело, или напишет куда-нибудь за пределами корневого каталога.)