如何从 iOS 应用程序启动 Safari 并打开 URL

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

我在使用 Ionic Cordova 应用程序的混合开发中面临同样的问题 【参考方案1】:

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

【讨论】:

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

这就是我所做的:

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

     - (IBAction)openDaleDietrichDotCom:(id)sender;
    

    我在“设置”页面上添加了一个 UIButton,其中包含我要链接到的文本。

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

    然后执行以下操作:

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 是不一样的。有关说明,请参阅 ***.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

【讨论】:

以上是关于如何从 iOS 应用程序启动 Safari 并打开 URL的主要内容,如果未能解决你的问题,请参考以下文章

从 IOS 启动 Safari

如何从Safari启动RSS阅读器应用程序?

不断收到“在 YourAppName 中打开此页面?”的警报视图消息?尝试从 Safari 启动应用程序时

如何从 iOS 上的本机 Facebook 应用程序在 Safari 中打开移动 webapp 链接?

ios App:如何打开 facebook 链接并确保它是在 safari 而不是在本机应用程序中打开的?

从 iOS Safari 抓取 URL