ios - UNLocationNotificationTrigger- 在模拟器中不工作

标签 ios notifications frameworks location

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

最佳答案

根据 Apple Documentation :

Apps must request access to location services and must have when-in-use permissions to use this class. To request permission to use location services, call the requestWhenInUseAuthorization() method of CLLocationManager before scheduling any location-based triggers.

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

因此,将此 key 添加到您的 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)")
           }
        }

    }
}
}

关于ios - UNLocationNotificationTrigger- 在模拟器中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40628095/

相关文章:

ios 搜索栏文本字段背景与设置颜色不正确

ios - UITableViewHeaderFooterView 的高度

ios - Swift 中的 EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

ios - 暂时禁用手势识别器滑动功能

android - SDK 中的 Android 服务问题 >= 26

ios - iOS 上 MacOS 核心服务的编译错误

php - laravel Eloquent 关系不起作用

用于通知的 Android 自定义关闭按钮

android - Activity 未被重用

css - 如何使用 Bulma 更改网站的背景?