ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我的应用支持网站

YouTube 应用教程

我的主站点(即:链接到“由 Dale Dietrich 创建”标签。)

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

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

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

T
Top-Master

这是我所做的:

我在头 .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";让 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 时打开其他浏览器。因此,即使没有越狱,我们也可以在技术上更改默认的网络浏览器。
M
Michael Peterson

斯威夫特语法:

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 语句中的错误来捕获拼写错误。
C
Chetan Prajapati

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

Objective-C

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

您始终可以打开 HTTP / HTTPS。从 iOS 9 开始,您需要将要调用 canOpenURL 的任何 URL 列入白名单。我不明白您为什么不简单地调用 openURL:url 并且如果它失败,则处理失败。 canOpenURL 主要用于在不离开当前应用程序的情况下检测应用程序的安装。
openURL(_:) 在 iOS 10.0 中已弃用,您应该在 UIApplication 上调用实例方法 open(_:options:completionHandler:)
T
Tim

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


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

并且,如果您不确定提供的 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您是否感到沮丧,如果是,如何/为什么?我假设人们不只是复制上面的代码。
意义问题这取决于你:)
A
Antzi

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

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

G
Greg T

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


B
Baher A

带有完成按钮的 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 扩展的完美答案。其他答案仅适用于应用程序,不能用于扩展程序。
D
Diego Jiménez

由于自 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");
        }
    }];

Z
Zgpeace

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


R
Ryan H.

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


O
OurangZeb Khan

在 SWIFT 3.0 中

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

a
arghtype

尝试这个:

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

a
aircraft

在 Swift 1.2 中,试试这个:

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

请告诉我你写的新代码是什么,你把我标记为否决票
K
Kevin ABRIOUX

斯威夫特 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。此外,强制展开是不好的。