web-dev-qa-db-ja.com

UIActivityViewControllerが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回開かれた後、もう一度試しましたが、最初に同じ上記のエラーが発生し、2回目はUIActivityViewControllerのみが開かれています。

15
R. Mohan

ユーザーインターフェイスを変更するすべてのコードは、設計上、メインキューで実行する必要があります。だからあなたがする必要があるのはこれだけです:

_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/initおよび_setExcludedActivityTypes:_はUIを更新しないため、メインキューでこれらを呼び出す必要がないことに注意してください。

8
Alejandro Iván

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);
}
7
vp2698

これを試して:

    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では問題なく動作しました。

1

私も同じ問題を抱えていて、UIスレッドで呼び出していないことがわかりました。 UIスレッドで実行して、問題が解決するかどうかを確認してください