击中区域时本地通知不会显示

时间:2015-02-10 20:17:04

标签: ios swift core-location uilocalnotification clregion

我正在使用简单的待办事项应用程序,该应用程序在CLRegion中使用UILocalNotification支持的IOS 8功能。

以下是我用于安排本地通知的代码:

    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米)。该应用程序不显示任何内容。我正在测试它离开家,将距离设置为1km并到达那里。没有显示通知。我也在玩模拟器,并从那里可用的位置改变到我的地方和后面附近的自定义位置。没有显示通知。问题在哪里?

在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)
    }
}

我正在尝试第二天解决问题,并且无法找到一个好的解决方案,当用户出现在该地点或离开该地点时如何显示本地通知。我不知道使用UILocalNotification region属性是否适用于此解决方案,或者我应该创建机制来搜索我已在应用中保存的位置并检查每个时间位置的变化。对此主题的任何评论也会受到赞赏;)

提前谢谢。

2 个答案:

答案 0 :(得分:1)

我发现你没有注册通知

let settings = UIUserNotificationSettings(forTypes:notificationType,categories:categories)    application.registerUserNotificationSettings(设置)

您可以在此处iOS 8 Notifications in Swift和此处CoreLocation and region Monitoring

找到更多信息

答案 1 :(得分:0)

我遇到了同样的问题,但是我找到了触发通知的方法。 看起来它没有响应radius参数。我触发通知的方式是模拟离我所在地区很远的位置。

因此,如果我为丹麦的一个小城市设置区域,并将我的位置移动1公里,然后再返回,则不会触发。 但是,如果我为丹麦的同一个小城市设置区域,并将我的位置移至伦敦并再次返回,则然后将触发。

所以对我而言,看起来半径参数有点不合适?我尝试使用半径250.0,100.0,10.0,0.0001,它根本没有任何影响。

这可能会激发别人对问题的解决方法以及如何解决问题吗?