UIActivityViewController 在 iOS 11 中不工作

UIActivityViewController is not working in iOS 11

我正在使用 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] 错误:等待与 ShareUI 视图服务扩展建立连接时超时。

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

编辑:清理和 运行 项目后,我尝试做同样的事情,在打开 UIActivityViewController 2 或 3 次后,我再次尝试,这是我第一次遇到与上述相同的错误,第二次只有 UIActivityViewController 被打开。

我遇到了同样的问题,我发现我没有调用 UI 线程。尝试在 UI 线程中 运行 并查看是否解决问题

试试这个:

    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 中它工作正常。

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

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,因此无需在主队列中调用它们。

对于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);
}