Как устройство регистрирует себя после добавления пропуска

Когда я добавляю пропуск в устройство, я вижу в консоли следующее:

Mar 26 14:32:36 CamMobs-iPod4 passd[7128] <Warning>: Card has more than 10 locations. Capping.
Mar 26 14:32:38 CamMobs-iPod4 MobileSafari[7115] <Warning>: Warning: Attempt to dismiss from view controller <BrowserRootViewController: 0x1ed546a0> while a presentation or dismiss is in progress!
Mar 26 14:32:39 CamMobs-iPod4 backboardd[52] <Warning>: CoreAnimation: updates deferred for too long
Mar 26 14:32:39 CamMobs-iPod4 locationd[41] <Notice>: Location icon should now be in state 'Active'
Mar 26 14:32:50 CamMobs-iPod4 locationd[41] <Notice>: Location icon should now be in state 'Inactive'
Mar 26 14:32:52 CamMobs-iPod4 profiled[7122] <Notice>: (Note ) profiled: Idled.
Mar 26 14:32:52 CamMobs-iPod4 profiled[7122] <Notice>: (Note ) profiled: Service stopping.
Mar 26 14:33:31 CamMobs-iPod4 locationd[41] <Warning>: Launch Services: Registering unknown app identifier com.apple.PassKit failed
Mar 26 14:33:31 CamMobs-iPod4 locationd[41] <Warning>: Launch Services: Unable to find app identifier com.apple.PassKit
Mar 26 14:33:33 CamMobs-iPod4 configd[50] <Notice>: network changed: v4(en0:192.168.1.109) DNS Proxy
Mar 26 14:33:53 CamMobs-iPod4 backboardd[52] <Notice>: Posting 'com.apple.iokit.hid.displayStatus' notifyState=0

..... Почему он пытается зарегистрироваться в com.apple.PassKit? На моем сервере я использую некоторые коды в index.php, например:

<?php
    // Transfer Request URL into array
$request = explode("/", substr(@$_SERVER['REQUEST_URI'], 1));
//$request = explode("/", substr(@$_SERVER['REQUEST_URI'], 1));
print_r($_SERVER['REQUEST_URI']);

if (strtoupper($_SERVER['REQUEST_METHOD']) === "POST"
    && isset($_SERVER['HTTP_AUTHORIZATION'])
    && strpos($_SERVER['HTTP_AUTHORIZATION'], 'ApplePass') === 0
    && $request[2] === "devices"
    && $request[4] === "registrations") {

$auth_key = str_replace('ApplePass ', '', $_SERVER['HTTP_AUTHORIZATION']);

$device_id = $request[3];
$pass_id = $request[5];
$serial = $request[6];

echo $request[3];
//$device_id = $_POST[''];
echo $device_id;
echo $pass_id;
echo $serial ; 
// Catch the JSON post and decode it
$dt = @file_get_contents('php://input');
   // $dt = @file_get_contents('php://input');
//$device_token = json_decode($dt);
//$device_token = $device_token->pushToken;

$pushtoken=json_decode($dt)->pushToken;
if (!$device_token) die('No Token Found'); // Token wasn't found

    $dbhost = 'localhost:8889';
    $dbuser = 'root';
    $dbpass = 'root';
    $dbname = 'passesdb';
    $conn = mysql_connect($dbhost, $dbuser, $dbpass)

    or die ('Error connecting to mysql'.mysql_error());         

    mysql_select_db($dbname);
    mysql_query("SET NAMES UTF8");
    mysql_query($sql,$conn);
    $table = 'Devices';
    $sql = mysql_query("insert into Devices values('$device_id','$pushtoken')");
    mysql_query($sql);
exit;
}

?>

person malinchhan    schedule 26.03.2013    source источник
comment
В моем pass.json: webServiceURL: 192.168.1.202/passesWebserver, authenticationToken: Fy7Iiew81JNdsdaG, ...... ....   -  person malinchhan    schedule 26.03.2013


Ответы (1)


Вот как выглядит успешная регистрация в консоли:

1. Mar 26 17:00:03 iPhone5 passd[6262] <Warning>: Generating POST request with URL <https:/afr.passk.it/v1/devices/7864dc8fdcfe739273cf7362a0db2b35/registrations/pass.it.passk.developer3/1wqdDAqHydkRURA9YCjbq>
2. Mar 26 17:00:03 iPhone5 passd[6262] <Warning>: Request contains header field <Authorization: ApplePass 5cdddad65324384efa39575a4cf22424>
3. Mar 26 17:00:03 iPhone5 passd[6262] <Warning>: Request contains body dictionary {
        pushToken = 0bbe54794500332b789a3ddb69827386d5c9aad1cb035c9f2725761d419950b2;
    }
4. Mar 26 17:00:04 iPhone5 passd[6262] <Warning>: Register task (for device 7864dc8fdcfe739273cf7362a0db2b35, pass type pass.it.passk.developer3, serial number 1wqdDAqHydkRURA9YCjbq; with web service url https://afr.passk.it/) got response with code 201
5. Mar 26 17:00:04 iPhone5 passd[6262] <Warning>: Generating GET request with URL <https:/afr.passk.it/v1/devices/7864dc8fdcfe739273cf7362a0db2b35/registrations/pass.it.passk.developer3?passesUpdatedSince=1364287618>
6. Mar 26 17:00:04 iPhone5 passd[6262] <Warning>: Generating GET request with URL <https:/afr.passk.it/v1/passes/pass.it.passk.developer3/1wqdDAqHydkRURA9YCjbq>
7. Mar 26 17:00:04 iPhone5 passd[6262] <Warning>: Request contains header field <If-Modified-Since: Tue, 26 Mar 2013 07:35:33 GMT>
8. Mar 26 17:00:04 iPhone5 passd[6262] <Warning>: Request contains header field <Authorization: ApplePass 5cdddad65324384efa39575a4cf22424>
9. Mar 26 17:00:04 iPhone5 passd[6262] <Warning>: Get serial #s task (for device 7864dc8fdcfe739273cf7362a0db2b35, pass type pass.it.passk.developer3, last updated 1364287618; with web service url https://afr.passk.it/) got response with code 204
10. Mar 26 17:00:04 iPhone5 passd[6262] <Warning>: Get serial numbers task completed with update tag (null), serial numbers (null)
11. Mar 26 17:00:05 iPhone5 passd[6262] <Warning>: Get pass task (pass type pass.it.passk.developer3, serial number 1wqdDAqHydkRURA9YCjbq, if-modified-since Tue, 26 Mar 2013 07:35:33 GMT; with web service url https://afr.passk.it/) got response with code 304

То, что вы разместили выше, является лишь последней строкой этого процесса (где passd понял, что у вас есть более 10 местоположений в вашем pass.json).


Если вы изучите вышеизложенное, вы увидите поток событий, на который должен реагировать ваш веб-сервис:

Строка 1: устройство отправляет запрос POST на:

https://webserviceURL/v1/devices/{deviceLibraryIdentifier}/registrations/{passTypeIdentifier}/{serialNumber}`

Строка 2: запрос POST отправляется с полем заголовка:

Authorization: ApplePass {authenticationToken}

Строка 3: тело POST содержит словарь JSON:

{
    pushToken = {pushToken};
}

Если ваше правило перезаписи правильное, ваш PHP-код должен проанализировать URL-адрес, захватить deviceLibraryIdentifier и pushToken и сохранить его в базе данных со ссылкой на запись прохода, содержащую serialNumber, authenticationToken и passTypeIdentifier.

Затем строка 4: ваша веб-служба отвечает устройству кодом 201, чтобы указать, что регистрация прошла успешно.

В строке 5: устройство затем генерирует запрос GET к вашей веб-службе, чтобы проверить, есть ли более новые версии pof для того же сертификата:

https:/webserviceURL/v1/devices/{deviceLibraryIdentifier}/registrations/{passTypeIdentifier}?passesUpdatedSince={lastUpdateTag}

В строках 6, 7 и 8: устройство создает запрос GET к вашей веб-службе, чтобы проверить, существует ли более новая версия этого конкретного прохода. Он предоставляет If-Modified-Since header, содержащий дату, указанную в заголовке последнего загруженного пакета .pkpass (строка 7), и предоставляет другой заголовок Authorization, содержащий Applepass {authenticationToken} (строка 8), чтобы ваша веб-служба может проверить запрос, проверив запись базы данных на наличие serialNumber.

https:/webserviceURL/v1/passes/{passTypeIdentifier}/{serialNumber}
Header: If-Modified-Since: {last modified date}
Header: Authorization: ApplePass {authenticationToken}

В строке 9: веб-служба отвечает ответом 204, указывающим на отсутствие serialNumber для passTypeIdentifier, требующих обновления. Строка 10 подтверждает это.

Наконец, в строке 11 устройство получает ответ 304 от вашей веб-службы, подтверждающий, что только что установленный пропуск является последней версией пропуска.

Вышеизложенное точно описывает, что ваша веб-служба будет получать, и ответы, которые она должна предоставить для успешной регистрации устройства.

person PassKit    schedule 26.03.2013
comment
Да! Ваш index.php должен содержать код здесь - person PassKit; 27.03.2013
comment
Я до сих пор не вижу результат на консоли, даже сейчас работает правило перезаписи! - person malinchhan; 29.03.2013
comment
Хорошо, что правило перезаписи работает. Включайте и выключайте уведомления на обратной стороне пропуска при подключении к Xcode. Что вы видите в консоли? - person PassKit; 29.03.2013
comment
когда я добавляю проход через приложение или веб-сервер? - person malinchhan; 29.03.2013
comment
Неважно, как добавляется пропуск, если он содержит webServiceURL и authenticationToken. Когда вы переключаете уведомления на обратной стороне пропуска, устройство попытается снова зарегистрироваться в вашей веб-службе, и вы должны получить некоторые подсказки относительно того, что происходит. Также проверьте свои журналы PHP, чтобы увидеть, не произошел ли сбой вашего скрипта из-за ошибки. - person PassKit; 29.03.2013
comment
в консоли, когда я переключаюсь на автоматическое обновление, я вижу следующее: «29 марта 11:32:52 CamMobs-iPod4 UserEventAgent[13] ‹Ошибка›: не удалось получить имя события для потока/токена: com.apple. backgroundtaskagent/5453: 0x3: Нет такого процесса 29 марта 11:32:52 CamMobs-iPod4 UserEventAgent[13] ‹Error›: Не удалось найти канал/токен: com.apple.backgroundtaskagent/0x5453: 0x3: Нет такого процесса - person malinchhan; 29.03.2013
comment
29 марта 11:33:00 Профилирование CamMobs-iPod4[9899] ‹Уведомление›: (Примечание) профилирование: Бездействие. 29 марта 11:33:00 Профилирование CamMobs-iPod4[9899] ‹Уведомление›: (Примечание) профилирование: служба остановлена. - person malinchhan; 29.03.2013
comment
Вы публикуете неправильную часть журналов консоли. Часть, которая вам нужна, должна содержать passd E.G. Mar 29 11:33:00 CamMobs-iPod4 passd[. Убедитесь, что на вашем устройстве включено расширенное ведение журнала для сберкнижки. - person PassKit; 29.03.2013
comment
когда я снова добавляю пропуск, я вижу это: 29 марта 11:44:45 CamMobs-iPod4 backboardd[52] ‹Предупреждение›: Приложение 'UIKitApplication:com.cam-mob.PassbookPassTest[0xc384]' аварийно завершило работу с сигналом 9: Убито: 9 - person malinchhan; 29.03.2013
comment
Пропуск добавляется к устройству или нет? - person PassKit; 29.03.2013
comment
Так у вас есть переключатель уведомлений на задней панели? Вы включили дополнительное ведение журнала PassKit и видите ли вы попытку регистрации в консоли? - person PassKit; 29.03.2013
comment
давайте продолжим это обсуждение в чате - person PassKit; 29.03.2013
comment
Как установить число 7, а также 11? - person malinchhan; 08.04.2013
comment
7. 26 марта 17:00:04 iPhone5 passd[6262] ‹Предупреждение›: Запрос содержит поле заголовка ‹If-Modified-Since: Вт, 26 марта 2013 г. 07:35:33 GMT›? - person malinchhan; 08.04.2013
comment
раньше я использовал $authKey для получения из заголовка: Authorization: ApplePass {authenticationToken}. как насчет заголовка: If-Modified-Since: {дата последнего изменения}? что я получу от этого? - person malinchhan; 08.04.2013
comment
Значение будет в $_SERVER['HTTP-IF-MODIFIED-SINCE'];. См. принятый ответ на этот вопрос, чтобы узнать, как его использовать stackoverflow.com/questions/10847157/ - person PassKit; 08.04.2013
comment
где я должен поместить заголовок if-modified-since? - person malinchhan; 08.04.2013
comment
Я поставил это: выход; } - person malinchhan; 08.04.2013
comment
как посмотреть в консоли? - person malinchhan; 08.04.2013
comment
Это Вы должны увидеть что-то вроде <Warning>: Get pass task (pass type pass.it.passk.developer3, serial number 1wqdDAqHydkRURA9YCjbq, if-modified-since Tue, 26 Mar 2013 07:35:33 GMT; with web service url https://afr.passk.it/) got response with code 304 - person PassKit; 08.04.2013
comment
нет, я получаю это: [2013-04-08 13:46:12 +0700] Задача получения прохода (тип прохода pass.cam-mob.passbookpasstest, серийный номер 0001, if-modified-since (null); с веб-службой URL 192.168.1.202:8888/passesWebserver) обнаружил ошибку: ответ сервера был искажен (отсутствуют данные ответа) - person malinchhan; 08.04.2013
comment
Это означает, что ваш сервер не отправляет пакет .pkpass. Проверьте журналы PHP на наличие подсказок! - person PassKit; 08.04.2013
comment
как получить s.th на консоли, как вы в 7. 26 марта 17:00:04 iPhone5 passd[6262] ‹Предупреждение›: Запрос содержит поле заголовка ‹If-Modified-Since: вторник, 26 марта 2013 г. 07:35:33 ВРЕМЯ ПО ГРИНВИЧУ> ? - person malinchhan; 08.04.2013
comment
Как вы просматриваете все сообщения в консоли без отображения ‹private› на устройстве разработчика? - person Michael; 30.08.2017