gpt4 book ai didi

ios - openURL 在 Action Extension 中不起作用

转载 作者:IT王子 更新时间:2023-10-29 07:38:31 30 4
gpt4 key购买 nike

我添加以下代码:

- (IBAction)done {
// Return any edited content to the host app.
// This template doesn't do anything, so we just echo the passed in items.

NSURL *url = [NSURL URLWithString:@"lister://today"];
[self.extensionContext openURL:url completionHandler:^(BOOL success) {
NSLog(@"fun=%s after completion. success=%d", __func__, success);
}];
[self.extensionContext completeRequestReturningItems:self.extensionContext.inputItems completionHandler:nil];

}

在我创建 Action 扩展目标之后。但它不能工作。

我的目的是:当用户在 Photos.app(iOS 的默认 Photos.app 或称为图库)中查看照片时,他单击共享按钮以启动我们的扩展 View 。我们可以将图像从 Photos.app 传输到我自己的应用程序,并在我的应用程序中处理或上传图像。

我也试过“CFBundleDocumentTypes”,但它也不起作用。

我们将不胜感激。

最佳答案

这是我以前做的:

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 方案工作

2015 年 4 月 17 日更新:这不适用于 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 for 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
}

关于ios - openURL 在 Action Extension 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24297273/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com