在我们某个新来的同学发现一个其自己手机出现定位权限弹窗频繁出现的问题,iPhone 7 Plus, iOS 13.3.1,很是奇怪。
定位权限弹窗一、问题
主要是频繁弹出,很是奇怪的,于是看了代码发现原因。。。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appEnterForgroundNoti)
name:UIApplicationDidBecomeActiveNotification
object:nil];
- (void)appEnterForgroundNoti {
[self checkLocationAuth];
}
case kCLAuthorizationStatusNotDetermined:
[[CLLocationManager new] requestAlwaysAuthorization];
break;
说白了就是监听了 UIApplicationDidBecomeActiveNotification 的通知不断去检验定位权限的,然后导致的
由于此处是 [CLLocationManager new]
没有实际上没有持有 CLLocationManager
就直接被销毁了,同时每次弹出这个定位权限又触发了 UIApplicationDidBecomeActiveNotification
的通知啦,所以循环在不断调用了
二、解决
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appEnterForgroundNoti)
name:UIApplicationWillEnterForegroundNotification
object:nil];
case kCLAuthorizationStatusNotDetermined:
[self.locationManger requestAlwaysAuthorization];
break;
持有下 CLLocationManager
, 另外更改下通知UIApplicationWillEnterForegroundNotification
。
三、注意点
-
UIApplicationDidBecomeActiveNotification
触发时机- 在App中触发系统弹窗(如定位弹窗) - 再回到App 时
- App启动
- 重新进入前台
-
UIApplicationWillEnterForegroundNotification
触发时机- 只有重新进入前台
注意的是系统弹窗会触发 UIApplicationDidBecomeActiveNotification
的点,之前没有注意到这个点。
PS:至于其他机型系统为啥没出现频繁的问题呢,猜测是由于
[CLLocationManager new]
的被释放时机不同导致的,具体的原因暂时未知,持续观察中。
网友评论