はじめに
・2018年10月31日をもってTwitterKitのサポートが終了した。
・twitter連携アプリに、swifterを利用することにした。
・xcode11からSceneDelegateが導入されたされたため、callback urlの記述場所を変える必要がある。
・これに関して記述した記事がなくてめっちゃ詰まったので、記録として残す。
・全体的な手順は、この記事に従いました。わかりやすい。AppDelegateではなくSceneDelegateへの記述をしないとアプリが動かずめちゃくちゃ詰まったため、そこを書きます。
環境
xcode11.0
swift 5.0.1
iOS13
SceneDelegate上にコールバックUrlを設定
xcode11から、SceneDelegate.swiftが追加された。これにより、これまでAppDelegateに記述されていたコードの多くが、SceneDelegateに移行された。
【iOS】AppDelegate.swiftってなにしてんの?
【xcode 11】新たに導入されたsceneDelegateの各メソッドが呼ばれるタイミング
ゆえに、Twitter認証後にアプリに帰ってくる際に実行されるメソッドも、変化している。
これまで
AppDelegate上のapplication(_:open url:)
関数が、urlにてアプリが開かれた場合に実行されるメソッドのため、
import Swifter
## 省略 ##
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
return Swifter.handleOpenURL(url, callbackURL: URL(string: "swifter-{Consumer API key}://")!)
}
## 省略 ##
と記述することでcallback後の挙動を制御できていた。
今後
・Xcode11では、SceneDelegate上のscene(_:openURLContexts:)
関数が、urlにてアプリが開かれた場合に実行されるメソッドとなっている。
・CustomURLSchemeを設定する場合には、アプリ遷移後の挙動はscene(_:openURLContexts:)
関数で制御する。
stackoverflow : Custom URL Scheme not working on Swift 5, Xcode 11
・URLContextsには何が格納されているのか。
実際に何が格納されているのかを確認する。以下のコードを記述後、シミュレータ上のsafariでswifter-<ConsumerAPIkey>://
を入力し、アプリに飛ぶと出力は以下。
import Swifter
## 省略 ##
// callback urlの設定
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>){
print(URLContexts)
}
## 省略 ##
これより、どうやらURLContexts
には要素数が一つのUIOpenURLContext
の配列が格納されているらしい。
ゆえに、URLContexts
配列の一つ目のUIOpenURLContext
要素のurl変数を取得すれば良いことがわかる。
以上から、SceneDelegate上に以下のように記述しなければいけない。
import Swifter
## 省略 ##
// callback urlの設定
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>){
Swifter.handleOpenURL(URLContexts.first!.url, callbackURL: URL(string: "swifter-<ConsumerAPIkey>://")!)
}
## 省略 ##
・scene(_:openURLContexts:)
に関連する公式ドキュメントは以下。
Apple Developer : scene(_:openURLContexts:)
Apple Developer : Set
Apple Developer : UIOpenURLContext
まとめ
Xcode11でのCustomURLSchemeに関しての記事がめちゃくちゃ少なくて、これを調べるだけですごい時間かかりました。
探すのが大変だったので、備忘録として。
今後はtwitter連携アプリを作り込んでいきたいと思うので、それも記事にできればと。