버튼을 클릭 할 때 전화 설정을 열려면 어떻게합니까?


160

인터넷 연결을 사용할 수 없을 때 경고를 표시하는 기능을 앱에 구현하려고합니다. 알림에는 사용자가 설정을 클릭 할 때마다 프로그래밍 방식으로 전화 설정으로 이동하고 싶은 두 가지 작업 (확인 및 설정)이 있습니다.

Swift와 Xcode를 사용하고 있습니다.

답변:


301

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

어떻게 구현합니까? @ 마리우스 파누
솔로몬 아 yo 라

그것은 iOS8 @Marius Fanu를 사용하여
Solomon Ayoola

@AyoolaSolomon 그리고 버튼 으로 viewDidAppear메소드에 경고를 추가하기 위해 답변을 업데이트했습니다SettingsCancel
Marius Fanu

2
아니, 나는 그렇게 생각하지 않습니다. 앱으로 이동하려면 애플리케이션이 사용자 정의 URL 스킴을 구현 UIApplication.sharedApplication().openURL(yourCustomURL)하고 현재 앱에서 호출 해야하지만 설정 앱에서 액세스 할 수는 없습니다.
Marius Fanu

5
@PersianBlue가 iOS 10.1.1에서 정확하므로 설정 앱을 시작할 수 없습니다.
Michael Garito

237

⚠️ 조심하세요!

이 답변은 문서화되지 않은 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에서 **

  • prefs : root = 일반 및 경로 = 정보
  • prefs : root = 일반 및 경로 = 접근성
  • prefs : root = AIRPLANE_MODE
  • 기본 설정 : root = General & path = AUTOLOCK
  • 기본 설정 : root = General & path = USAGE / CELLULAR_USAGE
  • prefs : root = 밝기
  • prefs : root = 블루투스
  • prefs : root = 일반 및 경로 = DATE_AND_TIME
  • prefs : root = FACETIME
  • prefs : root = 일반
  • 기본 설정 : root = General & path = 키보드
  • prefs : root = CASTLE
  • prefs : root = CASTLE & path = STORAGE_AND_BACKUP
  • 기본 설정 : root = General & path = INTERNATIONAL
  • prefs : root = LOCATION_SERVICES
  • prefs : root = ACCOUNT_SETTINGS
  • prefs : root = 음악
  • 기본 설정 : root = MUSIC & path = EQ
  • 기본 설정 : root = MUSIC & path = VolumeLimit
  • prefs : root = 일반 및 경로 = 네트워크
  • prefs : root = NIKE_PLUS_IPOD
  • prefs : root = 노트
  • prefs : root = NOTIFICATIONS_ID
  • prefs : root = 전화
  • prefs : root = 사진
  • prefs : root = General & path = 관리되는 구성 목록
  • prefs : root = 일반 & 경로 = 재설정
  • prefs : root = 사운드 및 경로 = 벨소리
  • prefs : root = 사파리
  • prefs : root = 일반 및 경로 = 보조원
  • prefs : root = 사운드
  • prefs : root = General & path = SOFTWARE_UPDATE_LINK
  • prefs : root = STORE
  • prefs : root = 트위터
  • prefs : root = 페이스 북
  • prefs : root = 일반 및 경로 = USAGE prefs : root = VIDEO
  • prefs : root = 일반 및 경로 = 네트워크 / VPN
  • prefs : root = 배경 화면
  • prefs : root = WIFI
  • prefs : root = INTERNET_TETHERING
  • 기본 설정 : root = Phone & path = 차단
  • prefs : root = DO_NOT_DISTURB

iOS 13에서

  • 앱 준비 : General & path = 정보
  • 앱 사전 : AIRPLANE_MODE
  • 앱 사전 : General & path = AUTOLOCK
  • 응용 프로그램 : 블루투스
  • 앱 사전 : General & path = DATE_AND_TIME
  • 응용 프로그램 : FACETIME
  • 응용 프로그램 : 일반
  • 앱 환경 설정 : General & path = 키보드
  • 응용 프로그램 : 성
  • 앱 사전 : CASTLE & path = STORAGE_AND_BACKUP
  • 앱 환경 설정 : General & path = INTERNATIONAL
  • 응용 프로그램 : 음악
  • 응용 프로그램 : NOTES
  • 응용 프로그램 : NOTIFICATIONS_ID
  • 응용 프로그램 : 전화
  • 응용 프로그램 : 사진
  • 앱 사전 : General & path = 관리 구성 목록
  • 앱 사전 : General & path = 재설정
  • 앱 사전 : 사운드 및 경로 = 벨소리
  • 응용 프로그램 : 사운드
  • 앱 사전 : General & path = SOFTWARE_UPDATE_LINK
  • 앱 사전 : STORE
  • 응용 프로그램 : 벽지
  • 응용 프로그램 : WIFI
  • 응용 프로그램 : INTERNET_TETHERING
  • 앱 사전 : DO_NOT_DISTURB

    검증되지 않은

  • 앱 사전 : 트위터 (??)

  • 응용 프로그램 : FACEBOOK (??)
  • 응용 프로그램 : NIKE_PLUS_IPOD (??)

참고 : 네트워크 설정은 시뮬레이터에서 열리지 않지만 링크는 실제 장치에서 작동합니다.


7
iOS 10에서는 작동하지 않습니다. iOS 9.3에서 동일한 코드를 실행하십시오. 그리고 그것은 작동했고, iOS 10에서 실행되었으며 (어떤 URL이 사용
되든

18
iOS 10 의 경우 URL 문자열 체계 App-Prefs대신 대신 사용 prefs하십시오. 예App-Prefs:root=WIFI
Desmond DAI

8
최근에 App Store에서 앱을 출시하기 위해 앱을 검토했으며 Apple은 "prefs : root"또는 "App-Prefs : root"사용으로 인해 거부했습니다. 사용자가 인터넷에 연결되어 있지 않을 때 Wi-Fi 설정을 열 때 사용했습니다.
Marcel T

21
iOS 12가 곧 출시 될 예정이므로 Apple은 그러한 준비가 포함 된 앱을 거부합니다. 조심하십시오. 내 앱조차도 거부되었습니다
Thiha Aung

8
App-Prefs또는 prefs:root개인 API이므로 사용하지 마십시오. 운이 좋지 않으면 앱이 거부됩니다.
Tejas K

45

iOS 8 이상에서는 다음을 수행 할 수 있습니다.

 func buttonClicked(sender:UIButton)
    {
        UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString))
    }

스위프트 4

    let settingsUrl = URL(string: UIApplicationOpenSettingsURLString)!
    UIApplication.shared.open(settingsUrl)

16
앱별 설정으로 이동합니다. 일반 설정 페이지 또는 건강 섹션으로 이동하는 방법은 무엇입니까?
Ace Green

2
스위프트 3 -UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
아비브 Shabat

@AceGreen 당신은 건강 섹션에 그것을 했습니까?
Saad

설정 앱만 어떻게 열 수 있습니까? 그것의 "홈페이지"
Daniel Springer

"!"없이 로그인URL(string: UIApplication.openSettingsURLString).map { UIApplication.shared.open($0, options: [:], completionHandler: nil) }
ober

21

@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가 확실히 변경되므로 한 번에 매우 빠르게 리팩토링 할 수 있으므로 매우 유용합니다!


5
이것이 사과 검토를 통과합니까?
L_Sonic

조금 더 좋게 만들기 위해 한 가지 더 추가하겠습니다. 열거 형에서 이름이 urlString 인 String 유형의 변수를 만들 수 있습니다. 그런 다음 "App-Prefs : root ="= self.rawValue를 반환하십시오. 이것은 기본적으로 appPath와 정적 개인 let의 필요성을 제거합니다. 건배.
mn1

iOS 11에서는 알림 설정이 열리지 않습니다.
Metin Atalay

2
"앱에서 비공개 엔티티 인"prefs : root = "비공개 URL 체계를 사용합니다. 비공개 API를 사용하는 것은 App Store에서 허용되지 않습니다. API를 변경하면 사용자 경험이 저하 될 수 있습니다. 향후이 앱을 제출할 때 비공개 API를 계속 사용하거나 숨기면 Apple 개발자 계정이 종료되고 앱에서 모든 관련 앱이 제거 될 수 있습니다 저장."
CodeOverRide

1
@L_Sonic 아니오 그것은 검토를 통과하지 않을 것이며, 만약 그렇다면, 그것은 당신이 푸시 한 미래의 업데이트에서 무작위로 표시 될 수 있습니다
RP Carson

16

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

이게 뭐야?
Daniel Springer

12

App-Prefs:root=Privacy&path=LOCATION일반적인 위치 설정을 위해 나를 위해 일했습니다. 참고 : 장치에서만 작동합니다.


12
거부 됨
Daniel Springer

7

시뮬레이터의 iOS10 / Xcode 8에서 :

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

공장

UIApplication.shared.openURL(URL(string:"prefs:root=General")!)

하지 않습니다.


했습니다 NS접두사는 아이폰 OS 10에서 제거되었습니다?
JC Rocamonde

2
앱이 .bundle 파일 (앱 환경 설정)가있는 경우에만 작동합니다
소피 Swicz

@Sophy Swicz 어떻게 .bundle 파일을 추가 할 수 있습니까?
개발자

1
@Developer github.com/phynet/SettingBundleiOSProject 또한, 앱 설정 앱이 사용할 수 있도록하고 일반에 표시되는 모든 서비스입니다 -> 앱 설정
소피 Swicz

7

이 코드 줄을 보았습니다

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")!)

도움이 되길 바랍니다. 건배.


1
원인 : 앱 거부
ergunkocak

7

경고 단어 : prefs:root또는 App-Prefs:rootURL 체계는 개인 API로 간주됩니다. Apple은 귀하가 앱을 사용하는 경우 귀하를 거부 할 수 있습니다.

앱은 개인 엔티티 인 "prefs : root ="비공개 URL 체계를 사용합니다. 비공개 API는 App Store에서 허용되지 않습니다. API가 변경되면 사용자 경험이 저하 될 수 있기 때문입니다. 이후에이 앱을 제출할 때 비공개 API를 계속 사용하거나 숨기면 Apple Developer 계정이 종료되고 App Store에서 모든 관련 앱이 제거 될 수 있습니다.

다음 단계

이 문제를 해결하려면 공개 API를 사용하여 관련 기능을 제공하거나 "prefs : root"또는 "App-Prefs : root"URL 체계를 사용하여 기능을 제거하도록 앱을 수정하십시오.

앱에 필요한 기능을 제공하기위한 대안이없는 경우 개선 요청을 제출할 수 있습니다.


Wi-Fi / 언어 / 위치 '페이지'로 설정을 여는 방법은 지원되지 않습니다. 이것이 iOS 9에서 작동했다는 사실은 iOS 10에서 수정 된 버그입니다. 자세한 내용은 forums.developer.apple.com/message/186656#186656
Mohit Kumar

6

스위프트 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에서 일부 앱이 스토어에서 거부되었습니다.


나는 이것을 확인했다. 앱은 이전에 "App-Prefs"로 괜찮 았지만 Apple의 특별 이벤트 후에 업데이트가 거부되어 UIApplicationOpenSettingsURLString으로 돌아갔다.
Vitalii

5

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

2
애플 리뷰를 통해 갈 수 있습니까? 이것이 앱 거부로 이어질까요?
Aakash Dave

4
이 코드를 실행하면 설정 페이지로 이동합니다. 특정 설정 탭이 아닙니다.
Aakash Dave

2

스위프트 4

원하는 경우 앱의 특정 설정이 필요할 수 있습니다.

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

고맙습니다 ... 작동하고 있지만 다른 개발자가 만든 앱의 설정을 변경하고 싶습니다. 예를 들어, 단추를 누르고 페이스 북의 푸시 알림 설정을 변경하여 회의 중에 메시지가 표시되지 않도록하십시오. MDM 솔루션이있을 수 있습니다 ...
IrishGringo

페이스 북 응용 프로그램의 설정을 변경하는 유일한 방법 @IrishGringo 사용자가 알림 >> 페이스 북 >> 일반 설정을 통해 이동하여 페이스 북 응용 프로그램 자체의 설정을 열고입니다
BennyTheNerd

0

위와 같이 @niravdesai는 App-prefs를 말했습니다. 나는 그것이 App-Prefs:테스트 된 iOS 9, 10 및 11에서 모두 작동 한다는 것을 알았습니다 . 어디로 prefs:만은 아이폰 OS 9에서 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.