如何从 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)
将永远为您提供更好的服务。可能想要assert
和else
语句中的错误来捕获拼写错误。【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章
不断收到“在 YourAppName 中打开此页面?”的警报视图消息?尝试从 Safari 启动应用程序时
如何从 iOS 上的本机 Facebook 应用程序在 Safari 中打开移动 webapp 链接?