当应用的“位置”和“后台应用刷新”权限发生变化时,在后台收到通知
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 的位置会发生变化