Passbook — Hardcoding местоположений в JSON работает, но не передавая переменную

Я использую готовую структуру, найденную Вот для создания пропусков Apple Passbook. Я использую пример Starbucks, но с другими параметрами.

Фон: Apple разрешает сохранить только 10 местоположений в один проход. Цель сохранения местоположений — это запуск уведомления по телефону, когда вы находитесь рядом.

Поток моей системы:

  • Пользователь вводит домашний адрес
  • Google получает точные координаты широта / долгота
  • lat и lng устанавливаются на скрытые входные данные формы и POST помещаются для прохождения создания PHP.
  • Сервер запрашивает 10 ближайших местоположений и добавляет свои позиции в проход JSON.
  • Pass создает и загружает

проблема

Возможно, это проблема с PHP или Passbook.

Запрос переменных POSTed в Mysql просто отлично. При тестировании JSON JSON соответствует целевому шаблону, указанному в документации, приведенной ниже. 10 ближайших магазинов действительно вставляют себя в правильном синтаксисе. Тем не менее, пропуски, которые были жестко запрограммированы в JSON

    'locations' => array(

array(
'longitude' => 123456,
'latitude' => 123456,
'relevantText' => 'You are near store'
)
)

Они отображаются в локациях на карте.

Проходит, чьи местоположения каким-либо образом установлены с переменными, такими как

    'locations' => array(

array(
'longitude' => $lng,
'latitude' => $lat,
'relevantText' => 'You are near store'
)
)

Не показывает их местоположение на карте.
Я попытался смешать оба подхода, и, конечно же, отображаются только жестко запрограммированные местоположения — переменные и lng игнорируются.

Прямо перед заключительным этапом создания прохода я получаю формулу местоположения как:

"locations":[
{"longitude":-XX.XXXX,"latitude":XX.XXXX,"relevantText":"PLACE NAME"},
...(ten times.. comma'd until last one)...
]

Что можно сравнить с целевой формулой в документация Apple:

"locations" : [
{"latitude" : 37.3229, "longitude" : -122.0323, "relevantText" : "Store nearby on 3rd and Main."}
]

Я не понимаю, почему переменные могут передаваться нормально, запрашивать нормально, вводить JSON нормально, но делаю различие в том, что делает файл передачи.


РЕДАКТИРОВАТЬ: Больше информации по запросу.
HTML-форма по индексу, которая передает широту / долготу, заданную из геокода Google.

<form action="pass.php" method="post">
<fieldset>
<input type='text' id='lat' name='lat' value='' > //set thru jquery
<input type='text' id='lng' name='lng' value='' > //set thru jquery
<input type="submit" class="btn primary" name='pass' id='passButton' value=" Create pass &gt; " disabled />
</fieldset>
</form>

pass.php, который генерирует pass:

<?php
require('PKPass/PKPass.php');

$lat = floatval($_POST['lat']);
$lng = floatval($_POST['lng']);

require_once ('../../functions.php'); //get mysql wrapper class$query = "SELECT *, ( 3959 * acos( cos( radians($lat) ) * cos( radians( latitude ) ) *
cos( radians( longitude ) - radians($lng) ) + sin( radians($lat) ) *
sin( radians( latitude ) ) ) ) AS distance FROM dealers HAVING
distance < 25 ORDER BY distance LIMIT 0 , 10;";

$result = $db->doQuery($query); //wrapper class helps do queries
$pass = new PKPass\PKPass();$pass->setCertificate('cert/pass.p12');
$pass->setCertificatePassword('PASSWORD');
$pass->setWWDRcertPath('cert/AppleWWDRCA.pem');

// Top-Level Keys
$standardKeys         = array(
'description'        => 'Demo pass',
'formatVersion'      => 1,
'organizationName'   => 'NAME',
'passTypeIdentifier' => 'pass.place.coupon',
'serialNumber'       => '123456',
'teamIdentifier'     => 'IDENTIFIER'
);
$associatedAppKeys    = array();
$relevanceKeys        = array(
'locations' => array(

)

);

while ($row = $result->fetch_object()) {

$array =
array(
'longitude' => sprintf("%.4f", floatval($row->longitude)),
'latitude' => sprintf("%.4f",floatval($row->latitude)),
'relevantText' => $row->name
);

$relevanceKeys['locations'][] = $array;

}$styleKeys            = array(

'coupon' => array(
'primaryFields' => array(
array(
'key' => 'offer',
'label' => 'ITEM',
'value' => 'FREE'
)
),

'auxiliaryFields' => array(
array(
'key' => 'expires',
'label' => 'EXPIRES',
'value' => '2018-04-24T10:00-05:00',
'isRelative' => true,
'dateStyle' => 'PKDateStyleShort'
)
)
)
);

$visualAppearanceKeys = array(
'barcode'         => array(
'format'          => 'PKBarcodeFormatPDF417',
//        'format'          => 'PKBarcodeFormatQR',
'message'         => 'MESSAGE',
'messageEncoding' => 'iso-8859-1'
),
//    'foregroundColor' => 'rgb(255, 255, 255)',
'backgroundColor' => 'rgb(39,81,154)',
'logoText'        => 'COMPANY'
);
$webServiceKeys       = array();

// Merge all pass data and set JSON for $pass object
$passData = array_merge(
$standardKeys,
$associatedAppKeys,
$relevanceKeys,
$styleKeys,
$visualAppearanceKeys,
$webServiceKeys
);

$pass->setJSON(json_encode($passData));

// Add files to the PKPass package
$pass->addFile('icon.png');
$pass->addFile('[email protected]');
$pass->addFile('logo.png');

if(!$pass->create(true)) { // Create and output the PKPass
echo 'Error: '.$pass->getError();
}

Очевидные вещи в кепках — это упущения.

Результирующий JSON:

        {"description":"Demo pass","formatVersion":1,"organizationName":"NAME","passTypeIdentifier":"pass.place.coupon","serialNumber":"123456","teamIdentifier":"IDENTIFIER","locations":[{"longitude":"-xx.xxxx","latitude":"xx.xxxx","relevantText":"STORE_1"},{"longitude":"-xx.xxxx","latitude":"xx.xxxx","relevantText":"STORE_2"},{"longitude":"-xx.xxxx","latitude":"xx.xxxx","relevantText":"STORE_3"},{"longitude":"-xx.xxxx","latitude":"xx.xxxx","relevantText":"STORE_4"},{"longitude":"-xx.xxxx","latitude":"xx.xxxx","relevantText":"STORE_5"},{"longitude":"-xx.xxxx","latitude":"xx.xxxx","relevantText":"STORE_6"},{"longitude":"-xx.xxxx","latitude":"xx.xxxx","relevantText":"STORE_7"},{"longitude":"-xx.xxxx","latitude":"xx.xxxx","relevantText":"STORE_8"},{"longitude":"-xx.xxxx","latitude":"xx.xxxx","relevantText":"STORE_9"},{"longitude":"-xx.xxxx","latitude":"xx.xxxx","relevantText":"STORE_10"}],"coupon":{"primaryFields":[{"key":"offer","label":"ITEM","value":"FREE"}],"auxiliaryFields":[{"key":"expires","label":"EXPIRES","value":"2018-04-24T10:00-05:00","isRelative":true,"dateStyle":"PKDateStyleShort"}]},"barcode":{"format":"PKBarcodeFormatPDF417","message":"MESSAGE","messageEncoding":"iso-8859-1"},"backgroundColor":"rgb(39,81,154)","logoText":"COMPANY"}

Очевидно, что значения xx.xxxx являются действительными числами. Тот факт, что они являются строками или числами, похоже, не имеет значения. Когда я жестко закодировал их, они были последовательностями.
Приведенный выше JSON не создает файл пропуска с местоположениями на карте, когда это будет, если лат / лнг были жестко закодированы.
Проверено на PassWallet, работает. На симуляторе iO6 написано: «Safari не может загрузить этот файл». Когда я получил его, чтобы использовать проходы раньше.

0

Решение

С дополнительной информацией ваша проблема ясна.

Тот факт, что они являются строками или числами, похоже, не имеет
имело значение.

На самом деле для Passbook это имеет значение. Passbook дотошно привередлив к типу. sprintf("%.4f", floatval($row->longitude)) выводит результаты вашего запроса в виде строк, где формат пакета требует двойного.

От Справочник по формату пакета Passbook:

введите описание изображения здесь

Нет необходимости форматировать в любое конкретное количество мест, просто добавьте необработанные значения с плавающей точкой, и все будет в порядке.

1

Другие решения

Это оказалось странной ошибкой.

Казалось бы, все вычисления и создание JSON будут хорошими, но где-то между установкой JSON и созданием прохода у него больше не будет неповрежденных переменных POST. По умолчанию они будут 0/0, где-то рядом с Африкой.

Я смог решить эту проблему с помощью переменных сеанса вместо GET / POST. Перед отправкой формы я бы jquery ajax установил переменные сеанса и затем вызвал их на странице создания прохода, выполнив с ней все вычисления, которые мне понадобились для получения 10 дополнительных значений широты и долготы. Если начальная переменная больше не существует, остальные не могут быть получены!

Просто разместите это здесь на тот случай, если у кого-то возникнет такая же проблема. Это может быть уникально для этого проекта, но так оно и было.

0

По вопросам рекламы [email protected]