【勉強会メモ】Mobile Act OSAKA #7
今回もXamarinから仮想通貨、CI/CDまで様々な題材でモバイルアプリに関する知見を得ることができる場だったと思います。そら案内のバックエンドも含めた全体構成の貴重な事例も参考になります(10周年おめでとうございます)。クリーンアーキテクチャは10分間で全て理解するのは難しいですが本を読むモチベーションになる内容でした。懇親会ではいつものように美味しいビールを頂きました。
usami-k「Xamarin を使った iOS アプリ開発の現場から」
IDE & storyboard
- 現在も進化
- event
- delegateより簡単
- async / await
- 実装例:アラートのボタン押下待ち
- reactive extensions
- いわゆるRx
- ライブラリを入れなくても標準で対応している強み
shohei「仮想通貨アプリを作ったけどAppleReviwerに弾かれた話」
歩いたら仮想通貨をもらってお店でポイントとして使えるアプリをAppleで申請
- リジェクト12回
- 国際電話4回
App Store Reviewガイドラインにおける暗号通貨について
- 組織として登録しているデベロッパに限り許可
- 最近追加になった
- 法人アカウントが必要
法人のかたにお願いする
- Opening Lineに支援を依頼
仮想通貨アプリを法人アカウントでリリースする際の注意点
- 事前情報が必要
- そのまま申請すると仮想通貨の情報を教えろと言われる
- 仮想通貨の市場がどれくらいか
- 種類(NEM)
- どこで使えるか?
- いつリリースされたか?
- 歴史
Reviewに出す前にメモ欄に書くとすぐReviewが通りリリースできる
- ※トランザクションを発生させない仮想通貨アプリなら個人アカウントでリリース可能
itok「そら案内の作り方」
そら案内
- 11/17で10周年
気象データ
サーバ
- push通知のために別系統
- Parse独自構成
- Firebase使用
- AWS
- EC2/DynamoDB/SQS/S3
- さくらVPS
- 配信用
- 制限がない
- ほぼ Node.js(Typescript書き換え中)
- 一部PHP
- 独自フォーマットのサーバ処理は自作コマンド
- 市町村2,000地点、アメダス1,300地点の一時ファイル
- i-nodeを使い切ってしまう
- 合併で地点コードが更新される
- 事前準備大変
クライアントアプリ
- 用途に応じたアプリ構成
- そら気温などの単機能アプリもあり
- 以下略
アプリリニューアル予定
Takanori Hirobe「Swift Package Managerについて」
近年のモバイルアプリ
- 複雑で多機能
- 自前で実装していたら途方もない時間
- ライブラリ化して公開
- 例)LINE
- 100個以上
⇒便利なライブラリを自分のアプリで使いたい
ライブラリの管理
- 依存管理
- バージョン管理
iOS開発のためのライブラリマネージャ
SwiftPackageManager
- Swift本体に組み込まれたパッケージマネージャ
- ほとんど使わrてていない
- iOSアプリを公式サポートしていない
- 将来の対応を約束している
オススメ資料
minomata「モバイルアプリ開発に使える設計の話」
設計実装でよくある悩み
- FatViewControllerをなんとかしない
- MVC/MVVM/MVPなど
- 乱立するMVなんとか
MVVM+クリーンアーキテクチャ
クリーンアーキテクチャ(The Clean Architecture翻訳) | blog.tai2.net
基本原則
- クリーンな設計にするためのルール
- 依存関係を一方向にする
- 内側は外側を知らないように依存関係を逆転させる
- 層をまたぐ参照はインターフェイスを経由する
- MV〜のような特定のクラス構成に縛るものではない
- 原則を守れば MVC,MVP,MVVMなど任意のアーキテクチャと組み合わせてよい
基本4層
- 外部インターフェイス
- アプリの外の世界と接合部分
- UI、ハードウェアなどのインターフェイス
- インターフェイスアダプタ
- 外部インターフェイスとUSECaseの間の相互変換
- ユースケース
- エンティティ(データ)
- アプリ内で共通に使うデータを定義
- 他の層を一切知らない
冗長だけど何が嬉しいのか
- 外部インターフェイスの事情をユースケースから切り離す
- 外部インターフェイスとビジネスロジックケースはお互い深く知らないでよい
- 分業しやすい
- ソースコードが汚れにくい
- 外層に依存しない
- 内層にも最低限しか依存しない
- 外部インターフェイスの変更・差し替えの影響が小さい
クリーンアーキテクチャのキモ:制御の反転
※参考
Clean Architecture 達人に学ぶソフトウェアの構造と設計 (アスキードワンゴ)
Hiron「4000のワーニングと戦え!これは警告だ!」
マネーフォワードの事例で警告除去にとりかかる
- 警告除去だけの時間は確保できないので合間で作業
- チームメンバー間の温度差
警告除去を盛り上げていこう!
- Slackにチャンネル作成
- 警告数の遷移を可視化
警告を消すってどういうこと?
- 警告⇒文法的には間違っていないがプログラムミスの可能性のある部分の指摘
- 警告を消す⇒問題があれば修正、なければ問題がないことを意思表示
Xcode9.3へのアップデート
- 4,000超え
- Implicit retain of 'self' within blocks
- UIスレッドで同期的に実行するユーティリティメソッドを作っていた(swiftなら@namescape)
どう解決するか
AとC採用
- 確認する意思のある人は確認して手動追加
- それ以外は機械的に追加
警告を増やさないために
- エラー扱いにする⇒デバッグ時に煩わしい
- CIのビルド時に警告をエラー扱いに
KatsukiNakatani「個人でもできる簡単CI/CD(Android)」
Androidの開発からリリースまでの作業
- 少しずつめんどくさく感じる
- 毎回apkやaabをアップロードして変更履歴
- リリースビルドしてadbコマンド
- ビルドに時間がかかる
Cricle CIでビルド環境を改善
- 無料でプライベートリポジトリにアクセスができる
- 1コンテナ1ジョブまでは無料
- developブランチは無視でmasterはビルド
出来た結果のapkを配信したい
- 実機端末にケーブルレスで配信したい
- 内部テストとして必要なメンバーだけ配信
- ストアに掲載する情報もできればリポジトリで管理したい
Deploy Gate
- aab未対応
- 結局Google Playで配信
Google Playの内部テスト版トラック
- リリース前レポートが実行されず即座に配信される
- aabも使える
Gradle Play Publisherを使う
- リリースするトラック情報の編集
- build.gradleに書く
- バージョン挙げ忘れなどもチェック
※参考
Kenta Nakai「Asset Catalog再入門」
画像の管理
Preserve Vector Data
- Xcode9/iOS11~
- PDFのベクターデータをバイナリに含めるように
- 実行時に自動的に拡大・縮小
色の管理
- 定義した色はコードでもInterface Builderでも使えて便利
- UIColer(name: "xxxx")
その他データ管理
- テキストデータ、オーディオなど
- プロジェクトの中に入れるよりは一括管理しやすい
アセットが大量になったら?
- Namespaces
- アセットに名前空間を提供
- Asset Catalog内のフォルダごとにnamespaceを設定
- Asset Catalogごとに分ける
- フォルダごとにはできない
- Bundleを分けてBundleの中で作れば分けられる