【Swift5】ShareExtension からアプリを開く

ShareExtension で処理をして後にアプリを起動していたのですが、Xcode をバージョンアップしたらエラーになってしまいました。
APPLICATION_EXTENSION_API_ONLY で怒られたので、その対処法(という名の応急処置)を記載します。
他にいい方法あるんじゃないかと思ってますので、知ってたら教えてください!

開発環境(前提条件)

・Xcode12.5(21年05月02日に再確認済み)
・Swift5
・ShareExtension の APPLICATION_EXTENSION_API_ONLY を NO に設定

実装していた方法

Xcode12.5 にアップデートをしてビルドしたら、以下のようなエラーが発生しました。
(執筆時はベータ版でしたが、改めてリリース版で確認しました)

Showing Recent Messages Application extensions and any libraries they link to must be built with the `APPLICATION_EXTENSION_API_ONLY` build setting set to YES.

APPLICATION_EXTENSION_API_ONLY を YES にしろって言われてます。
ShareExtension の画面を閉じてからアプリに戻りたかったので、APPLICATION_EXTENSION_API_ONLY は NO に設定して、以下のようにコードを記載していました。

self.extensionContext?.completeRequest(returningItems: nil, completionHandler: { _ in
    UIApplication.shared.open(URL.scheme, completionHandler: nil)
})

これがエラーになったわけです。
とりあえず YES にしないといけないわけですが、それやっちゃうと open(_:options:completionHandler:) が使えなくなるんですよ。
開きたいアプリ側にも処理書きまくってたので、修正すんのめんどくせぇなと思ったら、別の方法がありました。

解決方法

以下のようにセレクタ使う方法が stackoverflow にありました。

self.extensionContext?.completeRequest(returningItems: nil, completionHandler: { _ in
    let selector = sel_registerName("openURL:")
    var responder = self as UIResponder?
    while let r = responder, !r.responds(to: selector) {
        responder = r.next
    }
    _ = responder?.perform(selector, with: URL.scheme)
})

セレクタ名でわかると思いますが、iOS10 で非推奨になった openURL を使っています。
非推奨になってからだいぶ経っているので、近々廃止になるんじゃないかと思ってます (´·ω·`)
open(_:options:completionHandler:) 使いたいけど、セレクタ使えんし…何かいい方法あるか考えたのですが、ちっとも浮かびませんでした!

ので、こんな方法あるよって方いたら教えてください。

さいごに

アプリ間の疎結合ハンパなさすぎてつらい (´×ω×`)
APPLICATION_EXTENSION_API_ONLY を NO にしたまま処理できるのかな…一応調べたのですが分からなかったので、情報あれば教えてくださいませ。

Swift
スポンサーリンク

コメント