인터넷 연결을 사용할 수 없을 때 경고를 표시하는 기능을 앱에 구현하려고합니다. 알림에는 사용자가 설정을 클릭 할 때마다 프로그래밍 방식으로 전화 설정으로 이동하고 싶은 두 가지 작업 (확인 및 설정)이 있습니다.
Swift와 Xcode를 사용하고 있습니다.
인터넷 연결을 사용할 수 없을 때 경고를 표시하는 기능을 앱에 구현하려고합니다. 알림에는 사용자가 설정을 클릭 할 때마다 프로그래밍 방식으로 전화 설정으로 이동하고 싶은 두 가지 작업 (확인 및 설정)이 있습니다.
Swift와 Xcode를 사용하고 있습니다.
답변:
사용 UIApplication.openSettingsURLString
Swift 5.1 업데이트
override func viewDidAppear(_ animated: Bool) {
let alertController = UIAlertController (title: "Title", message: "Go to Settings?", preferredStyle: .alert)
let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in
guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else {
return
}
if UIApplication.shared.canOpenURL(settingsUrl) {
UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
print("Settings opened: \(success)") // Prints true
})
}
}
alertController.addAction(settingsAction)
let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
alertController.addAction(cancelAction)
present(alertController, animated: true, completion: nil)
}
스위프트 4.2
override func viewDidAppear(_ animated: Bool) {
let alertController = UIAlertController (title: "Title", message: "Go to Settings?", preferredStyle: .alert)
let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in
guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
return
}
if UIApplication.shared.canOpenURL(settingsUrl) {
UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
print("Settings opened: \(success)") // Prints true
})
}
}
alertController.addAction(settingsAction)
let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
alertController.addAction(cancelAction)
present(alertController, animated: true, completion: nil)
}
viewDidAppear
메소드에 경고를 추가하기 위해 답변을 업데이트했습니다Settings
Cancel
UIApplication.sharedApplication().openURL(yourCustomURL)
하고 현재 앱에서 호출 해야하지만 설정 앱에서 액세스 할 수는 없습니다.
⚠️ 조심하세요!
이 답변은 문서화되지 않은 API를 기반으로하며 최근 (iOS12부터) Apple 은이 접근법으로 앱을 거부합니다.
아래의 원래 답변
스위프트 5
UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil)
스위프트 4
UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!, options: [:], completionHandler: nil)
참고 : 다음 방법은 iOS 11 이하의 모든 버전에서 작동하며, 상위 버전의 경우 비공개 API이므로 앱이 거부 될 수 있습니다
때로는 앱 설정 이외의 설정으로 사용자를 안내하고자합니다. 다음 방법으로이를 달성 할 수 있습니다.
먼저 프로젝트에서 URL 체계를 구성하십시오. 대상-> 정보-> URL 구성표에서 찾을 수 있습니다. + 버튼을 클릭하고 URL 체계에 prefs를 입력하십시오
스위프트 5
UIApplication.shared.open(URL(string: "App-prefs:Bluetooth")!)
스위프트 3
UIApplication.shared.open(URL(string:"App-Prefs:root=General")!, options: [:], completionHandler: nil)
빠른
UIApplication.sharedApplication().openURL(NSURL(string:"prefs:root=General")!)
목표 -C
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=General"]];
다음은 사용 가능한 모든 URL입니다.
** IOS <12에서 **
iOS 13에서
앱 사전 : DO_NOT_DISTURB
검증되지 않은
앱 사전 : 트위터 (??)
참고 : 네트워크 설정은 시뮬레이터에서 열리지 않지만 링크는 실제 장치에서 작동합니다.
App-Prefs
대신 대신 사용 prefs
하십시오. 예App-Prefs:root=WIFI
App-Prefs
또는 prefs:root
개인 API이므로 사용하지 마십시오. 운이 좋지 않으면 앱이 거부됩니다.
iOS 8 이상에서는 다음을 수행 할 수 있습니다.
func buttonClicked(sender:UIButton)
{
UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString))
}
스위프트 4
let settingsUrl = URL(string: UIApplicationOpenSettingsURLString)!
UIApplication.shared.open(settingsUrl)
UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
URL(string: UIApplication.openSettingsURLString).map { UIApplication.shared.open($0, options: [:], completionHandler: nil) }
@vivek의 힌트를 사용하여 Swift 3 기반의 utils 클래스를 개발 합니다. 감사합니다.
import Foundation
import UIKit
public enum PreferenceType: String {
case about = "General&path=About"
case accessibility = "General&path=ACCESSIBILITY"
case airplaneMode = "AIRPLANE_MODE"
case autolock = "General&path=AUTOLOCK"
case cellularUsage = "General&path=USAGE/CELLULAR_USAGE"
case brightness = "Brightness"
case bluetooth = "Bluetooth"
case dateAndTime = "General&path=DATE_AND_TIME"
case facetime = "FACETIME"
case general = "General"
case keyboard = "General&path=Keyboard"
case castle = "CASTLE"
case storageAndBackup = "CASTLE&path=STORAGE_AND_BACKUP"
case international = "General&path=INTERNATIONAL"
case locationServices = "LOCATION_SERVICES"
case accountSettings = "ACCOUNT_SETTINGS"
case music = "MUSIC"
case equalizer = "MUSIC&path=EQ"
case volumeLimit = "MUSIC&path=VolumeLimit"
case network = "General&path=Network"
case nikePlusIPod = "NIKE_PLUS_IPOD"
case notes = "NOTES"
case notificationsId = "NOTIFICATIONS_ID"
case phone = "Phone"
case photos = "Photos"
case managedConfigurationList = "General&path=ManagedConfigurationList"
case reset = "General&path=Reset"
case ringtone = "Sounds&path=Ringtone"
case safari = "Safari"
case assistant = "General&path=Assistant"
case sounds = "Sounds"
case softwareUpdateLink = "General&path=SOFTWARE_UPDATE_LINK"
case store = "STORE"
case twitter = "TWITTER"
case facebook = "FACEBOOK"
case usage = "General&path=USAGE"
case video = "VIDEO"
case vpn = "General&path=Network/VPN"
case wallpaper = "Wallpaper"
case wifi = "WIFI"
case tethering = "INTERNET_TETHERING"
case blocked = "Phone&path=Blocked"
case doNotDisturb = "DO_NOT_DISTURB"
}
enum PreferenceExplorerError: Error {
case notFound(String)
}
open class PreferencesExplorer {
// MARK: - Class properties -
static private let preferencePath = "App-Prefs:root"
// MARK: - Class methods -
static func open(_ preferenceType: PreferenceType) throws {
let appPath = "\(PreferencesExplorer.preferencePath)=\(preferenceType.rawValue)"
if let url = URL(string: appPath) {
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
} else {
throw PreferenceExplorerError.notFound(appPath)
}
}
}
API가 확실히 변경되므로 한 번에 매우 빠르게 리팩토링 할 수 있으므로 매우 유용합니다!
App-Specific URL Schemes 의 첫 번째 응답은 iOS 10.3에서 효과적이었습니다.
if let appSettings = URL(string: UIApplicationOpenSettingsURLString + Bundle.main.bundleIdentifier!) {
if UIApplication.shared.canOpenURL(appSettings) {
UIApplication.shared.open(appSettings)
}
}
App-Prefs:root=Privacy&path=LOCATION
일반적인 위치 설정을 위해 나를 위해 일했습니다. 참고 : 장치에서만 작동합니다.
시뮬레이터의 iOS10 / Xcode 8에서 :
UIApplication.shared.openURL(URL(string:UIApplicationOpenSettingsURLString)!)
공장
UIApplication.shared.openURL(URL(string:"prefs:root=General")!)
하지 않습니다.
NS
접두사는 아이폰 OS 10에서 제거되었습니다?
이 코드 줄을 보았습니다
UIApplication.sharedApplication() .openURL(NSURL(string:"prefs:root=General")!)
작동하지 않습니다, 그것은 ios10 / Xcode 8에서 저에게 효과가 없었습니다.
UIApplication.sharedApplication().openURL(NSURL(string:"App-Prefs:root=General")!)
스위프트 3
UIApplication.shared.openURL(URL(string:"prefs:root=General")!)
로 교체
UIApplication.shared.openURL(URL(string:"App-Prefs:root=General")!)
도움이 되길 바랍니다. 건배.
경고 단어 : prefs:root
또는 App-Prefs:root
URL 체계는 개인 API로 간주됩니다. Apple은 귀하가 앱을 사용하는 경우 귀하를 거부 할 수 있습니다.
앱은 개인 엔티티 인 "prefs : root ="비공개 URL 체계를 사용합니다. 비공개 API는 App Store에서 허용되지 않습니다. API가 변경되면 사용자 경험이 저하 될 수 있기 때문입니다. 이후에이 앱을 제출할 때 비공개 API를 계속 사용하거나 숨기면 Apple Developer 계정이 종료되고 App Store에서 모든 관련 앱이 제거 될 수 있습니다.
다음 단계
이 문제를 해결하려면 공개 API를 사용하여 관련 기능을 제공하거나 "prefs : root"또는 "App-Prefs : root"URL 체계를 사용하여 기능을 제거하도록 앱을 수정하십시오.
앱에 필요한 기능을 제공하기위한 대안이없는 경우 개선 요청을 제출할 수 있습니다.
스위프트 4.2, iOS 12
open(url:options:completionHandler:)
방법은 비 닐 옵션이 포스트의 형태로 단지 하나의 가능한 옵션을 포함하는, 사전 업데이트되어있다 UIApplication.OpenExternalURLOptionsKey
(이 예에서).
@objc func openAppSpecificSettings() {
guard let url = URL(string: UIApplication.openSettingsURLString),
UIApplication.shared.canOpenURL(url) else {
return
}
let optionsKeyDictionary = [UIApplication.OpenExternalURLOptionsKey(rawValue: "universalLinksOnly"): NSNumber(value: true)]
UIApplication.shared.open(url, options: optionsKeyDictionary, completionHandler: nil)
}
"App-Prefs"와 같은 URL을 명시 적으로 구성하면 AFAIK에서 일부 앱이 스토어에서 거부되었습니다.
@Luca Davanzo에 추가
iOS 11에서 일부 권한 설정이 앱 경로로 이동했습니다.
iOS 11 지원
static func open(_ preferenceType: PreferenceType) throws {
var preferencePath: String
if #available(iOS 11.0, *), preferenceType == .video || preferenceType == .locationServices || preferenceType == .photos {
preferencePath = UIApplicationOpenSettingsURLString
} else {
preferencePath = "\(PreferencesExplorer.preferencePath)=\(preferenceType.rawValue)"
}
if let url = URL(string: preferencePath) {
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
} else {
throw PreferenceExplorerError.notFound(preferencePath)
}
}
스위프트 4
원하는 경우 앱의 특정 설정이 필요할 수 있습니다.
UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)