STORES Product Blog

こだわりを持ったお商売を支える「STORES」のテクノロジー部門のメンバーによるブログです。

iOS/Androidアプリ

アプリの行動ログを活用して静かな不具合を検知する

この記事は STORES Advent Calendar 2025 の 8 日目の記事です。 こんにちは、 STORES でレジアプリのモバイルオーダー周りの開発をしている yu です。 レジアプリでは、 Firebase Analytics を用いて以下のような粒度で行動ログを取得しています。 画面Aを…

Fused Library は救いとなるか?

はじめに こんにちは。 STORES 決済 の Android アプリ/SDK の開発をしている n-seki です。 もう年の瀬ですね!今回の記事ではFused Library プラグインを取り上げようと思います。 STORES 決済 の SDK Fused Library プラグインの詳細に入る前に STORES …

Liquid Glass 対応が決済アプリへ与える影響について

はじめに この記事は STORES Advent Calendar 2025 の 4 日目の記事です。 STORES 決済の iOS アプリ開発を担当している栗山(@kotetu)です。 今回の記事は、決済アプリチームで現在進行中の Liquid Glass 対応 がテーマです。 本記事では、Liquid Glass 対応…

Kotlin Fest 2025 参加レポート

こんにちは、STORES でモバイルアプリを開発している @tomorrowkey です。 Kotlin Fest 2025、お疲れ様でした!「Kotlinを愛でる」をキーワードに1日中Kotlinについて考える濃厚な1日でした。 この記事では、STORES で取り組んだことや、印象に残ったセッシ…

XCTestを使ったUIテストの安定化戦略

XCTestを使ったUIテストを安定させるための実践ノウハウを紹介します。 Xcode Cloudを使ってテスト失敗の原因を調査する方法、XCTWaiterやNSPredicateを使った待機処理、キーボードやWebViewなどUI特有の不安定要因の解消までを具体的なコード例とともに解説…

WebView/CustomTabsのUIテスト実装をAIで効率化

こんにちは!ブランドアプリを開発しているAndroidエンジニアのkoguchiです。 今回はブランドアプリ(Android)のWebView/CustomTabsのUIテスト実装におけるAI活用について紹介します。 背景 ブランドアプリとはSTORESのプロダクトの一つで、店舗アプリをノ…

レシートプリンターの印刷が途中で停止する不具合を解消した話

こんにちは! STORES レジ の開発をしている iOS / Android エンジニアの @satoryo056 です。 今回は STORES レジ のレシート印刷で起きた不具合と解消方法についてご紹介します。 そして今回対応した内容について、先日行われた iOSDC Japan 2025 で発表し…

SceneDelegate に移行するには?

STORES ブランドアプリの iOS 版を開発している Megabits です。 UISceneDelegate は iOS 13 で追加され、 6 年が経ちました。最初は iPad でのマルチタスクを管理するためのものでした。同じアプリでも、複数ウィンドウを持つ可能性があるため、シーンで分…

iOSDC Japan 2025 参加レポート

こんにちは、STORES でモバイルアプリを開発している nekowen です。 まずは iOSDC Japan 2025、お疲れ様でした!今年は STORES から 総勢20名のメンバーが参加し、登壇・ブース出展、スタッフ活動など様々な形で取り組みを行いました。 この記事では、取り…

DroidKaigi 2025 参加レポート

こんにちは!DroidKaigi 2025 の興奮冷めやらず、いまもセッション動画を見返している @error96num です。 まずは、DroidKaigi おつかれさまでした! 今年は STORES から20名のメンバーが現地参加し、ブース出展・登壇・スタッフ活動など、盛りだくさんの3日…

OSSignposterを活用したiOSアプリのパフォーマンス計測

こんにちは、 STORES レジ を開発しているiOSエンジニアの @miichan_ocha です! みなさん、iOSアプリのパフォーマンスを計測していますか? iOSアプリは Xcode Instruments を使ってアプリのさまざまな状態を計測できます。その中でも、パフォーマンス計測…

STORES は iOSDC Japan 2025 に協賛します!

こんにちは、iOS エンジニアの @miichan_ocha です。 今年も iOSDC Japan の季節が近づいてきました! 今年は 2025年9月19日(金)〜 9月21日(日)に有明セントラルタワーホール&カンファレンスでの開催ということで、今からとてもワクワクしています! ST…

STORES は DroidKaigi 2025 に協賛します!

こんにちは。Android エンジニアの naberyo です。 DroidKaigi 2025 は 9月10日(水)〜12日(金)に、ベルサール渋谷ガーデンで行われます。いよいよ開催まで残り1ヶ月を切り、わくわくが止まりません! STORES は、今年もゴールドスポンサーとして参加します。…

デザインエンジニアリングの領域を強化していきます

STORES のykpythemindです。今回はSTORES 内で強化しているデザインエンジニアリングの領域についてお伝えできたらと思います。 今までのSTORES はどうやってUIを作ってきたか まずは我々のプロダクトと、ここまで歩んできた道のりについて説明します。 STOR…

fastlane match の内部実装を活用して複数の iOS 開発者証明書の期限を一括チェックする方法

STORES ブランドアプリチームで iOS エンジニアをしている榎本 ( @enomotok_ )です。 STORES ブランドアプリは、オーナーさんが自分のお店専用のアプリを作成できるサービスです。そのため私たちのチームでは、各オーナーさんのアプリを日々定期的にアップデ…

STORES は iOSDC Japan 2025 に参加したい学生さんを支援します

みなさまこんにちは、STORES モバイル開発本部の @huin です。 Google I/O や WWDC25 も終わり、みなさまこれから出てくる新OSのキャッチアップ・対応に追われている日々かと思います。ワクワクしますね! 今年の WWDC25 は Liquid Glass や Foundation Mode…

multi-xcodeproj + xcworkspace 構成移行の実践

multi-xcodeproj + xcworkspace 構成移行の実践 はじめに xcodeproj とは? xcworkspace とは? この記事で解決すること 背景と課題 STOERS レジ の当初の構成 Build Configuration Stagingで起こっていた問題 Swift Packageの制約 具体的に何が起きるのか?…

ブランドアプリの ID 基盤移行に向けた Cookie 管理の仕組みの実装

はじめに こんにちは。STORES ブランドアプリで Android エンジニアをしている Yuto Koguchi (@10llip0p) です。 STORES では現在 ID 基盤の統一に取り組んでおり、複数のプロダクトへ共通のアカウントでログインしてシームレスに利用できる体験を目指してい…

ViewModel での複雑な状態管理への処方箋

こんにちは!Android エンジニアの naberyo(@error96num)です。 私が現在開発に携わっている STORES モバイルオーダー では、モバイルオーダーから入った注文を飲食店のキッチンで管理するための「キッチンディスプレイアプリ」をネイティブアプリとして提…

約30行でできる!Jetpack Composeで作るサイン画面

はじめに こんにちは! STORES 決済 でAndroidアプリの開発をしているchukaです。 最近は美味しいパンを食べることにハマっています。 美味しいパン屋さんを知っている方は、ぜひ教えてください Jetpack Composeでサインをしよう みなさんは、クレジット…

Compose Multiplatform における iOS ネイティブ実装の取り組み

こんにちは。STORES でiOSエンジニアをしている榎本 (@enomotok_ )です。 STORES では、 KMP/CMP を用いて Android, iOS のマルチプラットフォームアプリ開発を行なっています。 *1 本記事では、Kotlin Multiplatform(KMP)と Compose Multiplatform (CMP) …

決済アプリの SwiftUI 導入に伴う取り組み 〜 アーキテクチャ変更について 〜

はじめに @kotetu こと栗山です。今年の 4 月に STORES に入社しました。今回が、入社して初めての担当記事となります。 今回は、筆者が開発を担当している STORES 決済 の iOS アプリ (以後、 "決済アプリ" と記載) の開発チームで現在進行形で実施している…

たまにはTLVのLについて語る

はじめに はじめまして、こんにちは。STORES 決済 でAndroidエンジニアをしている n-seki です。 というわけでAndroidの技術記事……を書こうと思ったのですが、決済に携わっているエンジニアとして、たまにはTLVについて書いてみようと思います。 TLVとはなに…

WWDC25に参加してきました!〜現地参加編〜

こんにちは! STORES レジ・STORES 予約 の開発をしている iOS / Android エンジニアの @satoryo056 です。 なんとこの度 WWDC に当選しまして、約1週間アメリカに出張してきました! 本記事では、WWDC25 に参加してきた様子を現地の写真を添えながら振り返…

iOS アプリからローカルサーバーへ接続する道のり

STORES ブランドアプリの iOS アプリ側を開発している Megabits です。 STORES ブランドアプリはアプリとサーバーの連動で成り立っています。なので、アプリを開発するとき、サーバーへ接続してデバッグすることがほどんどです。逆に、バックエンドを開発す…

STORES 決済 アプリを譲渡したら最後に落とし穴があった

もう夏なんですかねー。 夏大好きです。 こんにちは! STORES 決済 モバイルチームの Engineering Manager、 iOS アプリ・SDKの開発を担当しております。 いわいです。 なぜアプリ譲渡したのか STORES 株式会社は、 複数の事業会社が集まった会社です。 STOR…

STORES レジで遭遇した 12 桁バーコード読み取りの謎

こんにちは、 yu です。前回はインターン生としてブログを書きましたが、今回は内定者アルバイトとしてブログを書いていきます。 STORES レジには、会員バーコードやアイテムのバーコードを読み込むスキャン機能があります。 しかし、そのスキャン機能では 1…

潜在的なデータ競合をなくすための取り組み

こんにちは、STORES 決済 でiOSアプリを開発している @nekowenです。 マルチスレッドプログラミングは難しいと言われますが、その理由の1つとして、データ競合(data race)があります。 データ競合は複数のスレッドが同じ共有データに同時にアクセスし、少な…

STORES レジがSwift6対応を完了するまで

この記事は「STORES レジにおけるSwift6移行対応」の完結編です。今回は、対応箇所が特に多かったモジュールにフォーカスし、チームで分担して対応する過程をご紹介します。Swift6対応がこれからの方はもちろん、すでに対応済みの方にとっても、中規模から大…

高品質アプリを支える連続タップ防止の工夫

こんにちは、tomorrowkeyです。 今回はAndroidアプリ開発においてボタンのダブルタップをどう防ぐかについて話していきます。 モバイルアプリのQAのよくある項目として、ボタンのダブルタップがあります。開発に集中していると、この不具合になかなか気づけ…