iOS开发 *** Assertion failure in -[CLLocationManager setAllowsBackgroundLocationUpdates:], /BuildRo......

问题出现情景:项目中需要使用百度地图的单次定位,但使用单次定位需要开启项目的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

添加这个分类后即可解决上面出现的问题。
原文链接

猜你喜欢

转载自blog.csdn.net/weixin_34292959/article/details/87506840