iOS チームで電子版アプリや紙面ビューアーアプリの開発をしている伊藤です。
2022 年の Google Open Source Peer Bonus Award を受賞しました。 Google Open Source Peer Bonus Award は 2011 年に始まった、 Google 社の社員が Open Source に関する開発について支援を受けた相手に感謝する表彰制度です。
受賞理由
今回の受賞は Firebase Apple SDK に対する貢献によるものでした。

具体的には Firebase Remote Config
の Codable 対応 や Property Wrapper 対応 を評価いただけたようです。
このエントリーでは Firebase
に最近追加された 2 つの機能について紹介します。
Codable
Firebase Remote Config
では値に対するアクセスに型を指定したプロパティを用いていました。
// String 型として値を取得する
remoteConfig[key].stringValue
String
, Int
, Data
などの型に Cast するような場合では問題ありませんが、複雑な構造体を持たせたい場合には Data
として取り出した上で Codable
に準拠した構造体を用いて、 decode するなどの対応が必要でした。
例えば JSONDecoder
を用いると以下のように JSON 形式で設定された値を扱うことができます。
let data = remoteConfig[key].dataValue
let obj = try JSONDecoder().decode(Object.self, data)
Codable 対応では decoded(asType:) 関数を追加することで Remote Config
から直接 Codable
に準拠した型を取り出せるようにしました。
なお、 decoded(asType:)
は FirebaseRemoteConfig
に加えて FirebaseRemoteConfigSwift
を Import すると利用できるようになります。FirebaseRemoteConfigSwift
は version 9.0.0 より beta から general availability となりました。
// `Object` は Codable に準拠した型
let obj: Object = try remoteConfig[key].decoded(asType: Object.self)
Property Wrapper
本機能は 2022 年の Firebase Summit でも紹介されました。
以下のような構文で Property に対して Remote Config
の値を反映することができます。
@RemoteConfigProperty(key: "stepsStyle", fallback: "square")
var stepsStyle: String
この Property Wrapper
は Dynamic Property
として実装されているため、値の変更を検知してリアルタイムに UI に反映させることができます。
従来の Remote Config
では fetch に時間がかかるため、特に起動直後に表示される UI の出しわけをする際に fetch が間に合わず、意図した UI をユーザーに届けられるのが次の画面更新のタイミングになってしまうという問題がありました。
Property Wrapper
の導入で fetch の完了時に自動的に UI に反映されるようになり、上記の問題が多少緩和できたと思います。
また、 Property Wrapper
対応の副産物として、 NotificationCenter に Remote Config
の Activate が完了したイベントが飛ぶようになっています。
従来では Remote Config
の値が最新化されたタイミングを拾うためには、 fetchAndActivate
を呼び出した場所で完了を待つ必要があったため、アプリケーション全体に渡って利用できる独自の Global Subject のようなものを保持する等の対応が必要でした。
try await remoteConfig.fetchAndActivate()
// 従来では `fetchAndActivate` の完了を待ってから何かしらの方法で必要なモジュールに fetch の完了を伝える必要があった
GlobalSubject.remoteConfigDidFetched.onNext()
Firebase Apple SDK 10.0.0 からは以下のようなコードで検知することができるため、このようなユースケースの実装をよりシンプルにできる可能性があります。
extension Notification.Name {
static let onRemoteConfigActivated = Notification.Name("FIRRemoteConfigActivateNotification")
}
// `configDidActivate` は任意のコールバック関数
NotificationCenter.default.addObserver(obj, selector: #selector(configDidActivate), name: .onRemoteConfigActivated, object: nil)
受賞に至った経緯
私の担当する日経電子版アプリや紙面ビューアーアプリでは Remote Config
や In-App Messaging
といった Firebase
のプロダクトファミリーを利用しています。
2021 年ごろまでの Firebase
は基本的に Objective-C で書かれており、利用する側から考えると以下のような問題点がありました。
- API インターフェースや変数名が全体的に Objective-C の作法に基づいて設計されている
- Codable や Combine など、モダンな Swift の機能に追従していない
このような問題点を解消するために、最初は個人のプロジェクトとして Firebase
の Swift ラッパーライブラリをいくつか作成していました。また、これらのライブラリの一部は実際のプロダクトに組み込んで継続的な開発をおこなっています。
一方で Firebase
も 2021 年後半から 2022 Swift Modernization Project を立ち上げて SDK インターフェースの全体的な Swift 化を推し進めていました。
こうした流れの中で個人開発で実装していた機能の一部を SDK に取り込むご提案もいただき、継続的な貢献を重ねられたことが今回の受賞につながったのではないかと考えています。
Looks promising. We'll be happy to work with you if you want to turn this into PR(s) for a FirebaseRemoteConfigSwift library at https://t.co/VbcY8ONey5
— Paul Beusterien (@paulbeusterien) October 12, 2021
まとめ
Firebase Apple SDK への貢献によって、 Google Open Source Peer Bonus Award を受賞しました。プロダクトの開発を助けてくれる OSS への貢献をこのような形で取り上げていただけることは、純粋に嬉しかったです。
テクノロジーメディアを目指す日本経済新聞社では、必要に応じて OSS へのコントリビューションも行いながらお客様に価値のある情報を提供できるサービスを目指して日々開発しております。本エントリを通じて日経での仕事に興味を持っていただけた方は、ぜひお気軽にご連絡ください。