ShareExtension で処理をして後にアプリを起動していたのですが、Xcode をバージョンアップしたらエラーになってしまいました。
APPLICATION_EXTENSION_API_ONLY で怒られたので、その対処法(という名の応急処置)を記載します。
他にいい方法あるんじゃないかと思ってますので、知ってたら教えてください!
開発環境(前提条件)
・Xcode12.5(21年05月02日に再確認済み)
・Swift5
・ShareExtension の APPLICATION_EXTENSION_API_ONLY を NO に設定
実装していた方法
Xcode12.5 にアップデートをしてビルドしたら、以下のようなエラーが発生しました。
(執筆時はベータ版でしたが、改めてリリース版で確認しました)
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 にしたまま処理できるのかな…一応調べたのですが分からなかったので、情報あれば教えてくださいませ。



コメント