1、自定义弹窗的初衷?
由于在 iOS11下 控制中心的蓝牙关闭,并未完全关闭系统的蓝牙权限。
这会引起引起蓝牙的授权弹窗是否显示的问题。
(1)当设置的蓝牙权限关闭时,控制中心的蓝牙将关闭,此时app请求授权会弹窗提示;
(2)当设置的蓝牙权限打开,但控制中的蓝牙是关闭的,此时app请求到的蓝牙开启状态是 off , 即与设置的蓝牙权限关闭时的状态一致,但是系统不会弹授权弹窗提示。
这时需要开发者自己处理弹窗提示用户开启蓝牙。
但是苹果并没有对设置中蓝牙的关闭和控制中心的蓝牙关闭状态作区分,
所以若使用系统的默认弹窗将导致第二种情况无法告知用户授权蓝牙,体验不佳。
若直接在 off 状态下使用自己的弹框告知用户,不稍作处理, 则会导致第一种情况下有两个弹窗,体验不佳。
所以,以上为自定义弹窗的初衷,让弹窗提示统一,给用户良好的交互体验。
蓝牙授权位置如下图:
2、解决授权重复弹窗、不弹窗的问题.
(1) 蓝牙授权需在info.plist 中添加权限访问 【 Privacy - Bluetooth Peripheral Usage Description】-------- XX app想访问您的蓝牙 (备注:虽然不适用系统的,但是授权还是要加滴!)
(2)应用中添加framework : 【CoreBluetooth.framework】,在使用的文件中【#import
(3)配置系统授权弹窗提示:
属性:
@property (nonatomic, strong) CBCentralManager *manager;
添加代理监听:
NSDictionary *options = @{CBCentralManagerOptionShowPowerAlertKey:@NO};//不弹窗(配置)
self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:options];
实现代理方法:
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
NSString *strMessage = @"";
NSString *buttonTitle = nil;
switch (central.state) {
case CBManagerStatePoweredOn: {
NSLog(@"蓝牙开启且可用");
return;
}
break;
case CBManagerStateUnknown: {
strMessage = @"手机没有识别到蓝牙,请检查手机。";
buttonTitle = @"前往设置";
}
break;
case CBManagerStateResetting: {
strMessage = @"手机蓝牙已断开连接,重置中...";
buttonTitle = @"前往设置";
}
break;
case CBManagerStateUnsupported: {
strMessage = @"手机不支持蓝牙功能,请更换手机。";
}
break;
case CBManagerStatePoweredOff: {
strMessage = @"手机蓝牙功能关闭,请前往设置打开蓝牙及控制中心打开蓝牙。";
buttonTitle = @"前往设置";
}
break;
case CBManagerStateUnauthorized: {
strMessage = @"手机蓝牙功能没有权限,请前往设置。";
buttonTitle = @"前往设置";
}
break;
default: { }
break;
}
//通知没有打开蓝牙的自定义提示弹窗(弹窗代码自行实现)
[self __broadAlertMessage:strMessage buttonTitle:buttonTitle];
}
//当使用完蓝牙时记得关闭蓝牙监听,减少资源消耗:
self.manager.delegate = nil;
self.manager = nil;
蓝牙设置页面跳转
原代码:
NSURL *url = [NSURL URLWithString:@"App-Prefs:root=Bluetooth"];
if (@available(iOS 10.0, *)) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
[[UIApplication sharedApplication] openURL:url];
}
避免App Store审核被拒如下转换:------------------
//将字符串转换为16进制
NSData *encryptString = [[NSData alloc] initWithBytes:(unsigned char []){0x41, 0x70, 0x70, 0x2d, 0x50, 0x72, 0x65, 0x66, 0x73, 0x3a, 0x72, 0x6f, 0x6f, 0x74, 0x3d, 0x42, 0x6c, 0x75, 0x65, 0x74, 0x6f, 0x6f, 0x74, 0x68} length:24];
NSString *string = [[NSString alloc] initWithData:encryptString encoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:string];
if (@available(iOS 10.0, *)) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
[[UIApplication sharedApplication] openURL:url];
}
总结
通过以上的配置,开发者自己自定义自已想要的弹窗提示。