【问题标题】:How to launch Safari and open URL from iOS app如何从 iOS 应用程序启动 Safari 并打开 URL
【发布时间】:2012-09-07 03:26:40
【问题描述】:

在设置页面上,我想包含三个链接

  • 我的应用支持网站
  • YouTube 应用教程
  • 我的主站点(即:链接到“由 Dale Dietrich 创建”标签。)

我搜索了这个网站、网络和我的文档,但没有发现任何明显的东西。

注意:我不想在我的应用中打开网页。我只想将链接发送到 Safari,并且该链接在那里打开。我在他们的设置页面中看到许多应用程序在做同样的事情,所以这一定是可能的。

【问题讨论】:

  • 我在使用 Ionic Cordova 应用程序的混合开发中面临同样的问题

标签: ios url mobile-safari


【解决方案1】:

看看 UIApplication 上的-openURL: 方法。它应该允许您将 NSURL 实例传递给系统,这将确定在哪个应用程序中打开它并启动该应用程序。 (请记住,您可能需要先检查-canOpenURL:,以防系统上当前安装的应用程序无法处理该URL - 尽管这对于普通的http:// 链接可能不是问题。)

【讨论】:

  • 谢谢蒂姆。你说得对。当你进来时,我正在添加我自己的答案。对此感到抱歉。但至少对于那些关注我的人来说,现在有一个简单的方法。
  • 不用担心 - 很高兴您找到了解决方案!
  • openURL(_:) 在 iOS 10.0 中已弃用,您应该在 UIApplication 上调用实例方法 open(_:options:completionHandler:)
【解决方案2】:

这就是我所做的:

  1. 我在头 .h 文件中创建了一个 IBAction,如下所示:

     - (IBAction)openDaleDietrichDotCom:(id)sender;
    
  2. 我在“设置”页面上添加了一个 UIButton,其中包含我要链接到的文本。

  3. 我将按钮正确连接到文件所有者中的 IBAction。

  4. 然后执行以下操作:

Objective-C

- (IBAction)openDaleDietrichDotCom:(id)sender {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.daledietrich.com"]];
}

斯威夫特

(viewController中的IBAction,而不是头文件)

if let link = URL(string: "https://yoursite.com") {
  UIApplication.shared.open(link)
}

注意我们不需要转义字符串和/或地址,例如:

let myNormalString = "https://example.com";
let myEscapedString = myNormalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!

其实转义可能会导致打开失败。

【讨论】:

  • 但这不是 100%,因为如果有人使用越狱的 iOS 并使用 Chrome 或其他东西作为默认浏览器,那么这将打开它,而不是 Safari
  • 我觉得如果有人努力越狱他们的手机以使 Chrome 成为默认浏览器,那么尊重该设置可能是理想的行为。
  • 我明白这一点,但如果我正在打开一个网站并且用户现在正在浏览该网站,如果他停在某个特定页面,那么我可以在我的代码中获取当前网页链接吗?
  • 以上方法已弃用,现在使用以下方法。 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:self.advertisement.url] options:@{} completionHandler:^(BOOL success) { }];
  • @Laszlo 另外,在设置中,我们可以在限制中禁用 Safari。我使用 URL 方案 http 和 https 编写了一个应用程序,以在打开 http 或 https URL 并且禁用 Safari 时打开其他浏览器。因此,即使没有越狱,我们也可以在技术上更改默认网络浏览器。
【解决方案3】:

Swift 语法:

UIApplication.sharedApplication().openURL(NSURL(string:"http://www.reddit.com/")!)

适用于 iOS 9.3 及更早版本的新 Swift 语法

作为 Swift 的一些新版本(可能是 swift 2?), UIApplication.sharedApplication() 现在是 UIApplication.shared (我猜是为了更好地利用计算属性)。此外,URL 不再隐式转换为 NSURL,必须使用 as! 显式转换!

UIApplication.sharedApplication.openURL(NSURL(string:"http://www.reddit.com/") as! URL)

iOS 10.0 的新 Swift 语法

从 iOS 10.0 开始,openURL 方法已被弃用,取而代之的是一种更通用的方法,该方法采用选项对象和异步完成处理程序

UIApplication.shared.open(NSURL(string:"http://www.reddit.com/")! as URL)

【讨论】:

  • Swift 版本的答案对 Swift 开发人员非常有用,它是一种没有大量文档的新语言,尤其是。关于解决现实世界的iOS问题。就我而言,自动完成选择了“fileURLWithPath:”选择器,我没有意识到这就是我的 URL 没有打开的原因,只是通过阅读达斯汀的回答,我才看到我应该使用“字符串:”选择器.所以应该支持达斯汀,而不是责备。
  • @g_fred。为什么他不能包含 Swift 版本?
  • openURL(_:) 在 iOS 10.0 中已被弃用,您应该在 UIApplication 上调用实例方法 open(_:options:completionHandler:)
  • 您可以直接使用 URL 代替 NSURL 以便保存演员表。
  • 我建议永远不要强制展开。 if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) } 将永远为您提供更好的服务。可能想要assertelse 语句中的错误来捕获拼写错误。
【解决方案4】:

而且,如果您不确定提供的 URL text 是否有方案:

NSString* text = @"www.apple.com";
NSURL*    url  = [[NSURL alloc] initWithString:text];

if (url.scheme.length == 0)
{
    text = [@"http://" stringByAppendingString:text];
    url  = [[NSURL alloc] initWithString:text];
}

[[UIApplication sharedApplication] openURL:url];

【讨论】:

  • @Vlad 这只是一个硬编码示例。通常,url 字符串(此处为text)不会被硬编码,您需要这样的代码。
  • @Vlad 您是否感到沮丧,如果是,如何/为什么?我认为人们不会只是复制上面的代码。
  • 意义问题由你决定:)
【解决方案5】:

这里需要检查要打开的 url 是否能够被设备或模拟器打开。因为有时(大多数在模拟器中)我发现它会导致崩溃。

Objective-C

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

Swift 2.0

let url : NSURL = NSURL(string: "some url")!
if UIApplication.sharedApplication().canOpenURL(url) {
     UIApplication.sharedApplication().openURL(url)
}

斯威夫特 4.2

guard let url = URL(string: "some url") else {
    return
}
if UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

【讨论】:

  • 您可以随时打开 HTTP / HTTPS。从 iOS 9 开始,您需要将任何想要调用 canOpenURL 的 URL 列入白名单。我不明白你为什么不简单地打电话给openURL:url,如果它失败了,处理失败。 canOpenURL主要用于在不离开当前应用的情况下检测应用的安装。
  • openURL(_:) 在 iOS 10.0 中已弃用,您应该在 UIApplication 上调用实例方法 open(_:options:completionHandler:)
【解决方案6】:

在 SWIFT 3.0 中

               if let url = URL(string: "https://www.google.com") {
                 UIApplication.shared.open(url, options: [:])
               }

【讨论】:

    【解决方案7】:

    openURL(:) 在 iOS 10.0 中已弃用,您应该在 UIApplication 上使用以下实例方法:open(:options:completionHandler:)

    使用 Swift 的示例
    这将在 Safari 中打开“https://apple.com”。

    if let url = URL(string: "https://apple.com") {
        if UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        }
    }
    

    https://developer.apple.com/reference/uikit/uiapplication/1648685-open

    【讨论】:

      【解决方案8】:

      试试这个:

      NSString *URL = @"xyz.com";
      if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:URL]])
      {
           [[UIApplication sharedApplication] openURL:[NSURL URLWithString:URL]];
      }
      

      【讨论】:

        【解决方案9】:

        不推荐使用的 Objective-C 版本是:

        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://apple.com"] options:@{} completionHandler:nil];
        

        【讨论】:

          【解决方案10】:

          在 Swift 1.2 中,试试这个:

          let pth = "http://www.google.com"
              if let url = NSURL(string: pth){
                  UIApplication.sharedApplication().openURL(url)
          

          【讨论】:

          • 请告诉我你写的新代码是什么,你给我投了反对票
          【解决方案11】:

          Swift 3.0

          if let url = URL(string: "https://www.reddit.com") {
              if #available(iOS 10.0, *) {
                  UIApplication.shared.open(url, options: [:])
              } else {
                  UIApplication.shared.openURL(url)
              }
          }
          

          这也支持运行旧版本 iOS 的设备

          【讨论】:

            【解决方案12】:

            斯威夫特 3 带有完成按钮的解决方案

            别忘了import SafariServices

            if let url = URL(string: "http://www.yoururl.com/") {
                        let vc = SFSafariViewController(url: url, entersReaderIfAvailable: true)
                        present(vc, animated: true)
                    }
            

            【讨论】:

            • 这是适用于 iOS 和 iOS 扩展的完美答案。其他答案仅适用于应用程序,不能用于扩展程序。
            【解决方案13】:

            Swift 4 解决方案:

            UIApplication.shared.open(NSURL(string:"http://yo.lo")! as URL, options: [String : Any](), completionHandler: nil)
            

            【讨论】:

            • 一个合适的 Swift 4 版本会使用 URL 而不是 NSURL。并且将 NSURL 转换为 URL 是不一样的。有关说明,请参阅 stackoverflow.com/a/37812485/2227743。此外,强制展开也很糟糕。
            【解决方案14】:

            由于自 iOS 10.0 起已弃用此答案,因此更好的答案是:

            if #available(iOS 10.0, *) {
                UIApplication.shared.open(url, options: [:], completionHandler: nil)
            }else{
                UIApplication.shared.openURL(url)
            }
            

            y en Objective-c

            [[UIApplication sharedApplication] openURL:@"url string" options:@{} completionHandler:^(BOOL success) {
                    if (success) {
                        NSLog(@"Opened url");
                    }
                }];
            

            【讨论】:

              【解决方案15】:

              斯威夫特 5:

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

              用法:

              open(scheme: "http://www.bing.com")
              

              参考:

              OpenURL in iOS10

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-10-12
                • 2018-03-06
                • 2020-04-12
                • 1970-01-01
                • 1970-01-01
                • 2016-06-22
                • 2010-10-23
                • 2023-03-04
                相关资源
                最近更新 更多