UIActivityViewController无法在iOS 11中运行

R. *_*han 14 iphone objective-c ios uiactivityviewcontroller xcode9

我正在使用UIActivityViewController来共享文章网址,使用下面的代码,

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

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

[self presentViewController:activityVC animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

上面的代码在iOS 9和10中工作,但它在iOS 11中不起作用

我调试它,代码执行正常,之后我在控制台中收到错误日志,如下所示

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

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

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

Ale*_*ván 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];
});
Run Code Online (Sandbox Code Playgroud)

稍微解释一下:dispatch_async()如果可以安全地更新UI,则会将您传递给它的块排入不久的将来运行.如果你不在主队列上这样做,可能会发生奇怪的事情(有时候UI根本不会改变,或者旧的改变可以在新的改变之后应用,或类似的东西).

从UI中的用户操作发出消息的方法(例如,IBAction当您点击按钮时)已经在主队列上运行,因此dispatch_async()在那里没有必要(当然,假设您没有IBAction从另一个队列手动调用它们) .

请注意alloc/ init并且setExcludedActivityTypes:不更新UI,因此无需在主队列上调用它们.


vp2*_*698 7

对于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);
}
Run Code Online (Sandbox Code Playgroud)