问题出现情景:项目中需要使用百度地图的单次定位,但使用单次定位需要开启项目的Capabilities - Background Modes - Location updates后台定位模式。开启此选项App审核会被拒,需要说明后台使用定位的原因;若不开启,那么百度地图获取单次定位的
requestLocationWithReGeocode:NO withNetworkState:NO completionBlock:^(BMKLocation * _Nullable location, BMKLocationNetworkState state, NSError * _Nullable error)
这个方法不会走block回调,并且报出上面的断言,还有可能会出现crash。
解决方法:在项目中创建CLLocationManager的分类,并引入到.pch中
分类代码:
#import "CLLocationManager+ZHExtension.h"
#import <objc/runtime.h>
@implementation CLLocationManager (ZHExtension)
+ (void)load {
if ([UIDevice currentDevice].systemVersion.floatValue >= 9.0) {
method_exchangeImplementations(class_getInstanceMethod(self.class, NSSelectorFromString(@"setAllowsBackgroundLocationUpdates:")), class_getInstanceMethod(self.class, @selector(swizzledSetAllowsBackgroundLocationUpdates:)));
}
}
- (void)swizzledSetAllowsBackgroundLocationUpdates:(BOOL)allow {
if (allow) {
NSArray *backgroundModes = [[NSBundle mainBundle].infoDictionary objectForKey:@"UIBackgroundModes"];
if( backgroundModes && [backgroundModes containsObject:@"location"]) {
[self swizzledSetAllowsBackgroundLocationUpdates:allow];
} else {
NSLog(@"APP想设置后台定位,但APP的info.plist里并没有申请后台定位");
}
} else {
[self swizzledSetAllowsBackgroundLocationUpdates:allow];
}
}
@end
添加这个分类后即可解决上面出现的问题。
原文链接
网友评论