ニフティ不動産のアプリ開発についての紹介(iOS編)
こんにちは!エンジニア採用担当の松居です。
技術スタックや開発手法など、ニフティライフスタイルのエンジニアがどのような形で日々開発を行なっているのかをご紹介したいと思います!
今回は「ニフティ不動産 iOSアプリ開発」について紹介します!
目次
ニフティ不動産 iOSアプリについて
ニフティ不動産は、大手不動産サイト掲載の賃貸物件や購入物件を、豊富な条件でまとめて検索できる不動産情報サービスです。iOSアプリは賃貸物件検索アプリ・購入物件検索アプリの2種類があります。
技術スタック
- 言語:Swift, Objective-C
- 画面レイアウト:SwiftUI, xib
- ユニットテスト:XCTest, Quick/Nimble
- Linter:SwiftLint
- その他ライブラリ:Realm, Firebase, APIKitなど
- アーキテクチャ:VIPER
- 自動化ツール:fastlane
- CI/CD:Bitrise
- 分析:Treasure Data, Redash
この中から、アーキテクチャ、CI/CDについて詳しく説明します!
アーキテクチャ
アーキテクチャは Clean Architecture から派生した VIPER を採用しています。
VIPER は View
/ Interactor
/ Presenter
/ Entity
/ Router
の頭文字を取ったもので、単一責任の原則に則って各クラスを定義します。
単一責任の原則に則った設計のため、モジュール分割を行いやすいことも特徴です。その特徴を活かして現在ではマルチパッケージ化も進めています。詳しくは後段の「最近取り組んでいること」をご覧ください。
CI/CD
Bitriseを利用して以下の処理を自動化することで、開発により専念できる仕組みになりました。以下は自動化されていることの一例です。
- SwiftLintによる構文解析
- プルリクエストの作成とpush時に実行
- Dangerを用いてプルリクエストへコメントを追加
- ユニットテストの実行
- プルリクエストの作成とpush時に実行
- テスト結果はPRのステータスに反映し、テストが通ったコミットのみをリリース
- テスト用ビルド配信
- Adhocビルドを Firebase App Distribution 経由で配信
- リリース用ビルド配信
- Releaseビルドを TestFlight へアップロード
- ストア情報やストア画像もGit管理し、合わせて反映
- リリース準備
- Releaseビルドを TestFlight へアップロード
- ストア情報やストア画像もGit管理し、合わせて反映
- リリース項目を整理し、リリース内容をまとめたPRを作成など
開発手法について
コミュニケーション
コミュニケーションツールとしては、主にSlackとGoogle Meetを使っています。リモート勤務中に不明点や実装に詰まったりした場合は、Slackで連絡を取り合い、必要に応じてGoogle Meetでチーム全員が集まり、口頭で共有・解決しています。
また施策開発にあたってはアプリの仕様策定を担当する企画チームとも密に連携し、より良い仕様になるよう常にブラッシュアップをしながら進めています。
プルリクエストのレビュー
基本的にプルリクエストのレビューは「実装が完了してから一気にレビューを依頼する」のではなく、「前日実装した分をその日の朝に確認する」ルールにしています。
このようなスタイルにした目的は、細かく確認することで実装の不備の見落としを無くしたり、レビュワーの負担を減らすためです。
また、レビューの時間を朝に固定し、レビューが終わったら「レビュー会」という相談会を開いて、プルリクエストのコメントでわからないところや、口頭で相談したいことを相談する場を設けています。
ペアプログラミング
ニフティ不動産のアプリ開発チームはiOSとAndroidの開発を分けていません。iOS開発が得意なメンバー、Android開発が得意なメンバーがいる一方で、得意ではないOSの開発に取り組むこともあります。その場合はペアプログラミングを実施して、得意なメンバーに教えてもらいながら開発をしています。
その結果、今では他のメンバーにヘルプを求める回数も徐々に減っており、iOS/Androidどちらの開発もスムーズに開発できるようになりました!
最近取り組んでいること
既存画面のSwiftUI化
新規で機能追加する際の画面については基本的にSwiftUIで構築していますが、既存の画面はxibで構築されています。Android開発がメインのメンバーもiOS開発に携わることが多いため、レイアウトの組み方がシンプルでわかりやすく、コードレビューのしやすいSwiftUI化を進めています。
Swift 6 対応
非同期処理は主に Combine を用いて実装していますが、 Swift 6 に向けて async/await にリファクタリングを実施しています。
従来の VIPER をベースにしたアーキテクチャは Combine を前提とした設計になっていましたが、現在は Swift Concurrency にも対応した形に修正し使用しています。
また新規でモジュールを作成する場合は Strict Concurrency Checking を Complete にする事で、Swift Concurrency に完全対応した形の実装になるようにしています。
マルチパッケージ対応
アプリが大規模になっていくにつれ、ビルド時間がどんどん長くなっていくことが課題となっておりました。そのため、細かくパッケージを分けてビルドすることでビルド時間や、SwiftUIのプレビュー表示時間の短縮化を目指しています。
この取り組みを進めるにあたり、Cookpad様のブログを参考にしています。
コード生成を用いたiOSアプリマルチモジュール化のための依存解決 – クックパッド開発者ブログ
さいごに
今回はiOSアプリ開発における技術スタックや開発手法についてご紹介しました。今後もニフティライフスタイルの他のサービス開発について順次ご紹介していきますので、どうぞお楽しみに!
エンジニアの採用も積極的に行っていますので、ご興味のある方は、ぜひお気軽に採用ページよりご連絡ください。
掲載内容は、記事執筆時点の情報をもとにしています。