potatotips #57 のiOSブログまとめ枠で参加させていただきましたのブログです。
会場は アイスタイル さんでした。
以下発表内容です。参加枠としては iOSブログまとめ枠でしたが Android の発表内容に関してもまとめています。
気になるところや間違いなどあればご指摘ください。埋まっていない資料は公開されたのを見つけ次第反映します。
[iOS] テストデータ自動生成方法の別解 / tattn さん
ユニットテストでMockAPIClientを作るときに 特にViewModelなんかしんどい。ネストしたテストデータの初期化なんかが特にしんどい。
APIのレスポンスをテストデータに差し替える方法としては、たとえばprotocol で差し替えたMockAPIクライアントにデータを差し込む方法がある。
乱数で初期化してテストデータにするというのが良いんじゃないかと思った。
コード生成を使う方法と、リフレクションが考えられる。コード生成は外部ツールを使うことになるので今回はできればしたくない。
Swiftのリフレクションには、Mirrorというのがある。しかし使う前にインスタンス化が必要。というわけでCodableを使うのを思いついた。Randomizable というのを作った。
Randomizable に適合したやつのrandomValueを呼ぶとプロパティのランダムな値を返してくれて便利。ランダムのルールはカスタマイズできる。
実装は、RandomDecoder() っていうのを作っている。Randomizable に適合させると、 Decodable に適合している型であれば、randomValueの実装がいらなくなる。
実装はひたすら各型について書かないといけないので結構大変だが、とにかく乱数を返しているだけである。
ランダムなJSON文字列がほしければ、ランダム生成してDecoder使えば良い。コマンドラインツールとして活用できそうなので、SPM対応した。
Codable はリフレクションにも使える。黒魔術やリフレクション、コード生成など使えるものは何でも使って楽していこう
[Android] Firebaseで解決するAndroidの機種依存 / gyamoto さん
Androidには機種依存がある。たとえばBLEのアドバタイズをおこなうと、出力強度とアドバタイズ感覚が機種によって異なるなど…
たとえばXperia 系は BLE の強度が弱い、Galaxy系は出力を挙げないとアドバタイズ系が安定しない、などBLE のパラメータは機種依存があることがわかった。
機種によって設定を変えてやりたいが、これをハードコーディングしていくのはつらい。
なので Firebase UserProperty と RemoteConfig でパラメータ設定した。
Firebase UserPropertyは言語や地域などユーザー層を示す属性を設定できるプロパティ。RemoteConfigなど、Firebaseの他のサービスでユーザー判定のフィルタリングとして使える。
RemoteConfig管理画面で設定した値を配信する仕組み。アプリから設定された値を取得して永続化、参照できる。
この2つを組み合わせる。以下のような流れでやれば良い。
- まず機種を特定できる端末情報をUserPropertyに設定
- UserPropertyから機種ごとの値をRemoteConfigに保存
- RemoteConfigによってアプリの振る舞いが変わるように実装
[iOS] RxSwiftとMVVMパターンと仲良くなる次のステップ / fumiyasac さん
www.slideshare.net
MVVM でアプリ作った。以下のようなことをした。
- UICollectionViewをベースにしたカルーセルを表示する
- ドロップダウンメニューから表示内容を変更する
- メニューを Observable で表現
- 初回表示状態からボタンを押すとまつ尾に10件ずつデータを表示する
- BehaviorRelay で通信状態やリストを表現
- インクリメンタルサーチで該当したデータを最大10件表示する
- Debounce や Throttle を利用する
サンプル:
Qiita:
[Android] Empty State表示共通化の事例 / kentaro さん
Empty State(○○はありません的な)の表示を共通化した。
Empty State表示、画面作成時に都度デザイン・実装していたのだが、画面によって表示がバラバラだし、そのたびに考えることが増えたりして大変だった。
共通化することによって表示を統一して、コスト削減になった。
具体的な実装は、何がemptyなのかをenumで表現、Viewはカプセル化、プロトコルとデフォルト実装などを使って綺麗に実装した。
楽できるところは楽して注力すべきところに注力できると良い。
[Android] Behavior of nested async in Kotlin Coroutines / URI さん
Kotlin 1.3 になってCoroutineがstableになった。アップデートしたら、アップデート起因の不具合を埋め込み(流出はしていないが)、修正することになった。
バグ対応から学んだ、ネストしたasyncのふるまいと対応方法について簡単に説明する。
ver 0.30.0 から、ネストしたasyncのキャンセルが親のcoroutineにも伝播するようになった。たとえばlaunchで直接呼び出したasyncの例外が親のlaunchに伝播する。
解決方法を4つ紹介。1.withContext でコンテキスト切り替える。2.Globalscope.async でスコープを変える。3.CoroutineExceptionHandlerを渡して集約する。4.SuperVisionを導入する。キャンセルの伝播の方向を制御できる。supervisorScope {} というので囲めば、asyncを使っていても、asyncの例外が親のlaunchに伝播しないようになる。
以下の記事を参考にしました。
[iOS] 生きた仕様書としてのUIカタログアプリ運用 構想編 / hiragram さん
==前置き==
仕様書は死ぬ。
仕様書死なないでほしい。
なぜ死ぬのか?
ちまちま仕様書を更新しても死にゃせんから。
では短期的なメリットがあればいいのでは?
==前置き終わり==
仕様書に求めるもの
- 画面にある全ての機能が網羅的に残されている
- 画面にある全ての状態変数が網羅的に残されている
- それぞれの状態のときにそれぞれの機能がどう振る舞うかが網羅されている
そして
- 常に最新である
で、構想なのだが、UIカタログ的なアプリをシュッと作れる環境を用意したらいいんじゃない?と思っている。
各画面は表示に使うための情報を外から注入されるインターフェースをもつ。たとえばObservableとか差し込む。
何が嬉しいのか?
UIカタログを見てデザインチェックができるとか。開発的にも便利。疎結合になるのでAPIクライアントとかと別にビルドできる。とか。
[Android] KTSで社内マルチモジュールライブラリを配信する / Kubode さん
なんで社内ライブラリの配信するのか?社内のデザインシステムのため。AARライブラリ化してmavenで配信したい。
デザインシステムっていうのはデザインの原則やコンポーネント群。これがあるので共通化できて楽。
Atomic Designはデザインシステムの設計手法の一つ。これをモジュールに落とし込んでみる。
mavenリポジトリをどうするか。GradleはS3のURIをサポートしている。認証ありもサポートしていて、S3にした。あとbitriseにアップロードするworkflowを書いた。
Androidはそのままではアップロードできない。できないというか pom.xmlの設定をめちゃくちゃ大量に書かないといけない。android-maven-gradle-pluginを使えば楽。
groupとartifactIdとversion を指定する。がアップロードしようとしたらだめだった。android-maven-gradle-pluginを使っていると古い方のがデフォで参照されて、新しいmaven-publishを使わないとS3の配信がサポートされないらしい。
maven-publishを使う版は無いのか?と思って探したらあった。android-maven-publish を使ったら良い。これで ./gradlew publish
できた。
なにげに例に KTS が出てたけど KTS は問題なく使えるよ
[iOS] Appleの標準アプリで使われている半モーダルビューについて / idonuntius さん
半モーダルビューの定義だが、iOS8 の Apple Music で使い始められて、今ではメールやマップなど色々なところで使われているやつ。
半モーダルビューは「現在のタスクやワークフローをコンテキスト内で自己完結する機能を提供する」ものらしい。
モーダルビューは、タスクに戻るためにはサブタスクを終了しなければならない。
半モーダルビューに関してはキャンセルとかない。 WWDC で紹介されていた Redirect UI っちゅうやつだと思う。タスクとサブタスクを並列に実行できる。
iOS の標準アプリで半モーダルビューが増えているので、これから増えていくとおもう。
[Android] RecyclerViewとGridLayoutについて学んだ話 / nagais さん
1カラムのViewと2カラムのViewが混ざっている画面を作った。
GridLayoutManager をセットした RecyclerView を使用して、モデルごとにViewTypeを設定、 GridLayoutManager が SpanSizeLookup というのを持っているので、モデルの持っているViewTypeごとに変えれば良いことがわかった。
[iOS] 久々のiOSリリースあるある / 5mingame2 さん
久々のiOSリリースで色々ハマった。
GameCenterでエラー。ios10でgemecenterにログインしているはずなのにスコア送信とかできない‥ボードとかも真っ白これはGameCenterからサインアウトして再サインアウトしたらなおった。利用規約の変更でアカウントで止まっていたっぽい
審査出す時のValidationでエラー。Launch Screnn File のファイル名から.xibを削除したら通った。
審査でリジェクト。ゲーム中にスナップショット取ってストレージに保存することができるのだが、ユーザーに使用用途を明確に伝える必要がある。Info.plistのNSPhotoLibraryAddUsageDescription/NSPhotoLibraryUsageDescriptionに設定すればOK。
ソースコード公開したよ:
[Android] Android開発でmitmproxyを使った話 / bigbackboom さん
responseの値を書き換えて本番環境でアプリの強制アップデートのテストがしたい。Charlesがなんかうまくいかないのでmitmproxyでやってみた。
https が拾えてなかったけど、 app/src/main/res/xml/network_security_config.xml を作って信頼する証明書を設定、AndroidManifest.xml で networkSecurityConfig を設定すればOK。
実は以下でハマってただけでCharlesでもできた。
[iOS] 読んで良かった本をiOSエンジニアに紹介する / よっしーさん
いろいろ紹介。
- iOSアプリ設計パターン入門
- iOSアプリを前提にしてくれてるので良い
- iOS12 Programming
- リーダブルコード
- 達人プログラマー
- REAL WORLD HTTP
- オブジェクト指向のこころ
- TEAM GEEK
- AWS基礎からのネットワーク&サーバー構築
- テスト駆動開発
- 設計品質とアーキテクチャ
感想とか
最近 Kotlin Coroutines を書いていて、ちょいちょいどうすればいいのか迷ってることとかあって懇親会で聞けてよかった。