Получение 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 файл сделает свое дело, или напишет куда-нибудь за пределами корневого каталога.)

Другие вопросы по тегам