アプリ開発の逆引き辞典

アプリ開発のTipsをまとめました

SwiftUIで UIActivityViewControllerを使って Tweetbotへ画像を共有して文字入力すると勝手にdismissされてしまう

iOSでテキストデータや画像を共有したい場合、UIActivityViewController を使用します。

SwiftUIではこのUIActivityViewControllerをラッピングして利用すると便利です。SwiftUIでUIActivityViewController を使う方法については「SwiftUIで UIActivityViewControllerを使って画像を共有する - SwiftUIなんもわからん」にて紹介しました。

大抵のアプリでは共有する処理で問題は発生しないのですが、確認できているなかでは唯一Tweetbotへ画像を共有して、文字入力すると勝手にdismissされる現象に遭遇しました。

f:id:ch3cooh393:20200801210346p:plain

実行環境

  • Xcode 11.6
  • iOS 13.6
  • Tweetbot 5.1.4

問題の挙動

UIActivityViewControllerを使って画像を共有します。大抵のアプリでは共有時に問題は発生しませんが、Tweetbotのみ画像を共有して共有エクステンションを表示させた状態でテキストを入力しようとすると、共有エクステンションが勝手にdismissされてしまいます。

文字入力した瞬間に activityTypenil で返ってしまいます。その時のログは以下の通りですが、いままで踏んだことのない地雷で戸惑っています。

MediaCropper[18763:4998440] [lifecycle  ] [u ABAE30D9-DA4A-4CD6-8580-1E8819AF5654:m (null)] [com.tapbots.Tweetbot4.shareextension(5.1.4)] Connection to plugin interrupted while in use.
MediaCropper[18763:4997352] [core] SLRemoteComposeViewController: (this may be harmless) viewServiceDidTerminateWithError: Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 "(null)" UserInfo={Message=Service Connection Interrupted}
MediaCropper[18763:4997352] viewServiceDidTerminateWithError:: Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 "(null)" UserInfo={Message=Service Connection Interrupted}
MediaCropper[18763:4998440] [lifecycle  ] [u ABAE30D9-DA4A-4CD6-8580-1E8819AF5654:m (null)] [com.tapbots.Tweetbot4.shareextension(5.1.4)] Connection to plugin invalidated while in use.

過去バージョンでUIKitでTweetbotへ画像を共有したときには何も発生していなかったと思うので、SwiftUI+Tweetbotの相性が悪くて発生しているのかもしれません。

解決編

2020/08/01時点で解決方法はなし。しばらく弄って解決しなかったら、SwiftUIのViewをホスティングするViewControllerを作って、そこから画像を共有するようにします。

調査の結果、

  • iOS 13.6 + Tweetbot 5.1.4で
  • 複数の画像を Tweetbotへ共有して
  • キーボードで文字入力すると 共有エクステンションがクラッシュする

ことがわかりました。

Photosアプリ(写真アプリ)から複数枚の写真を共有したときにも文字入力するとTweetbotの共有エクステンションがクラッシュすることが確認できたので、特にSwitUIは関係なかった。

ただ、SwiftUIから共有シートを表示させるとなぜか.fullScreenになってしまうので、UIViewControllerからUIActivityViewControllerを呼ぶように修正しました。

参考記事