見出し画像

経験あるし# TypeでもWidget開発サクっとできるやろと思ってたら全然できなかった問題

 完全に公私混同の記事になってしまい申し訳ないのですが以前noteのiOSアプリでウィジェットを利用した機能をリリースしました。

その経験があったので個人的に作ってるアプリのウィジェットも簡単にできると浅く考えてたら全然できませんでした。なんとかリリースにこぎつけることができたのでリリースできるようになるまでを簡単にまとめます。

エクステンション(拡張機能)でFirebase使えるんだっけ

 # Typeのデータは全てFirestoreにあるのでFirebaseが利用できる必要があります。WidgetはSwiftUIでコードを書く必要があるので@mainを書いてる箇所でFirebaseApp.configure()を書けば利用可能です。WidgetへのFirebaseのインストールはCocoaPodsで下記のように書いておけば開発自体を進めることはできました。

target 'MyApp' do
  use_frameworks!
  pod 'Firebase/Auth'
  pod 'Firebase/Firestore'
end

target 'WidgetTarget' do
  use_frameworks!
  pod 'Firebase/Auth'
  pod 'Firebase/Firestore'
end

しかし、いざリリースしようとArchiveを試すと下記のようなGoogleUtilitiesが原因のエラーが出て進めることができませんでした。

Multiple commands produce '/Users/user/Library/Developer/Xcode/DerivedData/MyApp-bxcxysnnzgnvkqamwdoqyaafteft/Build/Intermediates.noindex/ArchiveIntermediates/Type/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/GoogleUtilities.framework':
1) Target 'GoogleUtilities-00567490' has create directory command with output '/Users/user/Library/Developer/Xcode/DerivedData/MyApp-bxcxysnnzgnvkqamwdoqyaafteft/Build/Intermediates.noindex/ArchiveIntermediates/Type/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/GoogleUtilities.framework'
2) Target 'GoogleUtilities-54e75ca4' has create directory command with output '/Users/user/Library/Developer/Xcode/DerivedData/MyApp-bxcxysnnzgnvkqamwdoqyaafteft/Build/Intermediates.noindex/ArchiveIntermediates/Type/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/GoogleUtilities.framework'
3) Target 'GoogleUtilities-df6f21d7' has create directory command with output '/Users/user/Library/Developer/Xcode/DerivedData/MyApp-bxcxysnnzgnvkqamwdoqyaafteft/Build/Intermediates.noindex/ArchiveIntermediates/Type/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/GoogleUtilities.framework'

また、過去にもFirebaseを利用したアプリをCatalystをArchiveする時にとても苦労した経験があったので、今後も複数ターゲットのアプリを開発していく中でなるべく苦労は避けたかったです。

そんな中Firebase iOS SDKの7.0.0のリリースでSwift Package Managerの対応がリリースされました。

まだリリースして間もないのでちゃんと動くのか心配ではありましたが、元々利用していた物の中でAdMobを外せば動きそうだということが分かりました。そもそも# Typeの広告はあって無いようなものだったので外すこと自体にためらいはなかったです。というわけでアプリをリリースするためにもがいていたらいつの間にかFirebaseのSwift Package Manager対応が完了しました。

Firebaseをエクステンション(拡張機能)で利用する

 メインアプリで利用している認証情報やデータをエクステンションで利用する方法は公式のドキュメントで案内があるのでこちらを参照すれば良いと思います。

Thanks @koogawa.

ただ、認証情報やデータが更新されるとウィジェット側のデータを更新する必要があることに注意が必要です。タイミングを失敗すると本体側のデータとウィジェットに表示されるデータに不整合が発生するかもしれないのでユーザーが変更可能なデータをウィジェットに表示するのはなかなか難しいなと感じました。今回はProviderEntryを作成する時に下記のようにしてデータを取得するようにしました。

let accessGroup = "TEAM_ID.ACCESS_GROUP_ID"
do {
    try Auth.auth().useUserAccessGroup(accessGroup)
} catch {
    // TODO: handle error
}
if let user = Auth.auth().currentUser {
   // get data from Firebase
} else {
   // return empty
}

まとめ

 なんだか# Typeで変わったことをしようとするといつも何かしらの障害が立ち塞がってしまいアップデートが大変なのですが、次からはスムーズに開発できるのではないでしょうか...ただ、現時点でiOS版のリリースは済んでるのですがmacCatalyst版のアプリは審査中で止まってしまっており不穏な空気が流れています。無事アップデートをリリースできるのか、乞うご期待...!!

この記事が気に入ったらサポートをしてみませんか?