从UIAlertController以编程方式打开蓝牙设置

时间:2017-12-19 17:08:17

标签: ios swift bluetooth programmatically

正如标题所述,问题是如何从我的应用程序以编程方式打开蓝牙设置? 我检查了stackoverflow上的所有答案,甚至没有一个在iOS 11中工作正常。所有这些都是旧的答案是低于11或没有答案。我所能做的只是带我进入常规设置或应用程序设置,但我希望用户可以直接进入蓝牙设置,这样他就可以打开它。

<script src="stateEvents.js">
var myApp = angular.module('myApp', ['ui.router', 'ui.router.state.events']);

我尝试了更多,也没有结果:

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)

以上都不起作用

4 个答案:

答案 0 :(得分:12)

因此经过一些深入的研究(我无法相信它是不可能的)并尝试失败,我可以为我的问题写一个简短的答案(摘要)。正如@maddy所写,iOS不支持URL方案来启动任何直接设置,仅支持常规设置(所有设置列表),或支持应用程序设置(您的应用程序设置(可以实现)/权限列表) 。不幸的是,对于您的应用程序设置,您无法在那里添加任何iOS系统设置以便在那里轻松访问。差..

要转到常规设置,您可以使用:

let url = URL(string: "App-Prefs:root=General")

要转到您可以使用的YouApp设置:

let url = URL(string: UIApplicationOpenSettingsURLString)

当然记得打开那个网址:(是的,我知道你可以在一行中完成所有这些工作)

let app = UIApplication.shared
app.openURL(url!)

另外,正如@ Paulw11所提到的,您可以通过CBCentralManagerShowPowerAlertKey选项直接打开蓝牙设置。因此,当您打开应用程序并实例化CBCentralManager时,将弹出内置警报对话框,告诉您需要打开蓝牙以使用配件(外围设备)与您的应用程序&#34;,使用2个按钮:设置(这导致你进入蓝牙设置)和确定(关闭对话框)。不幸的是,这会在实例化中央管理器时出现,所以如果你想为你的整个应用程序(如单身等)保留中央管理器,而不是你想要的那么好,因为它只会弹出一次。在其他情况下可能是它..

现在! ios蓝牙有一些问题。在iOS中,您可以通过2种方式打开/关闭蓝牙:一种来自设置 - &gt;蓝牙,第二个是从下到上滑动并选择蓝牙图标。但。现在,当您通过第二种方式执行此操作时,“设置”中的蓝牙仍会打开!因此,即使您打开应用程序并弹出蓝牙警报对话框,并选择转到设置,您也会看到蓝牙已开启。

这在iOS上真的很奇怪..

因此,简而言之,我的问题的答案是:

您无法通过自己的AlertDialog以编程方式打开蓝牙设置。您可以使用内置的iOS CBCentralManager AlertDialog。

希望我节省了一些时间。


打开iOS 10 +的网址(当我在项目中更改版本时,我必须更改它):

app.open(url!, options: [:], completionHandler: nil)

蓝牙奇怪行为 - 更新

正如我上面提到的,你可以通过两种方式打开/关闭蓝牙,这会导致奇怪的行为。现在我应该让自己变得更好:这对我来说是一种奇怪的行为(我以前习惯了Android)。现在我知道为什么这种行为是这样的。这是因为,通过我描述的第二种方式(从顶部向下滑动并按下蓝牙图标)转动蓝牙的方式TURNS OFF NOT BLUTETOOTH CONNECTION,但它关闭允许连接(蓝牙仍然打开,但无法与设备连接(在应用程序中被视为蓝牙将被关闭!!)。但仍然无论如何你仍然无法以编程方式管理它。我仍然认为它应该由苹果改进。

警告

正如@ user3620372所写,使用prefs网址会导致应用拒绝:

  

您的应用使用&#34; prefs:root =&#34;非公共URL方案,这是一个   私人实体。应用程序不允许使用非公共API   存储是因为如果使用这些API会导致用户体验不佳   变化

答案 1 :(得分:1)

_ = CBCentralManager(delegate: nil, queue: nil, options: [CBCentralManagerOptionShowPowerAlertKey:true])

CBCentralManager是Apple支持的CoreBluetooth的类,您可以将这段代码放在单击动作所调用的方法中,

然后将弹出一个警报视图,要求您选择一个选项,如果您选择设置,它将进入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])
}

答案 2 :(得分:0)

您无法直接打开偏好设置,但如果您在创建true时添加了值CBCentralManager的{​​{3}},则iOS会提示用户打开蓝牙(如果是)关掉。 iOS显示的警报包括一个用于打开蓝牙设置的按钮。

答案 3 :(得分:0)

您可以使用以下扩展名:

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
      }
 }