以下のコードを使用して、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回開かれた後、もう一度試しましたが、最初に同じ上記のエラーが発生し、2回目はUIActivityViewControllerのみが開かれています。
ユーザーインターフェイスを変更するすべてのコードは、設計上、メインキューで実行する必要があります。だからあなたがする必要があるのはこれだけです:
_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);
}
これを試して:
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では問題なく動作しました。
私も同じ問題を抱えていて、UIスレッドで呼び出していないことがわかりました。 UIスレッドで実行して、問題が解決するかどうかを確認してください