从其他应用打开“设置”应用

时间:2011-04-13 21:10:30

标签: ios objective-c iphone application-settings appsettings

好的,我知道有很多问题,但它们都来自很久以前。

因此。我知道这是可能的,因为地图应用程序可以做到。

在地图应用中,如果我关闭此应用的本地化,它会向我发送一条消息,如果我按好,“设置应用”将会打开。 我的问题是,这怎么可能? 如何从我自己的应用程序中打开“设置应用程序”?

基本上我需要做同样的事情,如果用户关闭我的应用程序的位置,那么我会给他一条消息,说明会打开“设置应用程序”

16 个答案:

答案 0 :(得分:244)

正如Karan Dua提到的那样now possible in iOS8使用UIApplicationOpenSettingsURLString,请参阅Apple's Documentation

示例:

Swift 4.2

UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)

在Swift 3中:

UIApplication.shared.open(URL(string:UIApplicationOpenSettingsURLString)!)

在Swift 2中:

UIApplication.sharedApplication().openURL(NSURL(string:UIApplicationOpenSettingsURLString)!)

在Objective-C

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

在iOS 8之前:

你做不到。正如你所说,这已被多次覆盖,并且弹出要求你打开位置服务是由Apple提供的,而不是由应用程序本身提供。这就是为什么它能够打开设置应用程序。

以下是一些相关问题&文章:

is it possible to open Settings App using openURL?

Programmatically opening the settings app (iPhone)

How can I open the Settings app when the user presses a button?

iPhone: Opening Application Preferences Panel From App

Open UIPickerView by clicking on an entry in the app's preferences - How to?

Open the Settings app?

iOS: You’re Doing Settings Wrong

答案 1 :(得分:128)

来自@Yatheeshalessanswer

您可以在iOS8中以编程方式打开设置应用程序,但不能在早期版本的iOS中打开。

<强>夫特:

   UIApplication.sharedApplication().openURL(NSURL(string:UIApplicationOpenSettingsURLString)!)

Swift 4:

if let url = NSURL(string: UIApplicationOpenSettingsURLString) as URL? {
    UIApplication.shared.openURL(url)
}

Swift 4.2(测试版):

if let url = NSURL(string: UIApplication.openSettingsURLString) as URL? {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

<强>目标-C:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

答案 2 :(得分:56)

是!! 您可以启动设备设置屏幕,我在iOS 9.2上进行了测试

第1步。我们需要添加网址

转到项目设置 - &gt;信息 - &gt;网址类型 - &gt;添加新的URL方案

enter image description here

第2步。以编程方式启动设置感谢@davidcann

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"]];

我们也可以通过使用专有名称

来启动音乐,位置等子屏幕
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=MUSIC"]];

请参阅Henri Normak分享的此全名列表here

<强>更新

根据评论,每个人都想知道在更改我的申请提交状态后会发生什么?

所以YES!! I got successful update submission and application is available on store without any complain.

只是为了证实, 我今天早上刚刚下载并禁用了位置服务,然后启动了应用程序,该应用程序询问了我的位置权限,然后我的提醒弹出窗口就是向我发送设置 - &gt;位置服务页面 - &gt;已启用 - &gt;就是这样!!

![NOTICE: Your app might be rejected ... even if it's approved it can be rejected in future version if you use this method...] 4

答案 3 :(得分:18)

您可以在iOS 5.0及更高版本上使用此功能:这不再有效。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"]];

答案 4 :(得分:13)

iOS 10更新

Apple改变了在主线程上打开异步的方法。但是,从现在开始,只能在本机设置中打开应用程序设置。

[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];

iOS 9更新

现在可以直接进入子设置菜单。但是,必须创建URL方案。它可以通过两种方式完成:

  1. XCode - 您可以在Target,Info,URL Scheme中找到它。然后,只需键入prefs。
  2. 直接添加到* -Info.plist。添加以下内容: <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleTypeRole</key> <string>Editor</string> <key>CFBundleURLSchemes</key> <array> <string>prefs</string> </array> </dict> </array>
  3. 然后是代码:

    夫特

    UIApplication.sharedApplication().openURL(NSURL(string:"prefs:root=General&path=Keyboard")!)

    目标-C

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=General&path=Keyboard"]];

答案 5 :(得分:12)

似乎您可以使用prefs:<area> URL打开设置并转到特定区域。 Apple可能会更改这些内容并破坏您的应用程序,因此请始终检查是否可以先打开它们。

在此article中,他们列出了其中的一些iOS 13.1版本:

设置网址

iCloud

  • iCloud:prefs:root=CASTLE
  • iCloud备份:prefs:root=CASTLE&path=BACKUP

无线广播

  • Wi-Fi:prefs:root=WIFI
  • 蓝牙:prefs:root=Bluetooth
  • 手机:prefs:root=MOBILE_DATA_SETTINGS_ID

个人热点

  • 个人热点:prefs:root=INTERNET_TETHERING
  • 个人热点⇾家庭共享:prefs:root=INTERNET_TETHERING&path=Family%20Sharing
  • 个人热点⇾Wi-Fi密码:prefs:root=INTERNET_TETHERING&path=Wi-Fi%20Password

VPN

  • VPN:prefs:root=General&path=VPN

通知

  • 通知:prefs:root=NOTIFICATIONS_ID
  • 通知⇾Siri建议:prefs:root=NOTIFICATIONS_ID&path=Siri%20Suggestions

声音

  • 声音:prefs:root=Sounds
  • 铃声:prefs:root=Sounds&path=Ringtone

请勿打扰

  • 请勿打扰:prefs:root=DO_NOT_DISTURB
  • 请勿打扰⇾允许来自prefs:root=DO_NOT_DISTURB&path=Allow%20Calls%20From的呼叫

屏幕时间

  • 屏幕时间:prefs:root=SCREEN_TIME
  • 屏幕时间⇾停机时间:prefs:root=SCREEN_TIME&path=DOWNTIME
  • 屏幕时间⇾应用限制:prefs:root=SCREEN_TIME&path=APP_LIMITS
  • 屏幕时间⇾始终允许:prefs:root=SCREEN_TIME&path=ALWAYS_ALLOWED

常规

  • 常规:prefs:root=General
  • 常规⇾关于:prefs:root=General&path=About
  • 常规⇾软件更新:prefs:root=General&path=SOFTWARE_UPDATE_LINK
  • 常规⇾CarPlay:prefs:root=General&path=CARPLAY
  • 常规⇾后台应用程序刷新:prefs:root=General&path=AUTO_CONTENT_DOWNLOAD
  • 常规⇾多任务处理(仅限iPad):prefs:root=General&path=MULTITASKING
  • 常规⇾日期和时间:prefs:root=General&path=DATE_AND_TIME
  • 常规⇾键盘:prefs:root=General&path=Keyboard
  • 常规⇾键盘⇾键盘:prefs:root=General&path=Keyboard/KEYBOARDS
  • 常规⇾键盘⇾硬件键盘:prefs:root=General&path=Keyboard/Hardware%20Keyboard
  • 常规⇾键盘⇾文本替换:prefs:root=General&path=Keyboard/USER_DICTIONARY
  • 常规⇾键盘⇾单手键盘:prefs:root=General&path=Keyboard/ReachableKeyboard
  • 常规⇾语言和地区:prefs:root=General&path=INTERNATIONAL
  • 通用⇾字典:prefs:root=General&path=DICTIONARY
  • 常规⇾个人资料:prefs:root=General&path=ManagedConfigurationList
  • 常规⇾重置:prefs:root=General&path=Reset

控制中心

  • 控制中心:prefs:root=ControlCenter
  • 控制中心⇾自定义控件:prefs:root=ControlCenter&path=CUSTOMIZE_CONTROLS

显示

  • 显示:prefs:root=DISPLAY
  • 显示⇾自动锁定:prefs:root=DISPLAY&path=AUTOLOCK
  • 显示⇾文本大小:prefs:root=DISPLAY&path=TEXT_SIZE

可访问性

  • 可访问性:prefs:root=ACCESSIBILITY

壁纸

  • 墙纸:prefs:root=Wallpaper

Siri

  • Siri:prefs:root=SIRI

Apple Pencil

  • Apple Pencil(仅限iPad):prefs:root=Pencil

人脸ID

  • 面部ID:prefs:root=PASSCODE

紧急SOS

  • 紧急SOS:prefs:root=EMERGENCY_SOS

电池

  • 电池:prefs:root=BATTERY_USAGE
  • 电池⇾电池运行状况(仅iPhone):prefs:root=BATTERY_USAGE&path=BATTERY_HEALTH

隐私

  • 隐私权:prefs:root=Privacy
  • 隐私⇾定位服务:prefs:root=Privacy&path=LOCATION
  • 隐私权⇾联系人:prefs:root=Privacy&path=CONTACTS
  • 隐私⇾日历:prefs:root=Privacy&path=CALENDARS
  • 隐私⇾提醒:prefs:root=Privacy&path=REMINDERS
  • 隐私权⇾照片:prefs:root=Privacy&path=PHOTOS
  • 隐私权⇾麦克风:prefs:root=Privacy&path=MICROPHONE
  • 隐私权⇾语音识别:prefs:root=Privacy&path=SPEECH_RECOGNITION
  • 隐私权⇾摄像头:prefs:root=Privacy&path=CAMERA
  • 隐私⇾运动:prefs:root=Privacy&path=MOTION\

App Store

  • App Store:prefs:root=STORE
  • App Store⇾App下载:prefs:root=STORE&path=App%20Downloads
  • App Store⇾视频自动播放:prefs:root=STORE&path=Video%20Autoplay

钱包

  • 钱包:prefs:root=PASSBOOK

密码和帐户

  • 密码和帐户:prefs:root=ACCOUNTS_AND_PASSWORDS
  • 密码和帐户⇾获取新数据:prefs:root=ACCOUNTS_AND_PASSWORDS&path=FETCH_NEW_DATA
  • 密码和帐户⇾添加帐户:prefs:root=ACCOUNTS_AND_PASSWORDS&path=ADD_ACCOUNT

邮件

  • 邮件:prefs:root=MAIL
  • 邮件⇾预览:prefs:root=MAIL&path=Preview
  • 邮件⇾滑动选项:prefs:root=MAIL&path=Swipe%20Options
  • 邮件⇾通知:prefs:root=MAIL&path=NOTIFICATIONS
  • 邮件⇾已阻止:prefs:root=MAIL&path=Blocked
  • 邮件⇾线程静音操作:prefs:root=MAIL&path=Muted%20Thread%20Action
  • 邮件⇾阻止的发件人选项:prefs:root=MAIL&path=Blocked%20Sender%20Options
  • 邮件⇾标记地址:prefs:root=MAIL&path=Mark%20Addresses
  • 邮件⇾增加报价等级:prefs:root=MAIL&path=Increase%20Quote%20Level
  • 邮件⇾包括带有回复的附件:prefs:root=MAIL&path=Include%20Attachments%20with%20Replies
  • 邮件⇾签名:prefs:root=MAIL&path=Signature
  • 邮件⇾默认帐户:prefs:root=MAIL&path=Default%20Account

联系人

  • 联系人:prefs:root=CONTACTS

日历

  • 日历:prefs:root=CALENDAR
  • 日历⇾备用日历:prefs:root=CALENDAR&path=Alternate%20Calendars
  • 日历⇾同步:prefs:root=CALENDAR&path=Sync
  • 日历⇾默认警报时间:prefs:root=CALENDAR&path=Default%20Alert%20Times
  • 日历⇾默认日历:prefs:root=CALENDAR&path=Default%20Calendar

注释

  • 注意:prefs:root=NOTES
  • 注释⇾默认帐户:prefs:root=NOTES&path=Default%20Account
  • 注释⇾密码:prefs:root=NOTES&path=Password
  • 注释⇾注释排序依据:prefs:root=NOTES&path=Sort%20Notes%20By
  • 笔记⇾新笔记开始于:prefs:root=NOTES&path=New%20Notes%20Start%20With
  • 注释⇾对已检查项目进行排序:prefs:root=NOTES&path=Sort%20Checked%20Items
  • 注释⇾线和格:prefs:root=NOTES&path=Lines%20%26%20Grids
  • 注释Lock从锁定屏幕访问注释:prefs:root=NOTES&path=Access%20Notes%20from%20Lock%20Screen

提醒

  • 提醒:prefs:root=REMINDERS
  • 提醒⇾默认列表:prefs:root=REMINDERS&path=DEFAULT_LIST

语音备忘录

  • 语音备忘录:prefs:root=VOICE_MEMOS

电话

  • 电话:prefs:root=Phone

消息

  • 消息:prefs:root=MESSAGES

FaceTime

  • FaceTime:prefs:root=FACETIME

地图

  • 地图:prefs:root=MAPS
  • 地图⇾驾驶和导航:prefs:root=MAPS&path=Driving%20%26%20Navigation
  • 地图⇾运输:prefs:root=MAPS&path=Transit

指南针

  • 指南针:prefs:root=COMPASS

测量

  • 测量:prefs:root=MEASURE

Safari

  • Safari:prefs:root=SAFARI
  • Safari⇾内容拦截器:prefs:root=SAFARI&path=Content%20Blockers
  • Safari⇾下载:prefs:root=SAFARI&path=DOWNLOADS
  • Safari⇾关闭标签页:prefs:root=SAFARI&path=Close%20Tabs
  • Safari⇾清除历史记录和数据:prefs:root=SAFARI&path=CLEAR_HISTORY_AND_DATA
  • Safari⇾页面缩放:prefs:root=SAFARI&path=Page%20Zoom
  • Safari⇾请求桌面网站:prefs:root=SAFARI&path=Request%20Desktop%20Website
  • Safari⇾阅读器:prefs:root=SAFARI&path=Reader
  • Safari⇾相机:prefs:root=SAFARI&path=Camera
  • Safari⇾麦克风:prefs:root=SAFARI&path=Microphone
  • Safari⇾位置:prefs:root=SAFARI&path=Location
  • Safari⇾高级:prefs:root=SAFARI&path=ADVANCED

新闻

  • 新闻:prefs:root=NEWS

健康

  • 健康:prefs:root=HEALTH

快捷方式

  • 快捷方式:prefs:root=SHORTCUTS

音乐

  • 音乐:prefs:root=MUSIC
  • 音乐⇾蜂窝数据:prefs:root=MUSIC&path=com.apple.Music:CellularData
  • 音乐⇾优化存储:prefs:root=MUSIC&path=com.apple.Music:OptimizeStorage
  • 音乐⇾EQ:prefs:root=MUSIC&path=com.apple.Music:EQ
  • 音乐⇾音量限制:prefs:root=MUSIC&path=com.apple.Music:VolumeLimit

电视

  • 设置⇾电视:prefs:root=TVAPP

照片

  • 照片:prefs:root=Photos

相机

  • 相机:prefs:root=CAMERA
  • 相机⇾录制视频:prefs:root=CAMERA&path=Record%20Video
  • 相机⇾录制慢动作:prefs:root=CAMERA&path=Record%20Slo-mo

书籍

  • 书籍:prefs:root=IBOOKS

游戏中心

  • 游戏中心:prefs:root=GAMECENTER

答案 6 :(得分:4)

在Swift 3 / iOS 10+中,现在看起来像

if let url = URL(string: "App-Prefs:root=LOCATION_SERVICES") {
    UIApplication.shared.open(url, completionHandler: .none)
}

答案 7 :(得分:4)

斯威夫特3:

guard let url = URL(string: UIApplicationOpenSettingsURLString) else {return}
if #available(iOS 10.0, *) {
  UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
  // Fallback on earlier versions
  UIApplication.shared.openURL(url)
}

答案 8 :(得分:3)

在Swift 3中我只需要这个(这里例如重定向到我的应用程序通知):

if let url = URL(string: "App-Prefs:root=NOTIFICATIONS_ID&path=your app bundleID") {
    if #available(iOS 10.0, *) {
        UIApplication.shared.open(url, completionHandler: .none)
    } else {
        // Fallback on earlier versions
    }
}

来源:phynet gist

只有当设置在后台时才能使用此功能。它会将您重定向到您的应用通知设置,但如果设置未在后台运行,则只会将您重定向到通知设置。

答案 9 :(得分:2)

UIApplicationOpenSettingsURLString这只有在您之前允许任何许可的情况下才有效。例如,位置,照片,联系人,推送通知访问。因此,如果您没有来自用户的此类许可:

如果 iOS 10或以上

它会打开“设置”但会崩溃。原因是,您的应用设置中没有任何内容。

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

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

由于设备不可用,我无法在iOS&lt;&lt; iOS&lt; 10。

另外,我可以从一些要点找到下面的代码,它也适用于iOS 10。但我不确定这是否会得到Apple审核小组的批准。

https://gist.github.com/johnny77221/bcaa5384a242b64bfd0b8a715f48e69f

答案 10 :(得分:1)

您可以使用以下代码。

[[UIApplication sharedApplication]openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

答案 11 :(得分:1)

SWIFT 4.0

  

&#39;的OpenURL&#39;在iOS 10.0中已弃用:请使用   openURL:options:completionHandler:而不是

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

答案 12 :(得分:1)

Swift 4

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

if let settingUrl = URL(string:UIApplicationOpenSettingsURLString) {

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

答案 13 :(得分:0)

使用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;
}
}

快乐编码:)

答案 14 :(得分:0)

要添加到已接受的答案中:(来自Apple开发者文档)“当您打开根据此字符串构建的URL(openSettingsURLString)时,系统将启动“设置”应用程序并显示该应用程序的自定义设置(如果有)。因此,如果要打开应用程序的设置,请创建自己的Settings.bundle。

答案 15 :(得分:-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")
})