【发布时间】: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,但我需要知道权限已在发生时立即更改。我希望这是可能的。
标签: ios cllocationmanager background-process nsnotificationcenter user-permissions