NIKKEI TECHNOLOGY AND CAREER

Google Open Source Peer Bonusを受賞しました

iOS チームで電子版アプリや紙面ビューアーアプリの開発をしている伊藤です。

2022 年の Google Open Source Peer Bonus Award を受賞しました。 Google Open Source Peer Bonus Award は 2011 年に始まった、 Google 社の社員が Open Source に関する開発について支援を受けた相手に感謝する表彰制度です。

受賞理由

今回の受賞は Firebase Apple SDK に対する貢献によるものでした。

Google Open Source Peer Bonus

具体的には Firebase Remote ConfigCodable 対応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 WrapperDynamic 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 ConfigIn-App Messaging といった Firebase のプロダクトファミリーを利用しています。

2021 年ごろまでの Firebase は基本的に Objective-C で書かれており、利用する側から考えると以下のような問題点がありました。

  • API インターフェースや変数名が全体的に Objective-C の作法に基づいて設計されている
  • Codable や Combine など、モダンな Swift の機能に追従していない

このような問題点を解消するために、最初は個人のプロジェクトとして Firebase の Swift ラッパーライブラリをいくつか作成していました。また、これらのライブラリの一部は実際のプロダクトに組み込んで継続的な開発をおこなっています。

一方で Firebase も 2021 年後半から 2022 Swift Modernization Project を立ち上げて SDK インターフェースの全体的な Swift 化を推し進めていました。

こうした流れの中で個人開発で実装していた機能の一部を SDK に取り込むご提案もいただき、継続的な貢献を重ねられたことが今回の受賞につながったのではないかと考えています。

まとめ

Firebase Apple SDK への貢献によって、 Google Open Source Peer Bonus Award を受賞しました。プロダクトの開発を助けてくれる OSS への貢献をこのような形で取り上げていただけることは、純粋に嬉しかったです。

テクノロジーメディアを目指す日本経済新聞社では、必要に応じて OSS へのコントリビューションも行いながらお客様に価値のある情報を提供できるサービスを目指して日々開発しております。本エントリを通じて日経での仕事に興味を持っていただけた方は、ぜひお気軽にご連絡ください。

https://hack.nikkei.com/jobs

伊藤史
ENGINEER伊藤史

Entry

各種エントリーはこちらから

キャリア採用
Entry
新卒採用
Entry
短期インターン
Entry
カジュアル面談
Entry