Я хочу использовать много местоположений для отображения на экране блокировки. Я уже протестировал, показано только 10 локаций. Есть ли способ показать более 10 местоположений?
Как добавить более 10 локаций для пропуска
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
Спасибо, ПасКит! Я постараюсь сделать это! У меня есть только 2 дня, чтобы решить эту проблему!
- person malinchhan; 21.05.2013
ваши альтернативные подходы интересны! Я попробую !
- person malinchhan; 22.05.2013
Как найти 10 ближайших мест?
- person malinchhan; 22.05.2013
Если пропуск не используется, могу ли я определить 10 ближайших местоположений?
- person malinchhan; 22.05.2013
в моей базе данных я сохраняю долготу и широту как double !
- person malinchhan; 22.05.2013
Я пробую так: установить @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
#1064 - У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с '– dest.longtitude) * pi()/180 / 2), 2)) как расстояние ОТ компании Dest w' в строке 5
- person malinchhan; 22.05.2013
longtitude
написано неправильно, что произойдет, если изменить на dest.longitude
?
- person PassKit; 22.05.2013
все еще ошибка, даже если я меняю: 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
ошибка: #1064 - у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с '– dest.longitude) * pi()/180 / 2), 2)) )) as Distance FROM company as dest wher' в строке 1
- person malinchhan; 22.05.2013
Может быть понятнее, если вы опубликуете как отдельный вопрос и пометите его MYSQL.
- person PassKit; 22.05.2013
А также дважды проверьте имя столбца на предмет долготы, чтобы убедиться, что оно соответствует вашему запросу.
- person PassKit; 22.05.2013
Когда я использую этот запрос: 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
он показывает 10 строк, но это не правильно для всех! Я помещаю число от 1 до 10, которое ближе всего, но оно отображается в случайном идентификаторе компании, например: 14, 4, 18,1, 20,9,10,2, 15,21.
- person malinchhan; 23.05.2013
что я должен добавить еще, чтобы выбрать ближайшие места!
- person malinchhan; 23.05.2013
Я думаю, что это презентация, из которой взята формула, которую вы используете. У вас есть жестко закодированные значения для orig.latitude и orig.longitude. Исходная широта, которую вы ввели, также кажется недействительной (›90). Что произойдет, если вы замените эти значения широтой/долготой центральной точки, вокруг которой вы хотите выполнить поиск?
- person PassKit; 23.05.2013
да, я следую формуле в этой ссылке. какова широта/долгота центральной точки?
- person malinchhan; 23.05.2013
Широта/долгота точки, к которой вы хотите получить 10 ближайших местоположений.
- person PassKit; 23.05.2013
Могу ли я использовать текущее местоположение пользователя в качестве центральной точки? а может он сменный? так как пользователи будут находиться в разных местах, мне нужно выбрать 10 ближайших к ним мест.
- person malinchhan; 23.05.2013
даже я использую текущую широту/долготу, я все равно получаю результат, как раньше. Я использую этот запрос: 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
теперь я могу получить ближайшие места к моему текущему местоположению, используя этот запрос: ВЫБЕРИТЕ идентификатор компании, релевантное текстовое имя как название компании, ACOS (SIN (РАДИАНЫ (назначение.широта)) * SIN (РАДИАНЫ (11,576150037278605)) + COS (РАДИАНЫ (назначение.широта) ) ) * COS( РАДИАНЫ( 11.576150037278605 )) * COS( РАДИАНЫ(долгота пункта назначения ) - РАДИАНЫ( 104.89529371261597 )) ) * 6380 AS расстояние ОТ компании как пункт назначения с расстоянием ‹ 10 ЗАКАЗАТЬ ПО пределу расстояния 10;
- person malinchhan; 23.05.2013
У вас неправильная широта и долгота. Попробуйте `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
И да — имеет смысл использовать текущее местоположение устройства после того, как вы проверили, работает ли ваш запрос.
- person PassKit; 23.05.2013
Просто подумал о другой альтернативе с использованием javascript - гораздо проще и удобнее в реализации, чем приложение, см. обновленный ответ.
- person PassKit; 23.05.2013
Но могу ли я обновить пропуск автоматически без уведомления пользователя? потому что пользователи не могут щелкнуть ссылку в конце прохода.
- person malinchhan; 23.05.2013
Верно — им нужно будет щелкнуть заднюю часть пропуска, но это гораздо более вероятно, чем то, что они загрузят ваше приложение и продолжат его работу, потребляя заряд батареи. Особенно, если единственной целью приложения является предоставление обновлений местоположения. Конечно, вы всегда можете сделать и то, и другое.
- person PassKit; 23.05.2013
Я мог бы сделать оба? кто они такие ?
- person malinchhan; 23.05.2013
Я хочу найти способ, которым пользователь ничего не делает, но сервер должен обновлять местоположения, когда пользователь перемещает новое место!
- person malinchhan; 23.05.2013
Вы можете автоматизировать это только с помощью приложения, но пользователи могут не загружать ваше приложение, не разрешать обновления местоположения или не запускать его после перезагрузки, поэтому на самом деле нет надежного способа автоматического обновления пропуска. В обоих случаях я имел в виду, что вы можете иметь приложение, но также предлагать ссылку на обратной стороне пропуска, чтобы пользователь мог вручную обновлять свое местоположение, если он переезжает в новое место. Вы также можете реализовать третий вариант отправки обновления с новыми местоположениями всякий раз, когда используется пропуск.
- person PassKit; 23.05.2013
чтобы получить текущее местоположение по широте/долготе, могу ли я использовать php?
- person malinchhan; 23.05.2013
Приведенный выше код предполагает, что вы используете 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
Посмотрите на источник для этой страницы - он захватывает широту/долготу и заполняет форму.
- person PassKit; 23.05.2013
Что ты не понимаешь?
- person PassKit; 24.05.2013
где ваш скрипт для определения местоположения? У вас есть файл js и jquery с большим количеством кода.
- person malinchhan; 24.05.2013
Этот должен быть проще, не тестировался — он содержит тот же код, что и выше.
- person PassKit; 24.05.2013
Да я получил его ! это более легко понять! Спасибо !!
- person malinchhan; 24.05.2013
поэтому я должен использовать: ‹script src=ajax.aspnetcdn.com/ajax/jQuery/› ?
- person malinchhan; 24.05.2013
перед использованием: jquery-1.8.0.min.js
- person malinchhan; 24.05.2013
Не имеет значения, какая версия jQuery, jQuery 2.0.0 является последней версией — не работает с IE 6,7 и 8, но это не будет проблемой для клиентов iOS.
- person PassKit; 24.05.2013
но моя компания еще не приняла это решение, потому что пользователи не взаимодействуют с этим пропуском!
- person malinchhan; 24.05.2013
Я должен найти решение, которое сделает пользователя проще!
- person malinchhan; 24.05.2013
Я не уверен, что есть приложение, которое работает в рамках ограничений среды PassKit, если вы не добавите приложение, которое как бы побеждает весь смысл Passbook.
- person PassKit; 24.05.2013
что это значит ? Я должен сделать приложение, которое может связаться с сберегательной книжкой?
- person malinchhan; 24.05.2013
Чтобы иметь возможность обновить пропуск с новыми местоположениями, вам нужно знать местоположение пользователя и активировать push. Passbook не предоставляет информацию о местоположении обратно эмитенту Pass, а это означает, что вам нужно получить местоположение откуда-то еще. Это оставляет вам 3 варианта: 1. сопутствующее приложение, которое постоянно отслеживает местоположение и сообщает на ваш сервер всякий раз, когда происходят значительные изменения, чтобы вы могли отправить новый проход; 2. всякий раз, когда используется пропуск, взять местоположение сканирования и использовать его для отправки нового прохода с обновленными местоположениями; или 3. разрешить пользователю указать свое местоположение.
- person PassKit; 24.05.2013
да, я попробую 1 среди них! первый вариант интересен. какое приложение-компаньон делает? Не могли бы вы объяснить больше?
- person malinchhan; 24.05.2013
Я думал, это то, что вы создали? Сопутствующее приложение проверит, установлен ли пропуск, и узнает, какие местоположения были в пропуске. Если пользователь меняет местоположение, приложение может обнаружить изменение местоположения, а затем вызвать веб-службу, чтобы: инициировать push-уведомление для обновления прохода с новыми местоположениями; или автоматически извлеките пакет .pkpass из веб-службы и используйте метод replacePassWithPass платформы PassKit для замены прохода в Passbook пользователя.
- person PassKit; 24.05.2013
Для проверки текущей широты/долготы раньше, может ли он отображать широту/долготу напрямую, не щелкая в текстовом поле?
- person malinchhan; 24.05.2013
давайте продолжим обсуждение в чате
- person PassKit; 24.05.2013
Я хочу использовать его как метод, возвращая широту/долготу, поэтому я тестирую: ‹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
‹?php if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['currentlatlng'])){ $lat = $_POST['lat']; $long = $_POST['long']; эхо лат: '.$лат.'; эхо длинное: '.$long.'; } ?›
- person malinchhan; 24.05.2013
Вместо сериализации формы
$("#locationForm").serialize()
как насчет создания пользовательского словаря { "long" : a.coords.longitude, "lat" : a.coords.latitude, "serial" : "<?php echo $_GET['serial']; ?>"}
- person PassKit; 24.05.2013
Как использовать этот пользовательский словарь?
- person malinchhan; 27.05.2013
Этот словарь представляет то, что отправляется на ваш сервер. Вы сказали, что у вас были проблемы с незаполненными значениями полей, поэтому вместо сериализации и публикации содержимого формы вы можете попробовать опубликовать значения напрямую.
- person PassKit; 27.05.2013
Когда я тестирую ваш код, чтобы найти текущую широту/долготу, широта/долгота появляются, когда я нажимаю в texField. Итак, если я не нажму на нее, есть ли другие способы показать ее напрямую?
- person malinchhan; 27.05.2013
См. обновленный ответ. Добавление
.focus()
будет имитировать щелчок в текстовом поле для отображения значения.
- person PassKit; 27.05.2013