好的,我知道有很多问题,但它们都来自很久以前。
因此。我知道这是可能的,因为地图应用程序可以做到。
在地图应用中,如果我关闭此应用的本地化,它会向我发送一条消息,如果我按好,“设置应用”将会打开。 我的问题是,这怎么可能? 如何从我自己的应用程序中打开“设置应用程序”?
基本上我需要做同样的事情,如果用户关闭我的应用程序的位置,那么我会给他一条消息,说明会打开“设置应用程序”
答案 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?
答案 1 :(得分:128)
您可以在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方案
第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方案。它可以通过两种方式完成:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>prefs</string>
</array>
</dict>
</array>
然后是代码:
夫特
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
prefs:root=CASTLE
prefs:root=CASTLE&path=BACKUP
无线广播
prefs:root=WIFI
prefs:root=Bluetooth
prefs:root=MOBILE_DATA_SETTINGS_ID
个人热点
prefs:root=INTERNET_TETHERING
prefs:root=INTERNET_TETHERING&path=Family%20Sharing
prefs:root=INTERNET_TETHERING&path=Wi-Fi%20Password
VPN
prefs:root=General&path=VPN
通知
prefs:root=NOTIFICATIONS_ID
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
prefs:root=General&path=CARPLAY
prefs:root=General&path=AUTO_CONTENT_DOWNLOAD
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
prefs:root=SIRI
Apple Pencil
prefs:root=Pencil
人脸ID
prefs:root=PASSCODE
紧急SOS
prefs:root=EMERGENCY_SOS
电池
prefs:root=BATTERY_USAGE
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
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
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
prefs:root=SAFARI
prefs:root=SAFARI&path=Content%20Blockers
prefs:root=SAFARI&path=DOWNLOADS
prefs:root=SAFARI&path=Close%20Tabs
prefs:root=SAFARI&path=CLEAR_HISTORY_AND_DATA
prefs:root=SAFARI&path=Page%20Zoom
prefs:root=SAFARI&path=Request%20Desktop%20Website
prefs:root=SAFARI&path=Reader
prefs:root=SAFARI&path=Camera
prefs:root=SAFARI&path=Microphone
prefs:root=SAFARI&path=Location
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
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")
})