这是我以前做的:
UIWebView * webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
NSString *urlString = @"https://itunes.apple.com/us/app/watuu/id304697459";
NSString * content = [NSString stringWithFormat : @"<head><meta http-equiv='refresh' content='0; URL=%@'></head>", urlString];
[webView loadHTMLString:content baseURL:nil];
[self.view addSubview:webView];
[webView performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:2.0];
请注意,在这种情况下,我将从 UIInputViewController 实例化此调用。
此方法也应该使用包含应用程序的 URL 方案
更新 04/17/2015:这不适用于 iOS 8.3。我们正在寻找解决方案,我们将尽快更新答案
更新 06/01/2015:我们找到了适用于 iOS 8.3 的解决方案
var responder = self as UIResponder?
while (responder != nil){
if responder!.respondsToSelector(Selector("openURL:")) == true{
responder!.callSelector(Selector("openURL:"), object: url, delay: 0)
}
responder = responder!.nextResponder()
}
这将找到一个合适的响应者来发送 openURL。
您需要添加此扩展来替换 performSelector 以实现 swift 并帮助构建机制:
extension NSObject {
func callSelector(selector: Selector, object: AnyObject?, delay: NSTimeInterval) {
let delay = delay * Double(NSEC_PER_SEC)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(time, dispatch_get_main_queue(), {
NSThread.detachNewThreadSelector(selector, toTarget:self, withObject: object)
})
}
}
2015 年 6 月 15 日更新:Objective-C
有人要了 Objective-C 中的代码,所以就在这里。我不打算运行它,因为我现在没有时间,但它应该很简单:
UIResponder *responder = self;
while(responder){
if ([responder respondsToSelector: @selector(OpenURL:)]){
[responder performSelector: @selector(OpenURL:) withObject: [NSURL URLWithString:@"www.google.com" ]];
}
responder = [responder nextResponder];
}
如前所述,我没有运行这个 Objective-C 代码,它只是 Swift 代码的转换。如果您遇到任何问题和解决方案,请告诉我,我会更新它。现在,我只是在使用 swift,不幸的是我的大脑正在弃用 Objective-C
2016 年 5 月 2 日更新:已弃用的功能
正如@KyleKIM 所指出的,Selector 函数在 Swift 2.2 中已被 #selector 取代。此外,还有一个功能已被弃用,可能会在 Swift 3.0 中被删除,所以我正在做一些研究以寻找替代方案。
2016 年9 月 16 日更新:XCode 8、Swift 3.0 和 iOS10
以下代码仍在上述版本上运行。你会得到一些警告:
let url = NSURL(string:urlString)
let context = NSExtensionContext()
context.open(url! as URL, completionHandler: nil)
var responder = self as UIResponder?
while (responder != nil){
if responder?.responds(to: Selector("openURL:")) == true{
responder?.perform(Selector("openURL:"), with: url)
}
responder = responder!.next
}
2017 年 6 月 15 日更新:XCode 8.3.3
let url = NSURL(string: urlString)
let selectorOpenURL = sel_registerName("openURL:")
let context = NSExtensionContext()
context.open(url! as URL, completionHandler: nil)
var responder = self as UIResponder?
while (responder != nil){
if responder?.responds(to: selectorOpenURL) == true{
responder?.perform(selectorOpenURL, with: url)
}
responder = responder!.next
}