Локальное уведомление не отображается при попадании в регион

Я работаю над простым приложением To-Do, которое использует функцию IOS 8 CLRegion поддержка в UILocalNotification,

Вот код, который я использую для планирования локальных уведомлений:

    var schedule = false
    let notification = UILocalNotification()

    /// Schedlue with date
    if let reminder = self.dateReminderInfo {
        schedule = true
        notification.fireDate = reminder.fireDate
        notification.repeatInterval = reminder.repeatInterval
        notification.alertBody = self.title
    }

    /// Schedule with location
    if let reminder = self.locationReminderInfo {
        schedule = true
        let region = CLCircularRegion(circularRegionWithCenter: reminder.place.coordinate, radius: CLLocationDistance(reminder.distance), identifier: taskObjectID)
        region.notifyOnEntry = reminder.onArrive
        region.notifyOnExit = reminder.onArrive
        notification.region = region
        notification.regionTriggersOnce = false
    }

    /// Schedule
    if schedule {
        notification.userInfo = ["objectID": taskObjectID]
        UIApplication.sharedApplication().scheduleLocalNotification(notification)
    }

Планирование с даты работ. Я планирую уведомление, выход из приложения и в нужное время уведомление отображается на экране, отлично. Проблема в том, что я планирую уведомление с указанием местоположения. Я передаю координаты и радиус в метрах (например, 100 метров). Приложение не отображает ничего. Я тестировал его вне дома, устанавливая точку на расстоянии 1 км и добираясь до нее. Уведомление не отображается. Я также играл с симулятором и менял местоположение с доступного на другое, рядом с моим местом и обратно. Уведомление не отображается. В чем проблема?

В AppDelegate я регистрируюсь для уведомлений:

    application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Alert | UIUserNotificationType.Badge, categories: nil))

Вот код службы определения местоположения.

func startLocationService() {

    self.locationManager = CLLocationManager()
    self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest

    let status = CLLocationManager.authorizationStatus()
    if status == CLAuthorizationStatus.AuthorizedWhenInUse || status == CLAuthorizationStatus.Denied {
        let title = (status == CLAuthorizationStatus.Denied) ? "Location services are off" : "Background location is not enabled"
        let message = "To use background location you must turn on 'Always' in the Location Services Settings"

        let alertController = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)

        /// Settings
        alertController.addAction(UIAlertAction.normalAction("Settings", handler: { _ in
            UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!)
            return
        }))

        /// Cancel
        alertController.addAction(UIAlertAction.cancelAction(String.cancelString(), handler: nil))

        self.presentViewController(alertController, animated: true, completion: nil)
    } else if status == CLAuthorizationStatus.NotDetermined {
        /// nothing
    }

    self.locationManager.requestAlwaysAuthorization()
    self.locationManager.requestWhenInUseAuthorization()

    self.locationManager.startUpdatingLocation()
}

CLLocationManager работает, потому что у меня есть метод делегата, который вызывается очень часто.

/// Mark: CLLocationManagerDelegate
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
    if let location = locations.first as? CLLocation {
        self.navigationItem.title = "\(location.coordinate.latitude)" + " " + "\(location.coordinate.longitude)"
        println(self.navigationItem.title)
    }
}

Я пытаюсь второй день решить проблему и не могу найти хорошее решение, как отображать локальное уведомление, когда пользователь появляется на месте или покидает место. Я не знаю, используя UILocalNotificationregion свойство подходит для этого решения, или, может быть, мне следует создать механизм, который будет искать места, которые я сохранил в приложении, и проверять каждый раз, когда местоположение меняется. Любые комментарии к этой теме тоже приветствуются;)

Заранее спасибо.

2 ответа

Я вижу, что вы не регистрируетесь для уведомлений

let settings = UIUserNotificationSettings(forTypes: messagesType, категории: категории) application.registerUserNotificationSettings(настройки)

Вы можете найти больше информации здесь iOS 8 Уведомления в Swift и здесь CoreLocation и мониторинг региона

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

Поэтому, если я установлю регион для небольшого города в Дании и переместу свое местоположение на 1 км, и обратно, он не сработает. Однако, если я установлю регион для того же небольшого города в Дании и перенесу свое местоположение в Лондон и обратно, то это сработает.

Так для меня это выглядит как параметр радиуса как-то игнорируется? Я пробовал с радиусом на 250,0, 100,0, 10,0, 0,0001, и это никак не повлияло.

Может ли это вдохновить кого-то еще на то, что проблема может быть и как ее решить?

Другие вопросы по тегам