Получение UDID устройства из .mobileconfig - PullRequest
21 голосов
/ 25 апреля 2011

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

Я написал XML-документ .mobileconfig, который открывается в установщике профилей просто отлично, но когда я говорю ему установить профиль, он отвечает [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 ]

13 голосов
/ 22 июня 2011

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

6 голосов
/ 26 октября 2012

Примечание о последней странице (FOLDER).

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

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

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

by

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

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

это работает!

1 голос
/ 18 апреля 2012

Ошибка, которую вы получаете, заключается в том, что 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 ! (Файл .htaccess сработает или напишет куда-нибудь за пределами корневого каталога.)

1 голос
/ 03 мая 2011

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

...