UIActivityViewController在iOS 11中无法工作。

15

我正在使用UIActivityViewController来分享文章的URL,使用以下代码:

UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItemArray applicationActivities:nil];

activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop]; 

[self presentViewController:activityVC animated:YES completion:nil];

以上代码适用于iOS 9&10,但在iOS 11中不起作用。

我进行了调试,代码执行得很好,之后我在控制台上得到一个错误日志,如下所示

[ShareSheet] ERROR:超时等待建立与ShareUI视图服务扩展的连接。

有人面临这个问题吗? 是否有解决方法?

编辑:清理并运行项目后,我尝试做同样的事情,在2或3次之后,UIActivityViewController被打开了,再次尝试,第一次我会得到同样的错误,只有第二次才会打开UIActivityViewController。


清理并运行一次,您确定在使用“UIActivityViewController”后遇到了“超时等待建立连接到ShareUI视图服务扩展”的问题吗? - Anbu.Karthik
清理并运行它,兄弟。我遇到了相同的超时错误2或3次,之后UIActivityViewController现在打开了。 - R. Mohan
在shareItemArray中,我只有以下NSUrl:“http://www.60secondsnow.com/ta/tamil-nadu/opening-water-from-mullaperiyar-dam-627610.html” - R. Mohan
我认为问题出在其他地方。 - Anbu.Karthik
有人能解释一下为什么错误已被记录,但界面似乎没有响应吗?假设您想将其保留在主线程中,是否缺少某些内容可以捕获错误? - benc
显示剩余4条评论
4个回答

8

对于Swift 4.0版本

let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: [shareItem], applicationActivities:nil)
activityViewController.excludedActivityTypes = [.print, .copyToPasteboard, .assignToContact, .saveToCameraRoll, .airDrop]

DispatchQueue.main.async {
   self.present(activityViewController, animated: true, completion: nil);
}

8

所有修改用户界面的代码都需要在主队列中运行,这是设计上的要求。所以你只需要这样做:

UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItemArray applicationActivities:nil];

activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop]; 

dispatch_async(dispatch_get_main_queue(), ^{
    [self presentViewController:activityVC animated:YES completion:nil];
});

稍作说明:dispatch_async()会将您传递给它的块排队,以便在未来的某个时间安全地更新UI时运行。如果您不在主队列上执行此操作,则可能会发生奇怪的事情(有时UI根本不会更改,或者旧更改可能会在新更改后应用,等等)。
从UI中的用户操作发送消息的方法(例如,在IBAction中,当您点击按钮时)已经在主队列上运行,因此在那里不需要使用dispatch_async()(当然,假设您不是手动从另一个队列调用这些IBActions)。
请注意,alloc/initsetExcludedActivityTypes:不会更新UI,因此没有必要在主队列上调用它们。

嘿@Alejandro Iván,当我打开共享视图时,我的应用程序崩溃了,并在日志中出现以下错误:<UIActivityViewController: 0x7fb80406ce00>超时等待建立与ShareUI视图服务扩展的连接。你能帮忙解决一下吗? - Samkit Shah
@SamkitShah 我不确定,我猜想可能是一些系统级别的服务出了问题。尝试重新启动你的设备(对于 iPhone 6s 或更早的机型,按下电源键+主页键;对于 iPhone 7 或更新的机型,按下电源键+音量减小键,在看到苹果启动标志后松开按钮)。 - Alejandro Iván

1

试试这个:

    dispatch_async(dispatch_get_main_queue(), ^{
         UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItemArray applicationActivities:nil];

         activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop]; 
         dispatch_async(dispatch_get_main_queue(), ^{
               [self presentViewController:activityVC animated:YES completion:nil];
         });
    });

我曾经遇到过同样的问题,但是在Swift3中运行得很好。


双主队列?有什么用?只需要在主队列中调用presentViewController:animated:completion:即可。 - Alejandro Iván
哦,是的,兄弟,你说得对。在我的情况下,我有一个HUD动画,为了使其正常工作,我需要双队列。你有其他解决方案吗? - Xande Rasta Moura

0
我曾经遇到同样的问题,后来发现是我没有在 UI 线程中调用。尝试在 UI 线程中运行,看看是否可以解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接