酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

iOS 13.0以降で「モーダルで開いた画面」上でUIActivityViewControllerを使うと「モーダルで開いた画面」まで閉じられる現象

iOS 12.4のiPhone Xでは発生しておらず、iOS 13デバイスでのみ発生している事象です。

iOS 13.0以降、「モーダルで開いた画面」上で UIActivityViewController を使うと「モーダルで開いた画面」まで閉じられます。

発生する現象

  1. 画面A -> fullScreenのモーダルで画面Bを表示
  2. 画面B上で UIActivityViewControllerを表示
  3. UIActivityViewControllerで画像を保存したりTwitterに投稿するとシェア画面を閉じる
  4. ついでに、なぜか画面Bまで閉じられてしまう

という現象を指摘されました。

iOS 13.5で発生するのを確認しています。13.3.1の時点から発生しているようです。

解決策

同様の現象について報告している日本語記事を見つけることができず、頼みの綱の Stack Overflow でもすぐに探すことはできませんでした。そんななかこの質問を発見しました。

swift - iOS 13 UIActivityViewController automatically present previous VC after image saving - Stack Overflow

対策としては、勝手に画面が閉じられるなら閉じられる用の画面を差し出すようにします。

@IBAction func shareButtonAction(_ sender: Any) {
    let image = getShareImage()

    let vc = UIActivityViewController(activityItems: [ image ], applicationActivities: nil)

    vc.completionWithItemsHandler = { (activityType, completed, returnedItems, error) in
        UIApplication.shared.delegate?.window??.makeKeyAndVisible()
    }

    if #available(iOS 13.0, *) {
        activityWindow.makeKeyAndVisible()
        activityWindow.rootViewController?.present(vc, animated: true)
    } else {
        present(vc, animated: true)
    }
}

private let activityWindow: UIWindow = {
    let window = UIWindow(frame: UIScreen.main.bounds)
    window.rootViewController = UIViewController()
    return window
}()