2016-08-22 4 views
14

Я пытаюсь получить некоторые времена прибытия для автобусов, когда пользователь подходит к остановке, я проверил, чтобы обеспечить правильное выполнение регистров, отправив базовое локальное уведомление, и я также проверил мой веб-сервис, чтобы убедиться, что он работает правильно.Локальные уведомления, основанные на динамическом местоположении Swift iOS

Однако мне сложно получить информацию, а затем отправить уведомление.

Вот мой код:

var bgTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier() 

    bgTask = UIApplication.shared().beginBackgroundTask { 

     self.webService?.getStopEstimates(routeStopIds: stopRouteIdSet, routeNameDict: routeNameDict, completion: { (result) in 

      if result == "error" { 
       return 
      } 

      let notification = UILocalNotification() 
      notification.fireDate = Date(timeIntervalSinceNow: 1) 
      notification.alertTitle = region.identifier + " Stop Details" 
      notification.alertBody = result 
      notification.soundName = UILocalNotificationDefaultSoundName 
      UIApplication.shared().scheduleLocalNotification(notification) 
     }) 

     UIApplication.shared().endBackgroundTask(bgTask) 
    } 

Любой один, почему это не может быть отправка? Я включил службы фоновой выборки и определения местоположения. Это находится внутри didEnterRegion

+1

Учитывая, что вы Используя Swift 3, вы знаете, что существует новая структура UserNotifications. – tktsubota

+0

Может быть, вы забыли зарегистрироваться для уведомления в приложении фонда (_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?). Регистрационный код: let notificationSettings = UIUserNotificationSettings (типы: .alert, categories: nil) application.registerUserNotificationSettings (notificationSettings) – Ramis

+0

Как вы тестируете? В Xcode? Добавьте несколько журналов, чтобы проверить, был ли отправлен/получен запрос. Любые ошибки? – Wain

ответ

3

check this example on GitHub потому что я думаю, что ваша проблема здесь в том, как вы обрабатываете фоновое задание. Если вызов веб-службы занял слишком много времени, фоновая задача будет признана недействительной. Я не знаю, насколько хорошо вы знаете ObjC, но в приведенном выше примере вы найдете для него класс управления BackgroundTaskManager.

Вещи, которые вы должны убедиться, являются:

  1. фона Fetch в целевых параметров (режимы Фоновые сечение) ON.
  2. Вы запросили и получили разрешение «всегда» (в plist)
  3. Обновления местоположения в настройках цели (раздел «Режимы фона») включены.
  4. Зарегистрировано для уведомлений пользователей в appDidFinishLaunching в делетете приложения.
  5. Обновление устаревших фоновых задач, если обслуживание заняло слишком много времени.

В случае вызова startUpdatingLocation в то время как ваше приложение работает в фоновом режиме, CoreLocation все еще отвечает, начиная с обновлением местоположения для вашего приложения, но система не будет больше держать утверждение для вас, и вашего приложения будет приостановлено как только разрешено время в фоновом режиме. Это время (в настоящее время) составляет 10 секунд. Но на самом деле ваше приложение теперь приостановлено и больше не может получать обновления. Существует способ продлить эту продолжительность до (в настоящее время) до 3 минут, используя beginBackgroundTaskWithExpirationHandler:read more about it in Apple's CoreLocation Documentation

Будет ли это достаточно продолжительное время, будет зависеть от вашего приложения.

Для вашего случая использования значительная услуга «Изменение местоположения» довольно эффективна. Вы можете начать обновление местоположения, когда ваше приложение находится на переднем плане, и отложите обновления местоположения, пока ваше приложение находится в фоновом режиме. Вы можете also read Apple's documentation about Significant Location Change

5

Я сделал то же самое (когда пользователь подходит к магазину со скидкой, он/она будет уведомлен).

Прежде всего, я бы предложил вам загрузить все данные и сохранить их в Core Data или SQLite, если это опция.

Второй взгляд на значительное изменение местоположения here. Он обновит ваше местоположение в фоновом режиме каждые 500 метров, если вы двигаетесь, и это сэкономит много батареи, а не didUpdateLocation.

В третьих случаях, после использования SLC, при каждом вызове извлеките из ваших основных данных или SQLite 20 ближайших местоположений вашего текущего местоположения и добавьте их для мониторинга (используйте Haversine, чтобы рассчитать все точки на расстоянии от вашего текущего местоположения, а затем получить 20 ближайших). Каждый раз, когда SCL называется обновлением, регионы, которые вы контролируете (если сохранение ваших данных в автономном режиме не является вариантом, я бы рекомендовал отправить запрос на ваш веб-сервис здесь. Идеальный сценарий заключается в том, что вы отправите свое местоположение в свой веб-сервис, и он ответит назад с ближайшими точками, затем добавьте их для мониторинга)

Когда имя didEnterRegion называется, убедитесь, что у вас загружены ваши данные, а затем создайте локальное уведомление.

Позвольте мне знать, если вам нужно больше информации

PS. Имейте в виду, что ваше приложение может быть остановлено (в фоновом режиме) системой, если потребляет много ресурсов. В этом случае вы должны инициализировать все, что нужно для вытягивать и показывать данные (сети запросы, Location менеджер и т.д.) Вы можете обнаружить, что App возобновлен из-за события местоположения в didFinisingLaunchingWithOptions AppDelegate в:

if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) {}