クラシルリワードにおけるiOSアプリ開発の取り組みのトップ画像

クラシルリワードにおけるiOSアプリ開発の取り組み

投稿日時:
中澤 郁斗のアイコン

dely株式会社 / iOSエンジニア

中澤 郁斗

Xアカウントリンク

dely株式会社のfunzinです。もともとiOSエンジニアとしてレシピ動画アプリ「クラシル」や買い物サポートアプリ「クラシルリワード」のiOSアプリ開発を担当してきました。今はエンジニアリングマネージャーやプロダクトマネージャーとして、開発組織のマネジメントや新機能の企画立案・要件定義を主に手がけています。

delyには大きく2つのサービスがあります。ひとつは料理レシピでおなじみの「クラシル」、もうひとつが今回メインで取り上げる「クラシルリワード」です。月間利用者は両サービス合計でおよそ4,000万人と、かなり大規模なユーザー基盤を抱えており、現在も絶賛開発中のプロダクト群です。クラシルリワードは、日常的な行動(移動や電子チラシの閲覧、購入商品のレシートのアップロードなど)でポイントを付与し、それをPayPayやAmazonギフト券など現金価値に近い形で交換できるというサービスを提供しています。

今回は「クラシルリワード」のiOSアプリ開発に関する取り組みとしては、プロダクト概要や開発組織・チーム体制、クラシルリワードの技術スタックの特徴、実際の機能開発事例、そして最後に課題と今後の展望をご紹介します。

開発組織とチーム体制

delyには現在およそ40〜50名のエンジニアが在籍しており、4〜5名のスクラムチームが基本単位として開発を行っています。チームごとに達成すべきKPIを掲げ、必要なタスクを自律的に切り出していくスタイルです。iOSエンジニアはiOSアプリのみ担当という縦割りではなく、価値検証に必要であれば担当領域以外も担当します。エンジニア全員が「プロダクトをどうグロースさせるか」を意識し日々の開発に取り組んでいます。1週間単位のスプリントで開発をするため、 かなり高頻度にPDCAを回しながら開発を続けるスタイルです。スピード感を求めるエンジニアにとって心地よい環境だと思います。

以上が組織体制とプロセスの概要です。次章では、この体制を支える技術スタックについて掘り下げていきます。

クラシルリワードのiOS技術スタック

クラシルリワードのiOSアプリは、最新の技術トレンドを取り入れながら、効率的な開発と高い保守性を目指して構築されています。その主要な技術スタックとモジュール戦略について詳しくご説明します。

モダンな技術スタック

クラシルリワードのView層はほぼSwiftUIで構築されていますが、画面遷移はUIKitを基盤とし、UIHostingControllerでSwiftUIビューをホストするハイブリッド構成です。非同期処理はSwift Concurrencyを全面的に採用し、可読性と保守性を向上させています(一部Combineも残存)。モジュール分割はSwift Package Manager (SPM) を全面的に採用し、サードパーティも自社モジュールもPackage.swiftで一元管理しており、アーキテクチャはMVVMをベースにしています。

精緻なモジュール戦略

大規模かつ複雑なアプリケーションを効率的に開発するため、精緻なモジュール戦略を採用しています。この戦略は、以下の3つの主要なレイヤーで構成されています。

モジュール戦略.png

  • Appレイヤー:アプリケーション全体のエントリーポイントとなる最上位の層です。
  • Featureレイヤー:チラシ表示や特典交換といった、特定のビジネスドメインや機能ごとに細かく分割されたモジュール群です。
  • Coreレイヤー:APIクライアントやFeature Flagの仕組みなど、アプリケーション全体で共通利用される基盤的なモジュール群です。

クラシルリワードはリリース当初から非常に細かくモジュールが分割されており、現在では約270個ものモジュールが存在します。これらのモジュールは、Swift Package Manager(SPM)のPackage.swiftファイルで一元的に定義・管理されていますが、可読性と保守性向上のため、生の文字列ではなくSwiftの型特性を活かした変数化により、コード補完が効くよう工夫されています。

しかし、モジュール数が増えるにつれてPackage.swiftが肥大化し、可読性が低下している点が、現在の課題です。

MVVMを支える4つの要素

クラシルリワードのiOSアプリでは、効率的な画面構築と高い保守性を実現するため、MVVMアーキテクチャを基盤に、Builder、Controller、ScreenView、ViewModelの4つの要素が重要です。

  • Builderは依存をイニシャライザーで注入しbuildViewControllerで ViewControllerを返すというシンプルな設計です。ViewControllerでこの部分を担うこともできますが、ここだけ切り出してBuilderが提供しています。
  • ViewControllerはViewModelのアウトプットを購読し、遷移先を決定する責務を担います。ViewControllerでUIをいじるというよりも、State依存のViewを表示するだけなので、UIKitにありがちなFat化を防いでいます。
  • ScreenViewは画面そのものをSwiftUIで構築。プレビューを活用して高速にUIを検証。
  • ViewModelObservableObjectによる状態管理をしており、ロジックを集中。ユニットテストの対象領域です。

これらを組み合わせることで、実際の画面が構築されています。

画面遷移はRouterServiceが担っており、クラシルリワードアプリ内のすべての画面を生成します。RouterServiceはインターフェースと実装がレイヤーで分けられているため、Featureレイヤーがインターフェース(RouterServiceProtocol)を参照すれば、実際のRouterServiceに依存せずに利用できます。これにより、各Featureモジュールが互いに直接依存することなく、例えばチラシ画面から特典交換画面への遷移などが実現できています。

ScreenRequestと画面は1対1で紐付けられていますが、この定義の一部はSourceryなどのツールを使って自動生成しています。将来的には、Swiftのマクロに置き換えられるとさらに良いと考えています。

クラシルリワードの挑戦的な機能開発と組織課題への取り組み

クラシルリワードは、iOSの豊富な機能をフル活用し、ユーザーにとって魅力的で実用的な機能を提供しています。

  • 移動距離に応じたポイント付与: CoreLocationを利用し、ユーザーの移動経路を計算してゲージを溜め、ポイントとして付与する仕組みを実現しています。
  • 歩数計測と連携: HealthKitと連携し、ユーザーの歩数に応じてポイントが貯まる機能を提供しています。
  • レシートアップロードと不正検出: Vision Frameworkなどの技術を使い、レシート画像からテキストを抽出し、そのデータから不正を自動で検知する機能を導入しています。これは、ユーザーが意図的または無意識に間違ったレシートをアップロードするケースに対応しています。具体的には、レシート画像から電話番号や購入日などの必要情報を抽出し、不足や誤りがあればユーザーにモーダルで通知する仕組みです。

課題と今後の展望

最後に課題と今後の展望についてお話しします。クラシルリワードのiOSチームは、日々発生する大小様々な課題に戦略的に向き合っています。

直近解決した課題、未解決な課題.png

直近で解決した課題でいうと、アプリのリリース頻度が高い中で手動で行っていた作業をSlackボットなどを活用して自動化し、リリースプロセスを効率化したり、 約30分かかっていたXcode Cloudのテスト実行時間を半減させることに成功しました。またSwift 6への移行も着々と進めております。

未解決で向き合っている課題としては、現在約270個にものぼるモジュールが、既存メンバーと新規メンバー双方にとって「どのモジュールがどのような役割で、どう関係しているのか」という認知負荷の増大を招いています。この複雑性を解消するための対策が急務です。また新機能の迅速な検証が求められる中で、一時的な突貫で作られたコードがそのまま運用に乗ってしまい、後からメンテナンスが困難になるケースが発生しています。これを仕組みで改善したいと考えています。

課題解決へのアプローチ

iOS技術課題の取り組み.png

実際にどのように向き合っているかというと、小規模な課題はGitHub Issueに登録し、週次のiOSミーティングでアサイン・管理しています。中規模から大規模で時間のかかる課題については、チーム内で情報を整理し、開発組織内での優先度を判断。最終的には事業側と連携し、プロジェクトとして遂行する体制を確立しています。特に、手遅れになる前に技術的な課題を早期に検知し、事業と両輪で進めることを強く意識しています。

AI活用の推進と今後の展望

会社全体としてAI利活用に積極的に投資しており、モバイルチームもその恩恵を受けています。SlackのAIチャンネルで日々新しい情報をキャッチアップし、特定のツールに固執せず、変化を前提に自ら検証することで、最適なAI活用方法を模索しています。実際、CursorのようなAIツールを使ってiOSのロジックを9割書けるようになったといった声も上がっており、今後の活用事例の発信にも期待が寄せられます。

クラシルリワードの開発チームは、仮説検証を早く回し、機能の迅速な反映と継続的な改善を強みとしています。AI戦国時代とも言える現在、AI活用やiOSのObservationなどモダンな技術を積極的に取り入れながら、スピードと品質を両立させた開発を目指しています。

We Are Hiring!

delyではスピーディーな開発とプロジェクトデリバリーの両方を経験できる貴重な機会を提供しており、この挑戦に興味を持つエンジニアを広く募集しています。iOSエンジニア以外にも積極的に採用を行っており、カジュアル面談も随時実施しています。興味のある方はぜひ一度お話ししましょう。[1]

Loading...Loading...Loading...
脚注
  1. 本記事は、2025年5月21日に開催されたイベントの内容をもとに編集した記事です。

プロフィール