Как добавить более 10 локаций для пропуска

Я хочу использовать много местоположений для отображения на экране блокировки. Я уже протестировал, показано только 10 локаций. Есть ли способ показать более 10 местоположений?


person malinchhan    schedule 21.05.2013    source источник
comment
нет, согласно документам Apple можно показать только десять   -  person Rachel Gallen    schedule 21.05.2013
comment
Могу ли я использовать какой-либо трюк, чтобы получить другие места?   -  person malinchhan    schedule 21.05.2013
comment
нет, просто выбери лучшую десятку   -  person Rachel Gallen    schedule 21.05.2013
comment
Я знал это! но как насчет этого: gingercart.com/Home/mobile-tech-talk/   -  person malinchhan    schedule 21.05.2013
comment
Я не очень понимаю!   -  person malinchhan    schedule 21.05.2013


Ответы (1)


Рэйчел права в том, что Passbook распознает только первые 10 местоположений, включенных в pass.json. Если их больше 10, то они будут проигнорированы.

Обходной путь, на который вы ссылаетесь, предлагает следующее:

  • Вы создаете приложение с поддержкой определения местоположения
  • Всякий раз, когда ваше приложение обнаруживает значительное изменение местоположения, оно сообщает вашему серверу, предоставляя серийный номер пропуска и новое местоположение.
  • Затем ваш сервер выбирает 10 ближайших местоположений, компилирует новый проход и отправляет его на устройство.

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

Три альтернативных подхода:

  • Предоставление пользователю возможности выбрать 10 наиболее подходящих для него местоположений или
  • Обновление местоположений всякий раз, когда используется пропуск. Если пропуск отсканирован, вы можете использовать местоположение сканирующего устройства, чтобы определить 10 ближайших местоположений и отправить обновленный пропуск, или
  • Добавление уникальной ссылки в конце пропуска на страницу HTML5, которая захватывает их текущее местоположение с помощью Javascript (см. ниже), а затем инициирует отправку. Например. Чтобы обновить пропуск с 10 ближайшими местоположениями, нажмите на ссылку ниже http://www.yourservice.com/?passSerial=xxxx.

Пример местоположения JS:

<script>
if(navigator.geolocation){
    navigator.geolocation.getCurrentPosition(success,fail);
}

function success(a) {            
    $("#long").val(a.coords.longitude).focus(); // focus required to force an update of the field value in webkit browsers
    $("#lat").val(a.coords.latitude).focus();
    // initiate ajax callback to push new pass and alert the user that it is on the way

}
function fail() {
    alert("You must give permission to provide your location, please refresh this page and try again");
}
</script>
person PassKit    schedule 21.05.2013
comment
Спасибо, ПасКит! Я постараюсь сделать это! У меня есть только 2 дня, чтобы решить эту проблему! - person malinchhan; 21.05.2013
comment
ваши альтернативные подходы интересны! Я попробую ! - person malinchhan; 22.05.2013
comment
Как найти 10 ближайших мест? - person malinchhan; 22.05.2013
comment
Если пропуск не используется, могу ли я определить 10 ближайших местоположений? - person malinchhan; 22.05.2013
comment
в моей базе данных я сохраняю долготу и широту как double ! - person malinchhan; 22.05.2013
comment
Я пробую так: установить @orig_lat=122.4058; установить @orig_lon=37.7907;установить @dist=10; SELECT *,3956 * 2 * ASIN(SQRT( POWER(SIN((@orig_lat - abs(dest.latitude)) * pi()/180 / 2),2) + COS(@orig_lat * pi()/180 ) * COS( abs (dest.latitude) * pi()/180) * POWER(SIN((@orig_lon – dest.longtitude) * pi()/180 / 2), 2) )) как расстояние ОТ пункта назначения компании, где расстояние ‹ @dist ORDER BY ограничение расстояния 10; - person malinchhan; 22.05.2013
comment
#1064 - У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с '– dest.longtitude) * pi()/180 / 2), 2)) как расстояние ОТ компании Dest w' в строке 5 - person malinchhan; 22.05.2013
comment
longtitude написано неправильно, что произойдет, если изменить на dest.longitude? - person PassKit; 22.05.2013
comment
все еще ошибка, даже если я меняю: SELECT *, 3956 * 2 * ASIN (SQRT (POWER (SIN ((122,4058 - abs (dest.latitude)) * pi () / 180 / 2), 2) + COS (122,4058 * pi ( )/180 ) * COS(abs (широта назначения) * pi()/180) * POWER(SIN((37,7907 – долгота назначения) * pi()/180 / 2), 2) )) как расстояние ОТ компании как пункт назначения, где расстояние ‹ 10 ORDER BY Distance limit 10; - person malinchhan; 22.05.2013
comment
ошибка: #1064 - у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с '– dest.longitude) * pi()/180 / 2), 2)) )) as Distance FROM company as dest wher' в строке 1 - person malinchhan; 22.05.2013
comment
Может быть понятнее, если вы опубликуете как отдельный вопрос и пометите его MYSQL. - person PassKit; 22.05.2013
comment
А также дважды проверьте имя столбца на предмет долготы, чтобы убедиться, что оно соответствует вашему запросу. - person PassKit; 22.05.2013
comment
Когда я использую этот запрос: SELECT *,3956 * 2 * ASIN(SQRT( POWER(SIN((122,4058 - abs(dest.latitude)) * pi()/180/2),2) + COS(122,4058 * pi( )/180 ) * COS(абс(назнач.широта) * пи()/180) * СТЕПЕНЬ(SIN((37,7907 - абс(назнач.долгота)) * пи()/180/2), 2) )) как dist FROM company as dest, где dest.longitude не равно null и dest.latitude не равно null ORDER BY dis limit 10; - person malinchhan; 23.05.2013
comment
он показывает 10 строк, но это не правильно для всех! Я помещаю число от 1 до 10, которое ближе всего, но оно отображается в случайном идентификаторе компании, например: 14, 4, 18,1, 20,9,10,2, 15,21. - person malinchhan; 23.05.2013
comment
что я должен добавить еще, чтобы выбрать ближайшие места! - person malinchhan; 23.05.2013
comment
Я думаю, что это презентация, из которой взята формула, которую вы используете. У вас есть жестко закодированные значения для orig.latitude и orig.longitude. Исходная широта, которую вы ввели, также кажется недействительной (›90). Что произойдет, если вы замените эти значения широтой/долготой центральной точки, вокруг которой вы хотите выполнить поиск? - person PassKit; 23.05.2013
comment
да, я следую формуле в этой ссылке. какова широта/долгота центральной точки? - person malinchhan; 23.05.2013
comment
Широта/долгота точки, к которой вы хотите получить 10 ближайших местоположений. - person PassKit; 23.05.2013
comment
Могу ли я использовать текущее местоположение пользователя в качестве центральной точки? а может он сменный? так как пользователи будут находиться в разных местах, мне нужно выбрать 10 ближайших к ним мест. - person malinchhan; 23.05.2013
comment
даже я использую текущую широту/долготу, я все равно получаю результат, как раньше. Я использую этот запрос: SELECT *,3956 * 2 * ASIN(SQRT( POWER(SIN((104.89529371261597 - abs(dest.latitude)) * pi()/180/2),2) + COS(104.89529371261597 * pi() /180 ) * COS( abs(dest.latitude) * pi()/180) * POWER(SIN((11.576150037278605 - dest.longitude) * pi()/180 / 2), 2) )) as dis ОТ компании Dest где dest.longitude не равно null и dest.latitude не равно null ORDER BY dis limit 10; - person malinchhan; 23.05.2013
comment
теперь я могу получить ближайшие места к моему текущему местоположению, используя этот запрос: ВЫБЕРИТЕ идентификатор компании, релевантное текстовое имя как название компании, ACOS (SIN (РАДИАНЫ (назначение.широта)) * SIN (РАДИАНЫ (11,576150037278605)) + COS (РАДИАНЫ (назначение.широта) ) ) * COS( РАДИАНЫ( 11.576150037278605 )) * COS( РАДИАНЫ(долгота пункта назначения ) - РАДИАНЫ( 104.89529371261597 )) ) * 6380 AS расстояние ОТ компании как пункт назначения с расстоянием ‹ 10 ЗАКАЗАТЬ ПО пределу расстояния 10; - person malinchhan; 23.05.2013
comment
У вас неправильная широта и долгота. Попробуйте `SELECT *,3956 * 2 * ASIN(SQRT( POWER(SIN((11.576150037278605 - abs(dest.latitude)) * pi()/180/2),2) + COS(11.576150037278605 * pi()/180 ) * COS( abs(dest.latitude) * pi()/180) * POWER(SIN((104.89529371261597 - dest.longitude) * pi()/180 / 2), 2) )) as dis ОТ компании пункт назначения где пункт назначения. долгота не равна нулю, а dest.latitude не равна нулю ORDER BY dis limit 10; ` - person PassKit; 23.05.2013
comment
И да — имеет смысл использовать текущее местоположение устройства после того, как вы проверили, работает ли ваш запрос. - person PassKit; 23.05.2013
comment
Просто подумал о другой альтернативе с использованием javascript - гораздо проще и удобнее в реализации, чем приложение, см. обновленный ответ. - person PassKit; 23.05.2013
comment
Но могу ли я обновить пропуск автоматически без уведомления пользователя? потому что пользователи не могут щелкнуть ссылку в конце прохода. - person malinchhan; 23.05.2013
comment
Верно — им нужно будет щелкнуть заднюю часть пропуска, но это гораздо более вероятно, чем то, что они загрузят ваше приложение и продолжат его работу, потребляя заряд батареи. Особенно, если единственной целью приложения является предоставление обновлений местоположения. Конечно, вы всегда можете сделать и то, и другое. - person PassKit; 23.05.2013
comment
Я мог бы сделать оба? кто они такие ? - person malinchhan; 23.05.2013
comment
Я хочу найти способ, которым пользователь ничего не делает, но сервер должен обновлять местоположения, когда пользователь перемещает новое место! - person malinchhan; 23.05.2013
comment
Вы можете автоматизировать это только с помощью приложения, но пользователи могут не загружать ваше приложение, не разрешать обновления местоположения или не запускать его после перезагрузки, поэтому на самом деле нет надежного способа автоматического обновления пропуска. В обоих случаях я имел в виду, что вы можете иметь приложение, но также предлагать ссылку на обратной стороне пропуска, чтобы пользователь мог вручную обновлять свое местоположение, если он переезжает в новое место. Вы также можете реализовать третий вариант отправки обновления с новыми местоположениями всякий раз, когда используется пропуск. - person PassKit; 23.05.2013
comment
чтобы получить текущее местоположение по широте/долготе, могу ли я использовать php? - person malinchhan; 23.05.2013
comment
Приведенный выше код предполагает, что вы используете jQuery и имеете поля ввода типа (скорее всего, скрытые) с идентификаторами long и lat E.g. <input type="hidden" id="long" name="long" value="" /><input type="hidden" id="lat" name="lat" value="" /> При загрузке страницы навигатор автоматически запросит у пользователя разрешение на использование своего местоположения. Если разрешение дано, код автоматически обновит значения этих полей. - person PassKit; 23.05.2013
comment
Посмотрите на источник для этой страницы - он захватывает широту/долготу и заполняет форму. - person PassKit; 23.05.2013
comment
Что ты не понимаешь? - person PassKit; 24.05.2013
comment
где ваш скрипт для определения местоположения? У вас есть файл js и jquery с большим количеством кода. - person malinchhan; 24.05.2013
comment
Этот должен быть проще, не тестировался — он содержит тот же код, что и выше. - person PassKit; 24.05.2013
comment
Да я получил его ! это более легко понять! Спасибо !! - person malinchhan; 24.05.2013
comment
поэтому я должен использовать: ‹script src=ajax.aspnetcdn.com/ajax/jQuery/› ? - person malinchhan; 24.05.2013
comment
перед использованием: jquery-1.8.0.min.js - person malinchhan; 24.05.2013
comment
Не имеет значения, какая версия jQuery, jQuery 2.0.0 является последней версией — не работает с IE 6,7 и 8, но это не будет проблемой для клиентов iOS. - person PassKit; 24.05.2013
comment
но моя компания еще не приняла это решение, потому что пользователи не взаимодействуют с этим пропуском! - person malinchhan; 24.05.2013
comment
Я должен найти решение, которое сделает пользователя проще! - person malinchhan; 24.05.2013
comment
Я не уверен, что есть приложение, которое работает в рамках ограничений среды PassKit, если вы не добавите приложение, которое как бы побеждает весь смысл Passbook. - person PassKit; 24.05.2013
comment
что это значит ? Я должен сделать приложение, которое может связаться с сберегательной книжкой? - person malinchhan; 24.05.2013
comment
Чтобы иметь возможность обновить пропуск с новыми местоположениями, вам нужно знать местоположение пользователя и активировать push. Passbook не предоставляет информацию о местоположении обратно эмитенту Pass, а это означает, что вам нужно получить местоположение откуда-то еще. Это оставляет вам 3 варианта: 1. сопутствующее приложение, которое постоянно отслеживает местоположение и сообщает на ваш сервер всякий раз, когда происходят значительные изменения, чтобы вы могли отправить новый проход; 2. всякий раз, когда используется пропуск, взять местоположение сканирования и использовать его для отправки нового прохода с обновленными местоположениями; или 3. разрешить пользователю указать свое местоположение. - person PassKit; 24.05.2013
comment
да, я попробую 1 среди них! первый вариант интересен. какое приложение-компаньон делает? Не могли бы вы объяснить больше? - person malinchhan; 24.05.2013
comment
Я думал, это то, что вы создали? Сопутствующее приложение проверит, установлен ли пропуск, и узнает, какие местоположения были в пропуске. Если пользователь меняет местоположение, приложение может обнаружить изменение местоположения, а затем вызвать веб-службу, чтобы: инициировать push-уведомление для обновления прохода с новыми местоположениями; или автоматически извлеките пакет .pkpass из веб-службы и используйте метод replacePassWithPass платформы PassKit для замены прохода в Passbook пользователя. - person PassKit; 24.05.2013
comment
Для проверки текущей широты/долготы раньше, может ли он отображать широту/долготу напрямую, не щелкая в текстовом поле? - person malinchhan; 24.05.2013
comment
давайте продолжим обсуждение в чате - person PassKit; 24.05.2013
comment
Я хочу использовать его как метод, возвращая широту/долготу, поэтому я тестирую: ‹input id=lat class=required name=lat type=hidden value=Not Available/›‹/div› ‹div›‹label for=long›‹/label›‹input id=long class=required name=long type= скрытое значение=Недоступно/›‹/div› ‹тип ввода=скрытое имя=серийное значение=‹?php echo $_GET['serial']; ?› /?› ‹/form› ‹/body› ‹/html› - person malinchhan; 24.05.2013
comment
‹?php if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['currentlatlng'])){ $lat = $_POST['lat']; $long = $_POST['long']; эхо лат: '.$лат.'; эхо длинное: '.$long.'; } ?› - person malinchhan; 24.05.2013
comment
Вместо сериализации формы $("#locationForm").serialize() как насчет создания пользовательского словаря { "long" : a.coords.longitude, "lat" : a.coords.latitude, "serial" : "<?php echo $_GET['serial']; ?>"} - person PassKit; 24.05.2013
comment
Как использовать этот пользовательский словарь? - person malinchhan; 27.05.2013
comment
Этот словарь представляет то, что отправляется на ваш сервер. Вы сказали, что у вас были проблемы с незаполненными значениями полей, поэтому вместо сериализации и публикации содержимого формы вы можете попробовать опубликовать значения напрямую. - person PassKit; 27.05.2013
comment
Когда я тестирую ваш код, чтобы найти текущую широту/долготу, широта/долгота появляются, когда я нажимаю в texField. Итак, если я не нажму на нее, есть ли другие способы показать ее напрямую? - person malinchhan; 27.05.2013
comment
См. обновленный ответ. Добавление .focus() будет имитировать щелчок в текстовом поле для отображения значения. - person PassKit; 27.05.2013