バイセル Tech Blog

バイセル Tech Blogは株式会社BuySellTechnologiesのエンジニア達が知見・発見を共有する技術ブログです。

CASH iOSアプリの開発環境

f:id:bst-tech:20210601172017p:plain

テクノロジー戦略本部でアプリの開発に携わっております、一ノ瀬です。
バイセルに入社後、CASHのiOSアプリを担当していたのですが、ひと段落がついたのでまとめとして現状の開発環境を紹介したいと思います。

買取りアプリ-CASH(キャッシュ)

買取りアプリ-CASH(キャッシュ)

  • BuySell Technologies Co.,Ltd.
  • ライフスタイル
  • 無料

apps.apple.com

アプリ構成

Xcode12対応済みで、全てSwift、UIKitを使っています。RxSwiftも使っています。

アーキテクチャはMVVMでほぼ実装していますが、MVVMの双方向バインディングだと処理が複雑になるため、新規画面については単方向のデータフローのReactorKitを使っています。

APIとやりとりする機能を実装する際には openapi generator を使われています。サーバーサイドのエンジニアとやりとりしながらopenapiの定義を作り、それをもとにクライアント側のコードを生成してリクエストを実装する流れです。

リクエストの実装は、ある程度自動化されているし、決まったフォーマットに従うだけなのでとても便利に感じました。

CASHアプリはモノを査定しますが、カテゴリ(アパレル,バッグ,腕時計等)やそのブランド(CHANNEL,PRADA等)といった査定に必要な情報を動的に変えられるように、Realm を使用して、アプリ内のデータベースに保存し、査定依頼の画面で表示しています。
こういった情報はサーバー側で管理してるので、CASHアプリ側は自動でアップデートされていきます。

使用ツール

プロジェクトファイルはXcodeGenを使って自動生成をするようになっています。別途Makefileが用意されていて XcodeGen のコマンドも内包されているため、プロジェクトの新規参入者は makeコマンドを叩くだけで環境構築ができるようになっています。
私もCASHのiOSアプリ開発に途中で参加した身としては、開発環境でほぼつまづくことがなかったのでとてもありたがい仕組み。

また、画像や Localizable.strings などのリソース用コードを自動生成してくれるSwiftGen も導入しています。CASH では 画像リソースにのみ使用しています。

ライブラリ

ライブラリ管理ツールは、主にCarthage と 一部cocoapods を利用しています。

導入しているライブラリについては、CASHのiOSアプリを支えるライブラリ - バイセル Tech Blog にまとめてあるのでご興味があれば見てみてください。

※Swift Package Manager への移行に挑戦したことがありましたが、依存ライブラリがSPMに対応されてないなどの影響で移行を断念しました。。

 

CASHには、店舗用の「おみせdeCASH」というサービスもあるのですが、「おみせdeCASH」でも「CASH」アプリと同様に査定を行う機能があります。そのため、できる限り共通化できる部分をライブラリ化してそれぞれに導入しています。

例えば、腕時計やアクセサリー、バッグなど様々な種類をCASHでは査定できますが、それぞれで査定を依頼するステップは異なるため、依頼時の画面遷移も異なります。

それらの違いを吸収した汎用的な仕組みが作られているため、査定依頼のステップを踏むごとにAPIを叩き、次のステップを取得して画面を表示する、、、という処理を最後のステップまで再帰的に行うといった複雑かつ必須な処理を、このライブラリで共通化しています。

CI/CD

活用してるツールは Fastlane + Bitrise + TestFlight/Firebase App Distribution です。

Fastlaneで証明書やプロビジョニングプロファイルを管理して、git ブランチへのマージをフックにBitriseを起動して、TestFlight/Firebase App Distributionへ配信するという配信の自動化が組まれています。

実装されてきた機能の一部紹介

即金サービスとして知られてから月日が経ち、即金ではなくなり、いろんな機能が実装されてきました。その一部も紹介したいと思います。

まとめて査定

写真を1点ずつ撮影するのではなく、段ボールに送りたい商品を詰めて、その段ボールの写真をとって送るだけ。バイセルへ荷物が届いたら、その商品をひとつずつ丁寧に値付けするという『手間をかけずにまとめてもモノを売りたい』という需要に応える機能

CASHの移管と施策について - バイセル Tech Blog

この機能ですが、アプリではなく、Webページでまとめて査定機能が実装されています。アプリ側はWebViewで開くだけです。
Web側でまとめて査定が完了したら、URL Scheme でアプリを開いてもらい、アプリ側でまとめて査定の情報をAPIで取得するというやりとりを行っています。

高額商談機能

お電話もしくは店舗にて、弊社スタッフと直接金額の相談や集荷依頼ができる機能です。時計の専門査定の結果が一定の買取金額を超えた場合に限り、ご案内しております。

ご利用の流れ | 商談

商談機能も「まとめて査定」と同様に、Web側で商談依頼を行うページが用意されていて、Web側で商談依頼が完了したら、URL Scheme でiOSアプリを開いてもらう連携を取っています。

オファー機能

一定時間以内に売りたいモノを送ると、通常の買取金額に対して数%プラスされますよ!という機能です。
CASHアプリ内では愚直に

animateKeyframes(withDuration:delay:options:animations:completion:)を書いたり、gif や Lottie を使って動きを出している箇所が多いです。
オファー機能でも、オファー発生時のキーアイコンや、オファーの残り時間を伝えるためのツールチップ表示も同様に動きを出して、アニメーションに拘った機能でした。

おわりに

CASHアプリの環境、構成を紹介しましたが、細かい作業の自動化や共通化がなされています。実装者として、こういった環境が整っていることで作業に集中できるのでとても良い環境だと思います。CASH以外でも多くのプロジェクトがあり、同様の努力がなされています。
BuySell Technologiesではエンジニアを募集しておりますので、ご興味持っていただけた方は是非お問い合わせください。

buysell-technologies.com