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

225

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

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

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


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

356

正如Karan Dua所提到的,现在可以使用UIApplicationOpenSettingsURLString来实现iOS8中的编程相关内容,详见Apple文档

示例:

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之前:

不行。正如你所说,这已经被提及很多次了,要求开启位置服务的弹窗是由苹果提供的而不是应用本身。这就是为什么它能够打开设置应用程序。

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

是否可能使用openURL打开设置应用程序?

以编程方式打开设置应用程序(iPhone)

当用户按下按钮时,如何打开设置应用程序?

iPhone:从应用程序中打开应用程序首选项面板

通过点击应用程序首选项中的条目来打开UIPickerView - 如何操作?

打开设置应用程序?

iOS:您的设置方式不正确


7
在编程领域中,“不可能”很少是真的。 - user529758
2
在 iOS 8 中,可以使用 [NSURL URLWithString:UIApplicationOpenSettingsURLString] 实现这一点。 - LightningStryk
我认为他们仍然使用扩展。在Appstore中,这样的应用程序是“Magic Launcher”。 - Trident
1
在 Swift 3 中 - UIApplication.shared.openURL(URL(string:UIApplicationOpenSettingsURLString)!) - Hanushka Suren
1
小心使用此方法。我曾经使用过它,几个月后我的应用程序被苹果拒绝,并收到以下消息:您的应用程序使用了“prefs:root=”非公开URL方案,这是一个私有实体。在App Store上不允许使用非公开API,因为这可能会导致用户体验差,如果这些API发生更改。在将来提交此应用程序时继续使用或隐藏非公开API可能会导致终止您的Apple开发人员帐户以及从App Store中删除所有关联的应用程序。 - Nick Kirsten
显示剩余6条评论

134

根据@Yatheeshaless回答

您可以在iOS8中以编程方式打开设置应用程序,但在早期版本的iOS中无法这样做。

Swift:

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

Swift 4:

->

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

Objective-C:

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

27
这似乎会打开您的应用程序在“设置”应用程序中的部分。用户将不得不点击几次“返回”才能看到“设置”的主屏幕。 - wjl
1
小修正.. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; - Paito
12
上述语句是针对应用程序的私人设置。有没有办法直接跳转到设备设置中的“隐私”部分?如果您知道,请留言评论。这种重定向是可能的,因为我在地图应用程序中找到了它,可以将其定向到隐私部分中的位置设置。 - Pavan Kotesh
不确定是否可能,苹果应用程序经常使用私有API完成我们无法完成的操作,Google Maps应用程序只需转到“应用设置”而不是“位置服务”。 - Paito
1
小的 Swift 更正: UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!) - vbezhenar
1
@PavanKotesh- 是的,但是应用程序设置将具有您需要的权限,在我的情况下,我需要访问联系人,在应用程序设置中使用上述代码会显示。 - Tejas K

60

是的!! 你可以启动设备设置屏幕,我已经在iOS 9.2上测试过了。

步骤1。我们需要添加URL schemes。

前往项目设置-->信息-->URL类型-->添加新的URL schemes。

图片描述

步骤2。感谢@davidcann,可以通过编程方式启动设置。

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

我们还可以通过使用正确的名称来启动子屏幕,例如音乐、位置等。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=MUSIC"]];

请点击 这里 查看完整的姓名列表,由Henri Normak分享。


更新:

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

所以是的!!我成功地更新了提交并且应用程序可以在商店中使用而没有任何投诉。

只是为了确认, 我今天早上刚下载并禁用了位置服务,然后启动了该应用程序,它要求我允许访问位置,并弹出我的警报弹出窗口,将我发送到设置->位置服务页面-->启用-->就这样!!

![注意:即使应用程序被批准,使用此方法也可能导致其被拒绝...甚至在未来版本中也可能被拒绝...]4


1
@Flo 我会让你知道的,因为目前我已经推动进行了测试版测试。 - swiftBoy
1
iOS 9.3。运行得非常顺畅。我甚至在设置应用程序中看到“返回[我的应用程序名称]”。毫无疑问,这是受支持的,因为我看到有很多其他应用程序也做了这样的事情! - EricWasTaken
1
@msg 是的!应用程序已经获得批准,并且可以在商店中下载。 - swiftBoy
16
在iOS 10上,新的URL不再是"prefs:root=...."而是"App-Prefs:root=..."。 - Drico
1
你的应用程序可能会被拒绝...即使它已经被批准,如果你使用这种方法,在将来的版本中它也可能会被拒绝... - Mihir Mehta
显示剩余8条评论

38
看起来可以使用URL打开设置并进入特定区域。Apple可能会更改这些内容并破坏您的应用程序,因此请始终首先检查是否可以打开它们。
从这篇文章中(article)列出了一些iOS 13.1的URL:
设置URL
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

Face ID

  • Face 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\

应用商店

  • 应用商店:prefs:root=STORE
  • 应用商店⇾应用下载:prefs:root=STORE&path=App%20Downloads
  • 应用商店⇾视频自动播放: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
  • 备忘录 ⇾ 在锁屏界面上访问备忘录: 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

这在iOS 14上不起作用..总是显示设置而不是所提到的路径。有什么解决方法吗? - tp2376
6
我也遇到了与iOS 14相同的问题,不过在我的情况下,当我删除根前缀时,问题得以解决。例如,我使用"App-prefs:Privacy&path=LOCATION"代替"prefs:root=Privacy&path=LOCATION",这在iOS 14中可以正常工作。 - Tejas Patel
1
如果我们使用这种配置,苹果公司是否不再拒绝该应用? - letsbondiway

17

您可以在iOS 5.0及更高版本上使用此方法:这种方法不再可行。

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

3
@MarkGranoff 不是很清楚,似乎技术文档没有涉及到这一点,但这不像普通的未记录API那样糟糕,因为它只是一个URL Scheme。您可以首先使用 canOpenURL: 进行检查。此外,这里有一个关于它的讨论帖子:https://devforums.apple.com/message/543818 - davidcann
3
根据这篇文章,您可以进入设置中的不同区域。例如,此URL将带您进入蓝牙设置 prefs:root=General&path=Bluetooth - progrmr
1
我的应用程序因为我打开了URL:@"prefs:root=Brightness"而被拒绝使用私有API。通常,未记录的意味着私有。 - Guillaume
4
苹果公司表示这不是公开的API,并且不再受支持。有一个关于这个问题的错误报告,编号为11253669。 - Don Wilson
2
我刚刚看到这在Strava应用程序中有效。关闭蓝牙,然后在应用程序中打开它。然后它会要求进入设置应用程序,直接进入蓝牙设置。这是针对iOS5.1的。有没有办法找出他们正在使用什么方案? - Ants
显示剩余3条评论

14

iOS 10更新

苹果公司更改了在主线程上异步打开应用的方法。然而,从现在起只能在本地设置中打开应用程序设置。

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

iOS 9更新

现在可以直接进入子设置菜单。但是,必须创建一个URL scheme。有两种方法可以实现:

  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>

然后是代码:

Swift

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

Objective-C

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


2
我尝试了iOS 10.x的解决方案,但对我无效 - 没有任何反应。 - Mark Peters
@MarkPeters,你有想到解决方法吗?这会非常有帮助。谢谢。 - Roohul Poolak
不,我还没有。我仍然不知道这是iOS的错误还是苹果只是删除了这个功能。 - Mark Peters
我认为他们仍然使用扩展。例如,App Store 中的“Magic Launcher”。 - Trident
不要执行第2步。CFBundleURLTypes是您定义用于打开自己的应用程序的自定义URL方案的位置。 - HangarRash

7

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

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

如何进入通知屏幕?因为如果让url = URL(string: "App-Prefs:root=NOTIFICATIONS_ID&path=io.artup.artup") { if #available(iOS 10.0, *) { UIApplication.shared.open(url, completionHandler: .none) } }但我在iPhone 6上进入了通知,而不是在iPhone 7 Plus上。 - user3804063
3
这将导致您的应用被拒绝。他们会将其归类为使用私有API。 - Bersaelor
我的应用被拒绝了,使用了“App-Prefs:root”。 - Kiryl Bielašeŭski
1
只是强调其他人在这里提到的,不要使用这种方法,否则你的应用程序将被拒绝。反复提交此类应用程序将导致您的开发者帐户被关闭。 - CodeBrew

5

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

5
在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

只有在设置在后台运行时,此方法才有效。它将重定向到您的应用程序通知设置,但如果设置未在后台运行,则仅会将您重定向到通知设置。


3

由于iOS 10.0之后,openURL(_:)已经被弃用,请使用open(_:options:completionHandler:)代替。

if let settingsUrl = URL(string: UIApplication.openSettingsURLString)  {
        UIApplication.shared.open(settingsUrl, options: [:]) { completed in
             if !completed {
                 print("Failed opening")
             }
        }
}

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