美文网首页iOS初中级开发iOS 学习笔记
iOS 跳转到系统的设置界面

iOS 跳转到系统的设置界面

作者: bingxuePI | 来源:发表于2017-04-01 14:25 被阅读1075次

    一、如何代码实现跳转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(隐私-运动与健康)—未通过
    

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

    相关文章

      网友评论

      • 梦里风吹过:请问跳转到系统的设置界面这条现在是不是不能用了呢?有人和我说这种方式已经是私有的了,现在不能用了,审核会被拒。

      本文标题:iOS 跳转到系统的设置界面

      本文链接:https://www.haomeiwen.com/subject/ebeiottx.html