iOS 跳转到系统的设置界面

一、如何代码实现跳转safari,phone或message?

  1. 调用 电话phone
    a.拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://4008008888"]];

b.打完电话后还会回到原来的程序,也会弹出提示,推荐这种

UIWebView * callWebview = [[UIWebView alloc] initWithFrame:CGRectZero];
[callWebview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"tel://4008008288"]]];
[self.view addSubview:callWebview];   //记得添加到view上

c.这种方法也会回去到原来的程序里(注意这里的telprompt),也会弹出提示,可能为私有方法

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"telprompt://4008008888"]];
  1. 调用自带 浏览器 safari
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.baidu.com"]];
  1. 调用 自带mail
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://admin@163.com"]];
  1. 调用 SMS
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://800888"]];

其中,发短信,发Email的功能只能填写要发送的地址或号码,无法初始化发送内容,如果想实现内容的话,还需要更复杂一些,实现其各自的委托方法。

二、跳转到自己的项目中(iOS8开始支持)

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

测试注意:新项目测试,需要请求一下位置权限或者通知权限,才可以跳进自己的app设置里面,如果没有任何权限请求,则不能跳转

iOS10适配:被弃用的openURL
苹果在iOS 2中引入了openURL:方法来进行APP间的跳转。不过在iOS 9中,相关的canOpenURL:函数已经被私有化了,苹果禁止开发者查询设备上是否安装了某款APP。在iOS 10中,苹果弃用了openURL,转而用openURL:options:completionHandler:替代
苹果在What's New in iOS文档的UIKit部分中指出

新的UIApplication方法openURL:options:completionHandler:可以异步执行并在主队列中执行完成后进行回调(此方法替换原来的openURL:)。

现在被废弃的方法必须传入启动APP的URL并返回布尔值来标识成功或是失败。

- (BOOL)openURL:(NSURL*)url
 // Swift
open func canOpenURL(_ url: URL) -> Bool

iOS 10中的新方法:

// Objective-C
- (void)openURL:(NSURL*)url options:(NSDictionary *)options
  completionHandler:(void (^ __nullable)(BOOL success))completion
   
// Swift
open func open(_ url: URL, options: [String : Any] = [:],
  completionHandler completion: (@escaping (Bool) -> Swift.Void)? = nil)

现在变为三个参数

打开APP的URL,可选字典参数(请参见以下有效条目)。传入一个空字典可以达到openURL:一样的行为。

执行成功后completionhandler在主队列中回调。如果你并不关心它的返回状态也可以传空。

在iOS10中打开URL

如果你有一个iOS 10应用程序也就意味着你不需要关心它的可选参数及完成回调函数返回的状态并停止对Xcode的抱怨。

// Objective-C
UIApplication *application = [UIApplication sharedApplication];
[application openURL:URL options:@{} completionHandler:nil];
 
// Swift
UIApplication.shared.open(url, options: [:], completionHandler: nil)

在项目实践中,如果你仍然兼容iOS9及更早的版本,你肯定会想用回以前的openURL 老方法。下面来看一段代码是如何使用completionHandler来检查APP打开状态。先上一段Object-C代码:

- (void)openScheme:(NSString *)scheme {
  UIApplication *application = [UIApplication sharedApplication];
  NSURL *URL = [NSURL URLWithString:scheme];
 
  if ([application respondsToSelector:@selector(openURL:options:completionHandler:)]) {
    [application openURL:URL options:@{}
       completionHandler:^(BOOL success) {
      NSLog(@"Open %@: %d",scheme,success);
    }];
  } else {
    BOOL success = [application openURL:URL];
    NSLog(@"Open %@: %d",scheme,success);
  }
}
 
// Typical usage
[self openScheme:@"tweetbot://timeline"];

我为option参数传入一个空的字典,除了只是在成功回调方法里只是打印了一下日志以外,并没有写任何有用的代码。以下是Swift版本:

func open(scheme: String) {
  if let url = URL(string: scheme) {
    if #available(iOS 10, *) {
      UIApplication.shared.open(url, options: [:],
        completionHandler: {
          (success) in
           print("Open \(scheme): \(success)")
       })
    } else {
      let success = UIApplication.shared.openURL(url)
      print("Open \(scheme): \(success)")
    }
  }
}
 
// Typical usage
open(scheme: "tweetbot://timeline")

Options 参数

UIApplication 头文件为options字典列出了一个key:
UIApplicationOpenURLOptionUniversalLinksOnly:如果这个要打开的URL有效,并且在应用中配置它布尔值为true(YES)时才可以打开,否则打不开。

为了覆盖默认行为,创建一个设置key值了True的字典作为参数传入:

// Objective-C
NSDictionary *options = @{UIApplicationOpenURLOptionUniversalLinksOnly : @YES};
[application openURL:URL options:options completionHandler:nil];
 
// Swift
let options = [UIApplicationOpenURLOptionUniversalLinksOnly : true]
UIApplication.shared.open(url, options: options, completionHandler: nil)

以上面示例,如果我设置它为true并打开URL:https://twitter.com/kharrison 时, 如果我并没有安装Twitter app那它就会失败,同时会调用safari来打开这个链接。(非常感谢Kamil对本文的建议)。

进一步阅读:
What's New in iOS -查看UIKit 部分?

Querying URL Schemes with canOpenURL

三、跳转到系统的设置界面

(以下设置只在真机上有效,如果无法跳转,在项目中的info中添加URL types,添加URL Schemes 为 prefs 的 url)


22.png
NSURL *url = [NSURL URLWithString:@"prefs:root=WIFI"];
if ([[UIApplication sharedApplication] canOpenURL:url]){
    [[UIApplication sharedApplication] openURL:url];
}

设置中心的一些sheme

在不同的SDK上有可能会不适用,请自行验证。标注未通过的,是我未验证通过的

Airplane Mode On — prefs:root=AIRPLANE_MODE(飞行模式)
Wi-Fi — prefs:root=WIFI(无线局域网,即WIFI)
INTERNET_TETHERING — prefs:root=INTERNET_TETHERING(个人热点)

=======================================
Notification — prefs:root=NOTIFICATIONS_ID(通知)
ControlCenter — prefs:root=ControlCenter(控制中心)
Brightness — prefs:root=Brightness(显示与亮度)—未通过
Wallpaper — prefs:root=Wallpaper(墙纸)
Sounds — prefs:root=Sounds(声音)
Ringtone — prefs:root=Sounds&path=Ringtone(电话铃声)
iCloud — prefs:root=CASTLE(iCloud)
iCloud Storage & Backup — prefs:root=CASTLE&path=STORAGE_AND_BACKUP(iCloud 存储空间)
Store — prefs:root=STORE(iTunes Store 与 APP Store)
ACCOUNT_SETTINGS — prefs:root=ACCOUNT_SETTINGS(邮件、通讯录、日历)
Notes — prefs:root=NOTES(备忘录)
Phone — prefs:root=Phone(电话)
FaceTime — prefs:root=FACETIME(FaceTime)
Safari — prefs:root=SAFARI(Safari)
Music — prefs:root=MUSIC(音乐)
Music Equalizer — prefs:root=MUSIC&path=EQ—未通过
Music Volume Limit — prefs:root=MUSIC&path=VolumeLimit—未通过
VIDEO — prefs:root=VIDEO(视频)
Photos — prefs:root=Photos(照片与相机)
Twitter — prefs:root=TWITTER(Twitter)
Nike + iPod — prefs:root=NIKE_PLUS_IPOD

============通用============
General — prefs:root=General(通用)
About — prefs:root=General&path=About(关于本机)
Software Update — prefs:root=General&path=SOFTWARE_UPDATE_LINK(软件更新)
Siri — prefs:root=General&path=SIRI(Siri)
Accessibility — prefs:root=General&path=ACCESSIBILITY(辅助功能)
Auto-Lock — prefs:root=General&path=AUTOLOCK(自动锁定)
Network — prefs:root=General&path=Network—未通过
Date & Time — prefs:root=General&path=DATE_AND_TIME(时间与日期)
Keyboard — prefs:root=General&path=Keyboard(键盘)
International — prefs:root=General&path=INTERNATIONAL(语言与地区)
Profile — prefs:root=General&path=ManagedConfigurationList(描述文件)
Reset — prefs:root=General&path=Reset(还原)
VPN — prefs:root=General&path=VPN(VPN)
Usage — prefs:root=General&path=USAGE—未通过
Usage — prefs:root=General&path=USAGE/CELLULAR_USAGE—未通过
Assistant — prefs:root=General&path=Assistant—未通过

==============隐私================
privacy — prefs:root=Privacy(隐私)
privacyLocationServices — prefs:root=LOCATION_SERVICES(定位服务)
privacyContacts — prefs:root=Privacy&path=CONTACTS(隐私-通讯录)
privacyCalendars — prefs:root=Privacy&path=CALENDARS(隐私-日历)
privacyReminders — prefs:root=Privacy&path=REMINDERS(隐私-提醒事项)
privacyPhotos — prefs:root=Privacy&path=PHOTOS(隐私-照片)
privacyBluetooth — prefs:root=Bluetooth(蓝牙)
privacyMicrophone — prefs:root=Privacy&path=MICROPHONE(隐私-麦克风)
privacyCamera — prefs:root=Privacy&path=CAMERA(隐私-相机)
privacyHealth — prefs:root=Privacy&path=HEALTH(隐私-健康)
privacyHomeKit — prefs:root=Privacy&path=HomeKit(隐私-HomeKit)—未通过
privacyMotion&Fitness — prefs:root=Privacy&path=Motion_Fitness(隐私-运动与健康)—未通过

隐私部分的授权检测,请参考隐私授权检测

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容