UNLocationNotificationTrigger - 不在模拟器中工作

Posted

技术标签:

【中文标题】UNLocationNotificationTrigger - 不在模拟器中工作【英文标题】:UNLocationNotificationTrigger- Not working in simulator 【发布时间】:2017-03-30 09:54:52 【问题描述】:

使用 ios 10 中提供的用户通知框架,我尝试在用户使用 UNLocationNotificationTrigger 输入特定地理位置时触发通知。 当我尝试通过模拟器通过模拟地理位置对其进行测试时,通知没有被触发,但位置管理器返回更新的地理位置。这应该在真实设备中测试而不是在模拟器中运行吗?

【问题讨论】:

我也无法在真实设备上获取通知。 :// 我可以在模拟器和设备上使用用户通知框架根据日期和时间触发通知。我还没有检查设备中基于位置的通知。 你解决了吗?如果没有,我可以帮你。 【参考方案1】:

根据Apple Documentation:

应用必须请求访问位置服务,并且必须具有使用时权限才能使用此类。要请求使用位置服务的权限,请在调度任何基于位置的触发器之前调用 CLLocationManager 的 requestWhenInUseAuthorization() 方法。

但是,对于我的模拟器/设备,“使用时”权限是不够的,必须将权限设置为“始终”。

因此,将此密钥添加到您的 pinfo.list

<key>NSLocationAlwaysUsageDescription</key>
<string>We use your location to warn you when there are adorable cats nearby</string>

然后激活位置。仅在您确定自己始终获得授权时才定义触发器,例如我在 didChangeAuthorizationStatus 中执行此操作:

class myClass : CLLocationManagerDelegate 

var locationManager: CLLocationManager() 

func init() 
   // Note: defining the location manager locally in this function won't work
   //    var locationManager: CLLocationManager() 
   // as it gets gargabe collected too early.

   locationManager.delegate = self
   locationManager.requestAlwaysAuthorization()
   UNUserNotificationCenter.current().delegate = self
   UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) (accepted, error) in
   if !accepted 
         logger.info("Notification access denied.")
   



// MARK CLLocationManagerDelegate:
func locationManager(manager: CLLocationManager,
                     didChangeAuthorizationStatus status: CLAuthorizationStatus)

    if status == .AuthorizedAlways  

        let region = CLCircularRegion(center:    CLLocationCoordinate2D(latitude: 61.446812, longitude: 23.859914),
                  radius: 1000, identifier: "test")
        logger.info("Notification will trigger at \(region)")
        region.notifyOnEntry = true
        region.notifyOnExit = false

        let trigger = UNLocationNotificationTrigger(region: region, repeats:true)

        let content = UNMutableNotificationContent()
        content.title = "Oh Dear !"
        content.body = "It's working!"
        content.sound = UNNotificationSound.default()

        let request = UNNotificationRequest(identifier: "textNotification", content: content, trigger: trigger)

        UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
        UNUserNotificationCenter.current().add(request) (error) in
           if let error = error 
               print("Uh oh! We had an error: \(error)")
           
        

    


【讨论】:

以上是关于UNLocationNotificationTrigger - 不在模拟器中工作的主要内容,如果未能解决你的问题,请参考以下文章