Получение UDID устройства из .mobileconfig

Я пытаюсь написать функцию, похожую на http://whatismyudid.com/, которая затем будет одобрена, вернет UDID пользователей и сохранит их в базе данных для дальнейшего использования с этим пользователем.

Я написал dm файл .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 UDID.</string>
    <key>PayloadType</key>
    <string>Profile Service</string>
</dict>
</plist>

Профиль инициализируется путем перехода на http://apps.mortlabs.com/device/enroll.php с помощью мобильного сафари

Ответ 1

Я обнаружил, что, используя вышеизложенное, с Apache обсуждался Ipad/Iphone - сообщение 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');

Затем вы можете разобрать строку данных $, чтобы получить то, что вам нужно (пример file_put_contents("data.txt", $data); или пример Kyle2011)

Я также изменил UDID полезной нагрузки на что-то другое, используя udidgen в терминале на Mac, а не просто используя whatismyudid.com.

Обновление: с iOS 7.1 некоторые файлы (.plist IIRC) должны быть переданы по https://- они не смогут установить, если все обслуживается через http://- возможно, лучше всего обслуживать все, включая .ipa над https://для обеспечения будущих изменений на стороне Apple не вызывает проблем.

Ответ 2

Обратите внимание на последнюю страницу (FOLDER).

Если вы хотите использовать страницу script для окончательного перенаправления вместо папки.

вы можете изменить это:

заголовок ( "Location: https://www.example.com/enrolment?params= {$ params}" );

заголовок ( "Location: https://www.example.com/enrolment.php?params= {$ params}", true, 301);

Источник: функция заголовка в руководстве php.net

он работает!

Ответ 3

Попробуйте настроить URL-адрес на адрес без расширения .php. Это решило проблему для меня. Теперь моя единственная проблема заключается в том, что я не могу узнать, как получить данные, отправленные с устройства iOS на мой сервер. Кажется, он не находится в переменной $_POST.

Ответ 4

Ошибка, которую вы получаете, заключается в том, что 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 точно так же, как отправлено, не пытаясь разобрать его в обычные пары имя/значение. Я бы предложил прочитать документацию на данный момент, но это действительно не говорит вам много.

Совет безопасности: независимо от того, что пользователь отправляет в тело запроса, вы пишете файл на своем сервере. Если пользователь решает отправить оболочку script, файл PHP или другой исполняемый контент, затем просматривает URL-адрес создаваемого вами файла, он может выполнить код, который только что был загружен на ваш веб-сервер. Итак, убедитесь, что файл, на который вы пишете, недоступен через HTTP! (Файл A .htaccess мог бы сделать трюк или написать где-то вне корня веб-сайта.)