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()
在那里不是必需的(当然,假设你没有从另一个队列手动调用那些 IBAction
s)。
请注意 alloc
/init
和 setExcludedActivityTypes:
不会更新 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);
}
我正在使用 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()
在那里不是必需的(当然,假设你没有从另一个队列手动调用那些 IBAction
s)。
请注意 alloc
/init
和 setExcludedActivityTypes:
不会更新 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);
}