从另一个应用程序打开设置应用程序

225

好的,我知道有许多关于这个问题的疑问,但它们都是很久以前的。

所以,在地图应用中,如果我关闭该应用的本地化,它会发送一条消息。如果我按下“确定”按钮,“设置应用程序”将被打开。 我的问题是,这是如何可能的? 我怎样能够从我的应用程序中打开“设置应用程序”?

基本上,如果用户关闭了我的应用程序的位置信息功能,我需要做同样的事情,那么我会向他显示一条消息,告诉他将打开“设置应用程序”。


请查看此链接:https://dev59.com/EXRC5IYBdhLWcg3wMeLg#24570751 - Yatheesha
1
您可以在iOS8中以编程方式打开设置应用程序(但不能在较低版本的iOS中)。下面是答案中的代码。 - Karan Dua
19个回答

3

UIApplicationOpenSettingsURLString 仅在您之前已允许任何权限(例如位置,照片,联系人,推送通知)时才有效。因此,如果用户没有授予此类权限:

如果iOS 10或更高版本,

它将打开设置,但会导致崩溃。这是因为您的应用程序在设置中没有内容。

以下代码将在iOS设置中打开您的应用程序设置。

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
    [[UIApplication sharedApplication] openURL:url];
}

由于设备不可用,我无法在iOS < 10上检查此内容。
此外,我从一些代码片段中找到了以下代码,在iOS 10上也可以正常工作。但我不确定这是否会被苹果审核团队批准。 https://gist.github.com/johnny77221/bcaa5384a242b64bfd0b8a715f48e69f

2
您可以使用以下代码来完成此操作。
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

1

SWIFT 4.0

'openURL'在iOS 10.0中已弃用:请使用 openURL:options:completionHandler: 替代。

UIApplication.shared.open(URL.init(string: UIApplicationOpenSettingsURLString)! , options: [:], completionHandler: nil)

1

测试通过iOS 10。工作正常

NSArray* urlStrings = @[@"prefs:root=WIFI", @"App-Prefs:root=WIFI"];
for(NSString* urlString in urlStrings){
NSURL* url = [NSURL URLWithString:urlString];
if([[UIApplication sharedApplication] canOpenURL:url]){
    [[UIApplication sharedApplication] openURL:url];
    break;
}
}

快乐编程 :)


3
这将导致您的应用被拒绝。我刚经历了这种情况。 - Bersaelor
是这样的,但是这行代码会直接带您到所需的位置。 - Praveen Sharma
1
是的,它可以带你到那里。我并不是说它不起作用,我只是指出在应用审核期间它会让你被拒绝。根据审核团队告诉我们的,"prefs:root" 是一个私有的 URL 方案。(你可能会很幸运,他们一段时间内没有注意到,我们曾经使用这个功能并通过了几次审核,直到审核员注意到为止) - Bersaelor
谢谢提供的信息,我会尝试其他方法。但现在我卡在 VPN 连接上了,正在寻找解决方案。 - Praveen Sharma

1

Swift 4

我更喜欢以更安全的方式打开设置,

if let settingUrl = URL(string:UIApplicationOpenSettingsURLString) {

    UIApplication.shared.open(settingUrl)
}
else {
    print("Setting URL invalid")
}

1

从iOS 16开始,您可以使用openSettingsURLString

if let url = URL(string: UIApplication. openSettingsURLString) {
    await UIApplication.shared.open(url)
}

0
补充一下已接受的答案:(来自苹果开发者文档)“当您打开从此字符串(openSettingsURLString)构建的URL时,系统会启动设置应用程序并显示应用程序的自定义设置(如果有)。因此,如果您想要为您的应用程序打开设置,请创建自己的Settings.bundle。”

0

Swift 你可以使用以下函数打开设置应用程序并进入蓝牙页面

func openSettingsApp(){
    if let settings = NSURL(string: "prefs:root=Bluetooth") {
        UIApplication.sharedApplication().openURL(settings)
    }
}

这不会打开应用程序的设置。这将通过深度链接到蓝牙打开设置应用程序。


-1
将此代码添加到您的类中:
 public class func showSettingsAlert(title:String,message:String,onVC viewController:UIViewController,onCancel:(()->())?){
            YourClass.show2ButtonsAlert(onVC: viewController, title: title, message: message, button1Title: "Settings", button2Title: "Cancel", onButton1Click: {
                if let settingsURL = NSURL(string: UIApplicationOpenSettingsURLString){
                    UIApplication.sharedApplication().openURL(settingsURL)
                }
                }, onButton2Click: {
                    onCancel?()
            })
        }

 public class func show2ButtonsAlert(onVC viewController:UIViewController,title:String,message:String,button1Title:String,button2Title:String,onButton1Click:(()->())?,onButton2Click:(()->())?){
            dispatch_async(dispatch_get_main_queue()) {
                let alert : UIAlertController = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)

                alert.addAction(UIAlertAction(title: button1Title, style:.Default, handler: { (action:UIAlertAction) in
                    onButton1Click?()
                }))

                alert.addAction(UIAlertAction(title: button2Title, style:.Default, handler: { (action:UIAlertAction) in
                    onButton2Click?()
                }))

                viewController.presentViewController(alert, animated: true, completion: nil)
            }
        }

像这样调用:

YourClass.showSettingsAlert("App would like to access camera", message: "App would like to access camera desc", onVC: fromViewController, onCancel: {
  print("canceled")
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接