Соответствующий способ получить местоположение пользователя (также в убитом состоянии) для приложения «hyperlocal»

Требование. Я создаю гиперлокальное приложение, которое будет предоставлять предложения пользователю в зависимости от его местоположения. Когда в приложении я могу получить его текущее местоположение и показать предложения соответственно, но теперь мне нужно отправить push-уведомление пользователю в зависимости от его местоположения. Поэтому я хочу узнать местоположение пользователя и отправить предложения на основе его местоположения.

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

Я также прочитал о том, как отслеживать местоположение пользователя, но это не сработало для меня правильно. Я не получал более 5 обновлений в фоновом режиме.

Мой текущий код в viewDidLoad

 if (self.locationManager == nil) { self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; self.locationManager.delegate = self; self.locationManager.allowsBackgroundLocationUpdates = true; self.locationManager.pausesLocationUpdatesAutomatically = false; if ([CLLocationManager authorizationStatus] != AVAuthorizationStatusAuthorized) { [self.locationManager requestAlwaysAuthorization]; } } [self.locationManager startUpdatingLocation]; 

И мой метод делегата выглядит так:

 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { if (UIApplication.sharedApplication.applicationState == UIApplicationStateActive) { // Get updated data according to location } else { // Send location to server } } 

Возможности моих приложений И мой plist – введите описание изображения здесь введите описание изображения здесь

Пожалуйста, предложите подходящий способ, я могу жить с точностью около 1 км.

Другие подходы –

  1. Могу ли я получить местоположение пользователя в «Фоновый режим – Фоновая выборка»? fetchNewDataWithCompletionHandler:

  2. Могу ли я получить местоположение пользователя с помощью application:didReceiveRemoteNotification:fetchCompletionHandler: уведомления Silent Push application:didReceiveRemoteNotification:fetchCompletionHandler: ): Невозможно в соответствии с этим ответом

Итак, ваш вопрос в основном «Как я могу обойти специально разработанное пользователем взаимодействие с пользователем для людей, которые хотят закрыть приложение?» Ответ на этот вопрос: «Нет, если вы хотите оставаться в рамках правил для AppStore».

Слушайте, если пользователь решает прекратить действие вашего приложения (т. Е. Вытащить его из диспетчера задач), вся эта цель для вашего приложения прекратит делать что-либо . Apple разработала это, чтобы люди могли быстро отключить именно то поведение, которое вы, похоже, хотите реализовать. Я не совсем понимаю, почему вы хотели бы обойти это. Я согласен с тем, что это взаимодействие немного неясное (в конце концов, пользователи также могут разрешить / запретить право приложения получать обновления местоположения в фоновом режиме в приложении «Настройки»), но это определение iOS для взаимодействия.

Если вы правильно поняли, вам удалось правильно настроить режимы фонового местоположения, поэтому ваше приложение может получать обновления местоположения, даже если оно не находится на переднем плане (то есть в фоновом режиме или приостановлено, в последней ситуации iOS быстро просыпается, поэтому вы можете обрабатывать обновления местоположения и, например, отправлять локальное уведомление, чтобы информировать пользователя). Это так же хорошо, как и получается.

О, и не бойтесь перезагрузки устройства. Да, после перезагрузки ваше приложение технически не работает, но поскольку в последний раз пользователь явно не убивал его, iOS рассматривает его так, как будто он был в режиме приостановления, IIRC, поэтому вы все равно получите значительные обновления местоположения и сможете нормально реагировать , (В более общем плане люди часто, похоже, считают, что фактическое состояние процесса приложения отражает состояние приложения, как оно определено в документации, и / или то, что приложение показано в диспетчере задач, связано с этим. полностью верно.)


Измените комментарий после того, как вы спросите меня о фоновой выборке:

Извините, возможно, это было не совсем понятно. Я специально не ответил на этот вопрос, потому что после того, как пользователь намеренно уволил ваше приложение, вы не должны, как объяснено, «обманывать» свое намерение. Из-за этого молчание push-уведомлений не будет работать.

Я не знаю, будет ли фоновый выбор подавляться аналогичным образом (может быть, но я его не пробовал), но я думаю, что это тоже вам не поможет, даже если оно все еще работает (что я сомневаюсь , Apple, вероятно, будет трудно по этому поводу). Я также никогда не пытался (повторно) запускать обновления местоположения в этом методе, поэтому я не могу сказать, работает ли это даже (как только обработчик завершения называется системой, скорее всего, приостановит ваше приложение, по крайней мере, и я не уверен, что это «сбрасывает» «пользователь убил флаг приложения», который, по-видимому, использует система для принятия решения о том, какое приложение просыпается и доставляет обновления местоположения).

application:performFetchWithCompletionHandler: (поскольку он полностью вызван) будет вызываться ОС на основе эвристики, он пытается быть «умным» на этом. Поскольку метод предназначен для получения некоторых данных из бэкэнд, который не предоставляет push-уведомлений, времена, когда он вызывается вообще, могут быть сильно ограниченными, как объясняется в документации . Фактический механизм, который решает, когда вызов ОС является черным ящиком, и это азартная игра, чтобы попытаться обмануть ее при вызове, когда вам это нужно. Может быть очень вероятно, что это произойдет через несколько часов. Подумайте о следующем сценарии:

  • Ваше приложение отлично работает в режимах фонового местоположения (я правильно понял вас, что вы успешно его установили? См. Здесь и здесь )
  • Пользователь вручную убивает ваше приложение. Ради этого аргумента предположим, что система не перезапускает систему позже, чтобы дать возможность фоновой выборки
  • Так как в системе работают другие приложения, и на данный момент у пользователя есть только граничное соединение, ОС решает, что это неудачное время для инициирования фоновой выборки (я просто предполагаю, что эти факторы играют роль, поскольку говорят, что это черный ящик , но они кажутся мне разумными). Ваш пользователь ходит вокруг еще нескольких, обходя несколько мест, которые вас интересуют.
  • Через два часа пользователь уже находится в совершенно другой области, ваше приложение снова запускается ОС и получает application:performFetchWithCompletionHandler: call. Вы снова запускаете обновления местоположения (предположим, что даже работает, и система не сразу завершает работу приложения, т. Е. Даже после того, как фальшивое извлечение фона обеспечивает обновление местоположения в фоновом режиме). Вы пропустили несколько местоположений, но, тем не менее, приложение теперь обрабатывает новые. Вся ваша логика в основном перепутана, потому что вы не планировали, чтобы так много обновлений местоположения отсутствовали …
  • (Необязательно: через некоторое время ваш пользователь понимает, что ваше приложение, по-видимому, что-то делает, даже если оно его прекратило (например, они замечают утечку батареи). Они удалит ваше приложение и оставят одноразовый обзор …)
  • (Необязательно 2, худший случай: как только яблоко осознает, что можно повторно инициализировать обновления фонового местоположения после того, как пользователь убил приложение таким образом, они просто закрывают петлю в обновлении iOS, и ваше приложение возвращается туда, где мы начали. ..)

Для записи: я не защищаю какие-либо дизайнерские решения, сделанные яблоком, черт возьми, я знаю, что это запутывает, чтобы обернуть голову и как можно занять позицию «сохранить батарею и намерение пользователя при любых обстоятельствах», можно сделать одно для лучшее отслеживание фона. Я просто указываю, что они находятся под контролем здесь и пытаются ласкать вокруг каких-либо конкретных парадигм взаимодействия, которые они устанавливают на платформе, вероятно, не очень хорошая идея.

Что все сказано, я боюсь, что «пользователь прекратил приложение, теперь я не получаю никаких обновлений местоположения» – это просто то, с чем вам нужно жить. Почему это было бы проблемой для вас, если бы вы ничего не говорили о режимах фонового местоположения, которые вам не хватало? Единственный (сомнительный) сценарий, который я мог себе представить, – это своего рода приложение для трекера, возможно, данное на устройствах, раздаваемых сотрудникам службы доставки или что-то в этом роде. Если это так (и отложите в сторону этику за такими вещами, в некоторых странах, которые даже незаконны, заметьте …), я должен сказать, что iOS просто не является подходящей платформой для этого.

Привет, просто создайте UILocalNotification установив его с вашими данными и наиболее важным для уведомления, которое будет запущено при вводе Region Добавление свойства region см. В документах.

Надеюсь, поможет

  • Swift: левая кнопка SLKTextViewController не просматривается
  • Изменение размера содержимого UIScrollView
  • Как перевести эту цель c traitCollection в swift?
  • Менеджер CLLocation, как обновляться после определенного расстояния
  • Подклассификация UIButton и переопределение сенсорных событий - не работает
  • Как изменить цвет верхней границы UITabBar, создав программный код UIImage?
  • Как исправить узел в позиции с помощью SpriteKit
  • Дети UIViewControllers UITabBarController перекрывают строку состояния
  • Как представить пейзаж только ViewController с нижней части портфолио iPhone в swift?
  • как я могу подавить или обойти оповещение прокси
  • Невозможно загрузить NSData (contentOfFile: путь к файлу) из мобильной или симуляторной файловой системы, но она работает из файловой системы OS X
  • Interesting Posts

    Каковы самые низкие версии разработчиков iOS для создания приложения?

    карта не смогла показать мое местоположение

    Форматирование NSDate

    Как выйти из режима UITableViewCellEditingStyleDelete, когда пользователь редактирует его с помощью жестов

    Запись AVAudioRecorder AAC / m4a

    Завершение выполнения NSOperation вызывается дважды

    Не удается избавиться от ошибки Apple LLVM 5.0

    Звуковые сбои при воспроизведении буфера через AVAudioPlayerNode в iOS (Swift) * работают в симуляторе, но не на устройстве

    Почему мое приложение не возвращается к моему подробному представлению при его восстановлении?

    Настройка позволяет транслировать по-прежнему не посылает звук по эфиру

    iOS 8. window.location.href не работает с URL-схемой

    C # часть трассировки стека журнала сбоев iOS не имеет никакого смысла

    Есть ли опрятный способ сказать, был ли iPhone / iPad установлен пароль?

    Вызовите ExtensionDelegate для создания / обновления данных для Complication

    UINavigationItem Prompt Issue

    Давайте будем гением компьютера.