【问题标题】:UIActivityViewController is not working in iOS 11UIActivityViewController 在 iOS 11 中不起作用
【发布时间】:2018-03-06 02:01:35
【问题描述】:

我正在使用 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 视图服务扩展的连接时超时。

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

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

【问题讨论】:

  • 清理并运行一次,你确定你在使用UIActivityViewController后遇到过timed out waiting to establish a connection to the ShareUI view service extension.的问题
  • 你能显示shareItemArray
  • 清理并运行它,兄弟,在现在打开 uiactivityviewcontroller 之后,我得到了同样的超时错误 2 或 3 次。
  • 在该 shareItemArray 中,我只有以下 NSUrl "60secondsnow.com/ta/tamil-nadu/…"
  • 我认为问题出在其他地方

标签: ios objective-c iphone uiactivityviewcontroller xcode9


【解决方案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:
  • 哦,是的,伙计,你是对的。就我而言,我有一个 HUD 动画并且要正常工作,我需要双队列。您还有其他解决方案吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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 我在打开共享视图并在日志中收到此错误时崩溃, 在等待建立与 ShareUI 视图服务扩展的连接时超时。你能帮忙吗?
    • @SamkitShah 我不知道,我会假设一些系统级服务失败了。尝试重新启动您的设备(iPhone 6s 或更低版本上的 Power+Home,iPhone 7 或更新版本上的 Power+VolumeDown,当您看到 Apple 启动标志时松开按钮)。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多