当应用的“位置”和“后台应用刷新”权限发生变化时,在后台收到通知

Posted

技术标签:

【中文标题】当应用的“位置”和“后台应用刷新”权限发生变化时,在后台收到通知【英文标题】:Get notified in the background when app's "location" and "background app refresh" permissions change 【发布时间】:2015-04-24 21:21:04 【问题描述】:

有谁知道当应用权限发生变化时,应用是否可以在后台得到系统通知?我对在用户更改“位置”权限和“后台应用刷新”权限时收到通知特别感兴趣。

到目前为止,我已经研究了这个回调方法:

locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus)

但是,应用不会在后台收到通知。

我还尝试为此通知添加观察者:

UIApplicationBackgroundRefreshStatusDidChangeNotification

但我也无法让它工作。

这是我的代码:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool         
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "checkBackgroundPermission", name: UIApplicationBackgroundRefreshStatusDidChangeNotification, object: nil)

    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.pausesLocationUpdatesAutomatically = false

    if(locationManager.respondsToSelector("requestAlwaysAuthorization")) 
        locationManager.requestAlwaysAuthorization()
    

    if launchOptions?[UIApplicationLaunchOptionsLocationKey] != nil 
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.pausesLocationUpdatesAutomatically = false

        let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
        let uuidString = prefs.stringForKey("UUID") as String!
        let uuid : NSUUID? = NSUUID(UUIDString: uuidString as String)

        beaconRegionGeneral = CLBeaconRegion(proximityUUID: NSUUID(UUIDString: uuidString), identifier: "general")

        locationManager.startRangingBeaconsInRegion(beaconRegionGeneral)
        setIsRanging(true)
    


    if(application.respondsToSelector("registerUserNotificationSettings:")) 
        application.registerUserNotificationSettings(
            UIUserNotificationSettings(
                forTypes: UIUserNotificationType.Alert | UIUserNotificationType.Sound,
                categories: nil
            )
        )
    

    return true


func checkBackgroundPermission() 
    sendLocalNotificationWithMessage("checkBackgroundPermission", playSound: false)
    println("checkBackgroundPermission")


func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) 
    sendLocalNotificationWithMessage("didChangeAuthorizationStatus", playSound: true)
    println("didChangeAuthorizationStatus")

【问题讨论】:

当权限改变时你的应用会被杀掉。每次启动应用时检查权限。 如果应用程序在权限更改时被杀死,有没有办法利用它?比如在 applicationWillTerminate(application: UIApplication) 方法中检查权限? 我很确定在调用applicationWillTerminate 时权限尚未更改。应用重新启动时会看到新设置。 当应用程序被杀死时,您无法控制代码。您所能做的就是在下次启动应用程序时检查 didFinishLaunchingWithOptions 中的状态。但我确信,当您更改应用的位置权限时,应用不会崩溃。 感谢您的帮助,rmaddy,但我需要知道权限已在发生时立即更改。我希望这是可能的。 【参考方案1】:

您可以使用下面的委托方法(来自 CLLocationManagerDelegate 协议)来获取通知。

 optional func locationManager(_ manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus)

【讨论】:

以上是关于当应用的“位置”和“后台应用刷新”权限发生变化时,在后台收到通知的主要内容,如果未能解决你的问题,请参考以下文章

当位置发生变化并且我的应用程序处于后台时,我可以获得本地通知吗?

当 ipad 中的方向发生两次变化时,UIScrollView 的位置会发生变化

当 UIView 在窗口中的位置发生变化时是不是有通知?

内容观察者实现短信监听

在 iOs 中调用按钮 setBackgroundImage 后 UIImageView 位置发生变化

如何防止在圆圈中心发生变化时创建新圆圈。 (谷歌地图 API)