从 UIAlertController 以编程方式打开蓝牙设置
Open Bluetooth settings programmatically from UIAlertController
如标题所示,问题是如何从我的应用程序以编程方式打开蓝牙设置?
我检查了 Whosebug 上的所有答案,甚至没有一个在 iOS 11 上工作正常。所有这些都是低于 11 的旧答案,或者没有答案。我所能做的就是将我转到常规设置或应用程序设置,但我希望用户直接转到蓝牙设置,这样他就可以打开它。
let alert = UIAlertController(title: "Bluetooth is off", message: "Please turn on your bluetooth", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Go to settings", style: UIAlertActionStyle.default, handler: { (action) in
switch action.style {
case .default:
let url = URL(string: "App-Prefs:root=Bluetooth") //for bluetooth setting
let app = UIApplication.shared
app.openURL(url!)
print("default")
case .cancel:
print("cancel")
case .destructive:
print("destrucive")
}
我试了很多,也没有结果:
UIApplication.shared.openURL(NSURL(string: "prefs:root=General&path=Bluetoth")! as URL)
或者:
let url = URL(string: "App-Prefs:root=Bluetooth")
以上均无效
您无法直接打开首选项,但如果您在创建 CBCentralManager
时包含值为 true
的 CBCentralManagerShowPowerAlertKey
,则 iOS 将提示用户如果蓝牙已关闭,请打开蓝牙。 iOS 显示的警报包括一个用于打开蓝牙设置的按钮。
因此,经过深入研究(我不敢相信这是不可能的)并尝试失败后,我可以为我的问题写一个简短的答案(摘要)。正如@maddy 所写,iOS 不支持 URL 启动任何直接设置的方案,仅支持常规设置(所有设置的列表)或应用程序设置(您的应用程序设置(您可以实施)/权限列表)。不幸的是,对于您的应用程序设置,您不能在那里添加任何 iOS 系统设置以便在那里轻松访问。可怜..
要转到常规设置,您可以使用:
let url = URL(string: "App-Prefs:root=General")
要转到 YouApp 设置,您可以使用:
let url = URL(string: UIApplicationOpenSettingsURLString)
当然记得打开那个URL:(是的,我知道你可以一行完成)
let app = UIApplication.shared
app.openURL(url!)
此外,如@Paulw11 所述,您可以直接通过 CBCentralManagerShowPowerAlertKey 选项打开蓝牙设置。因此,当您打开您的应用程序并实例化 CBCentralManager 时,内置的警报对话框将弹出,告诉您您需要 "turn on bluetooth to use accessories (peripherals) with your app",有 2 个按钮:设置(引导您进入蓝牙设置)和确定(关闭对话框)。不幸的是,这在实例化中央管理器时会出现,所以如果你想为你的整个应用程序(如单例等)保留中央管理器而不是你想要的那么好,因为它只会弹出一次。在其他情况下可能是这样..
现在! ios 蓝牙确实有问题。在 iOS 中,您可以通过两种方式打开 on/off 蓝牙:一种是从“设置”->“蓝牙”,第二种是从下到上滑动并 select 点击蓝牙图标。但。现在,当您通过第二种方式进行操作时,设置中的蓝牙仍然处于打开状态!因此,即使您打开应用程序并弹出蓝牙警报对话框,然后您 select 转到设置,您也会看到蓝牙已打开。
在iOS..
这里真的很奇怪
所以,简而言之,我的问题的答案是:
您无法通过自己的 AlertDialog 以编程方式打开蓝牙设置。您可以使用内置的 iOS CBCentralManager AlertDialog。
希望我节省了您一些时间。
opening URL For iOS 10+(当我在项目中更改版本时,我不得不更改它):
app.open(url!, options: [:], completionHandler: nil)
蓝牙异常行为 - 更新
正如我上面提到的,您可以通过两种方式切换蓝牙 on/off,这会导致奇怪的行为。现在我应该让自己在这一点上变得更好:这对我来说是一种奇怪的行为(我以前习惯于 Android)。现在我知道为什么这种行为是这样的了。这是因为,通过我描述的第二种方式(从上往下滑动并按下蓝牙图标)打开蓝牙的方式不是关闭蓝牙连接,而是关闭允许连接(蓝牙仍然打开,但无法连接设备(这在应用程序中被视为蓝牙将被关闭!!)。但是你仍然无法以编程方式管理它。我仍然认为它应该由苹果改进。
警告
正如@user3620372 所写,使用 prefs url 会导致应用被拒绝:
Your app uses the "prefs:root=" non-public URL scheme, which is a
private entity. The use of non-public APIs is not permitted on the App
Store because it can lead to a poor user experience should these APIs
change.
您可以使用这些扩展:
extension UIApplication {
static func openAppSettings(completion: @escaping (_ isSuccess: Bool) -> ()) {
guard let url = URL(string: UIApplication.openSettingsURLString) else {
completion(false)
return
}
let app = UIApplication.shared
app.open(url) { isSuccess in
completion(isSuccess)
}
}
static func openPhoneSettings(completion: @escaping (_ isSuccess: Bool) -> ()) {
guard let url = URL(string: "App-Prefs:root=General") else {
completion(false)
return
}
let app = UIApplication.shared
app.open(url) { isSuccess in
completion(isSuccess)
}
}
}
你可以这样使用它:
UIApplication.openPhoneSettings { isSuccess in
if isSuccess == false {
//Display error
}
}
或者:
UIApplication.openAppSettings { isSuccess in
if isSuccess == false {
//Display error
}
}
_ = CBCentralManager(delegate: nil, queue: nil, options: [CBCentralManagerOptionShowPowerAlertKey:true])
CBCentralManager是Apple支持的CoreBluetooth的class,你可以将这段代码放在点击动作调用的方法中,
然后它会弹出一个警告视图,要求您选择一个选项,如果您选择设置,它将转到 iPhone 的蓝牙设置页面。因为你不使用它,所以它可能会在执行后释放。但是你必须关闭蓝牙设置,否则它不会弹出警报视图
let button = UIButton(type: .custom)
button.setTitle("check bluetooth state", for: .normal)
button.addTarget(self, action: #selector(didClick), for: .touchUpInside)
@objc func didClick(){
_ = CBCentralManager(delegate: nil, queue: nil, options: [CBCentralManagerOptionShowPowerAlertKey:true])
}
如标题所示,问题是如何从我的应用程序以编程方式打开蓝牙设置? 我检查了 Whosebug 上的所有答案,甚至没有一个在 iOS 11 上工作正常。所有这些都是低于 11 的旧答案,或者没有答案。我所能做的就是将我转到常规设置或应用程序设置,但我希望用户直接转到蓝牙设置,这样他就可以打开它。
let alert = UIAlertController(title: "Bluetooth is off", message: "Please turn on your bluetooth", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Go to settings", style: UIAlertActionStyle.default, handler: { (action) in
switch action.style {
case .default:
let url = URL(string: "App-Prefs:root=Bluetooth") //for bluetooth setting
let app = UIApplication.shared
app.openURL(url!)
print("default")
case .cancel:
print("cancel")
case .destructive:
print("destrucive")
}
我试了很多,也没有结果:
UIApplication.shared.openURL(NSURL(string: "prefs:root=General&path=Bluetoth")! as URL)
或者:
let url = URL(string: "App-Prefs:root=Bluetooth")
以上均无效
您无法直接打开首选项,但如果您在创建 CBCentralManager
时包含值为 true
的 CBCentralManagerShowPowerAlertKey
,则 iOS 将提示用户如果蓝牙已关闭,请打开蓝牙。 iOS 显示的警报包括一个用于打开蓝牙设置的按钮。
因此,经过深入研究(我不敢相信这是不可能的)并尝试失败后,我可以为我的问题写一个简短的答案(摘要)。正如@maddy 所写,iOS 不支持 URL 启动任何直接设置的方案,仅支持常规设置(所有设置的列表)或应用程序设置(您的应用程序设置(您可以实施)/权限列表)。不幸的是,对于您的应用程序设置,您不能在那里添加任何 iOS 系统设置以便在那里轻松访问。可怜..
要转到常规设置,您可以使用:
let url = URL(string: "App-Prefs:root=General")
要转到 YouApp 设置,您可以使用:
let url = URL(string: UIApplicationOpenSettingsURLString)
当然记得打开那个URL:(是的,我知道你可以一行完成)
let app = UIApplication.shared
app.openURL(url!)
此外,如@Paulw11 所述,您可以直接通过 CBCentralManagerShowPowerAlertKey 选项打开蓝牙设置。因此,当您打开您的应用程序并实例化 CBCentralManager 时,内置的警报对话框将弹出,告诉您您需要 "turn on bluetooth to use accessories (peripherals) with your app",有 2 个按钮:设置(引导您进入蓝牙设置)和确定(关闭对话框)。不幸的是,这在实例化中央管理器时会出现,所以如果你想为你的整个应用程序(如单例等)保留中央管理器而不是你想要的那么好,因为它只会弹出一次。在其他情况下可能是这样..
现在! ios 蓝牙确实有问题。在 iOS 中,您可以通过两种方式打开 on/off 蓝牙:一种是从“设置”->“蓝牙”,第二种是从下到上滑动并 select 点击蓝牙图标。但。现在,当您通过第二种方式进行操作时,设置中的蓝牙仍然处于打开状态!因此,即使您打开应用程序并弹出蓝牙警报对话框,然后您 select 转到设置,您也会看到蓝牙已打开。
在iOS..
这里真的很奇怪所以,简而言之,我的问题的答案是:
您无法通过自己的 AlertDialog 以编程方式打开蓝牙设置。您可以使用内置的 iOS CBCentralManager AlertDialog。
希望我节省了您一些时间。
opening URL For iOS 10+(当我在项目中更改版本时,我不得不更改它):
app.open(url!, options: [:], completionHandler: nil)
蓝牙异常行为 - 更新
正如我上面提到的,您可以通过两种方式切换蓝牙 on/off,这会导致奇怪的行为。现在我应该让自己在这一点上变得更好:这对我来说是一种奇怪的行为(我以前习惯于 Android)。现在我知道为什么这种行为是这样的了。这是因为,通过我描述的第二种方式(从上往下滑动并按下蓝牙图标)打开蓝牙的方式不是关闭蓝牙连接,而是关闭允许连接(蓝牙仍然打开,但无法连接设备(这在应用程序中被视为蓝牙将被关闭!!)。但是你仍然无法以编程方式管理它。我仍然认为它应该由苹果改进。
警告
正如@user3620372 所写,使用 prefs url 会导致应用被拒绝:
Your app uses the "prefs:root=" non-public URL scheme, which is a private entity. The use of non-public APIs is not permitted on the App Store because it can lead to a poor user experience should these APIs change.
您可以使用这些扩展:
extension UIApplication {
static func openAppSettings(completion: @escaping (_ isSuccess: Bool) -> ()) {
guard let url = URL(string: UIApplication.openSettingsURLString) else {
completion(false)
return
}
let app = UIApplication.shared
app.open(url) { isSuccess in
completion(isSuccess)
}
}
static func openPhoneSettings(completion: @escaping (_ isSuccess: Bool) -> ()) {
guard let url = URL(string: "App-Prefs:root=General") else {
completion(false)
return
}
let app = UIApplication.shared
app.open(url) { isSuccess in
completion(isSuccess)
}
}
}
你可以这样使用它:
UIApplication.openPhoneSettings { isSuccess in
if isSuccess == false {
//Display error
}
}
或者:
UIApplication.openAppSettings { isSuccess in
if isSuccess == false {
//Display error
}
}
_ = CBCentralManager(delegate: nil, queue: nil, options: [CBCentralManagerOptionShowPowerAlertKey:true])
CBCentralManager是Apple支持的CoreBluetooth的class,你可以将这段代码放在点击动作调用的方法中,
然后它会弹出一个警告视图,要求您选择一个选项,如果您选择设置,它将转到 iPhone 的蓝牙设置页面。因为你不使用它,所以它可能会在执行后释放。但是你必须关闭蓝牙设置,否则它不会弹出警报视图
let button = UIButton(type: .custom)
button.setTitle("check bluetooth state", for: .normal)
button.addTarget(self, action: #selector(didClick), for: .touchUpInside)
@objc func didClick(){
_ = CBCentralManager(delegate: nil, queue: nil, options: [CBCentralManagerOptionShowPowerAlertKey:true])
}