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


215

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

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

我搜索了该站点,网络和文档,但没有发现任何明显的内容。

注意:我不想在我的应用程序中打开网页。我只想将链接发送到Safari,然后在那打开链接。我已经在其“设置”页面中看到许多应用程序在做同样的事情,所以这一定是可能的。


我在使用Ionic Cordova应用程序进行混合开发时遇到的同一问题
Sopo,2017年

Answers:


386

这是我所做的:

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

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

  3. 我将按钮适当地连接到文件所有者中的IBAction。

  4. 然后执行以下操作:

物镜

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

8
但这不是100%,因为如果有人使用越狱的iOS并使用Chrome或其他默认浏览器,则会打开该文件,而不是Safari
Laszlo 2013年

214
我觉得如果有人为了越过手机越狱而将Chrome设置为默认浏览器,请兑现这一设置可能是理想的行为。
rpowell

我了解这一点,但是如果我打开一个网站并且如果用户现在停在特定页面上,那么他现在正在浏览该网站,那么我能否在代码中获取当前的网页链接?
Varun Jain'6

3
现在不建议使用上述方法,请使用以下方法。[[UIApplication sharedApplication] openURL:[NSURL URLWithString:self.advertisement.url]选项:@ {} completeHandler:^(BOOL成功){}];
马什哈迪

@Laszlo另外,在设置中,我们可以在“限制”中禁用Safari。当打开http或https URL并禁用Safari时,我使用URL方案http和https编码了一个应用程序,以打开其他浏览器。因此,即使没有越狱,我们也可以从技术上更改默认的Web浏览器。
ColdGrub1384

164

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语法

不推荐使用openURL方法,并由功能更广泛的方法取代,该方法从iOS 10.0起采用了options对象和异步完成处理程序

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

31
Swift版本的答案对Swift开发人员非常有用,这是一种没有大量文档的新语言,尤其是。解决现实世界中的iOS问题。就我而言,自动完成功能选择了“ fileURLWithPath:”选择器,但我没有意识到这就是为什么我的URL无法打开的原因,只是通过阅读Dustin的回答,我发现我应该使用“ string:”选择器。因此,达斯汀应该被推崇,而不是受到责难。
SafeFastExpressive

3
@g_fred。为什么他不能包含Swift版本?
ericgu 2015年

2
openURL(_:)在iOS 10.0中已弃用,而是应open(_:options:completionHandler:)在UIApplication上调用实例方法。
Ryan H.

2
您可以直接使用URL而不是NSURL来保存演员表。
marsbear

1
我建议不要强行打开包装。 if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }将永远为您服务。可能要assertelse语句中的错误捕捉错别字。
philipp

53

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

物镜

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

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

1
您可以随时打开HTTP / HTTPS。从iOS 9开始,您需要将要调用的所有URL列入白名单canOpenURL。我不明白您为什么不直接打电话openURL:url,如果失败了,请处理失败。canOpenURL主要用于在不离开当前应用程序的情况下检测应用程序的安装。
Ben Flynn

1
openURL(_:)在iOS 10.0中已弃用,而是应open(_:options:completionHandler:)在UIApplication上调用实例方法。
Ryan H.

20

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


谢谢蒂姆。您说得对。当您加入时,我正在添加自己的答案。很抱歉。但是至少对于跟随我的人来说,现在至少有一个简单的方法。
Dale Dietrich 2012年

不用担心-很高兴您找到了解决方案!
蒂姆(Tim)

1
openURL(_:)在iOS 10.0中已弃用,而是应open(_:options:completionHandler:)在UIApplication上调用实例方法。
Ryan H.

17

并且,如果您不确定所提供的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您是否感到沮丧,如果可以,为什么/为什么?我认为人们不仅会复制上面的代码。
含义-

1
含义由您决定:)
Vlad

13

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

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

10

斯威夫特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的设备


10

具有完成按钮的Swift 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扩展的完美答案。其他答案仅在应用程序中有效,而不能在扩展程序中使用。
Owen Zhao

5

由于自iOS 10.0起不赞成使用此答案,因此更好的答案是:

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

是Objective-c

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


2

在SWIFT 3.0中

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

2

斯威夫特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")

参考:

iOS10中的OpenURL


1

试试这个:

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

0

在Swift 1.2中,请尝试以下操作:

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

请告诉我您所编写的代码中有什么新内容,并且您否决了我的投票
Dilip Tiwari

-2

Swift 4解决方案:

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

1
正确的Swift 4版本将使用URL,而不使用NSURL。并且将NSURL强制转换为URL是不一样的。有关说明,请参阅stackoverflow.com/a/37812485/2227743。另外,强制展开是不好的。
艾瑞克·艾雅
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.