06. 非機能要件とストア対応
06. NFR and store submission
対応 OS・性能目標・セキュリティ・A11y・ストア審査チェックリスト。 Supported OS, performance targets, security, A11y, and the store-review checklist.
実装品質・審査通過に必要な最低限の基準をまとめます。 このページの基準を満たすことが v1 リリースの受入条件です。
The minimum bar for implementation quality and store submission. Meeting the items on this page is the acceptance criteria for v1 release.
対応 OS / 端末 Supported OS / devices
| プラットフォームPlatform | 最小バージョンMinimum version | 推奨バージョンRecommended | 備考Notes | ||
|---|---|---|---|---|---|
| iOS | iOS 15.0 | iOS 17+ | Mapbox SDK / Flutter 3.x の最低要件に合わせて 15.0 を採用 | Set to 15.0 per Mapbox SDK / Flutter 3.x requirements | |
| Android | Android 8.0(API 26) | Android 13+(API 33+) | minSdkVersion=26、targetSdkVersion は Google Play 要件に追随(2026 年は 35) |
minSdkVersion=26; targetSdkVersion follows Play's yearly bump (35 in 2026) |
|
| タブレット | Tablets | — | — | v1 スコープ外:縦向きスマホのみサポート。iPad・折りたたみ端末は v2 以降 | Out of v1 scope: portrait phones only. iPad / foldables come later |
| Flutter SDK | Flutter SDK | 3.22+ | 3.27+ | Dart 3.4+ 前提 |
Requires Dart 3.4+ |
パフォーマンス目標(受入基準) Performance targets (acceptance criteria)
| 指標Metric | 目標値(P95)Target (P95) | 計測方法How to measure | ||
|---|---|---|---|---|
| コールド起動(スプラッシュ → Home 表示) | Cold start (splash → Home ready) | ≤ 2.5 s | Firebase Performance の _app_start |
Firebase Performance _app_start |
周辺駐車場検索(/v1/parking-lots/nearby、半径 500m) |
Nearby search (/v1/parking-lots/nearby, 500m) |
≤ 800 ms | アプリ側の HTTP 計測、dev-api.parky.co.jp 経由 | Client-side HTTP timing via dev-api.parky.co.jp |
AI 検索(/v1/search/ai) |
AI search (/v1/search/ai) |
≤ 3.0 s | LLM 呼び出しを含むので許容を長めに設定 | Longer budget because of LLM latency |
| 地図マーカー描画(40 件 / 画面内) | Map-marker render (40 markers on-screen) | ≤ 60 ms / frame | Flutter DevTools のフレームグラフ | Flutter DevTools frame chart |
| クラッシュフリー率 | Crash-free rate | ≥ 99.5% | Firebase Crashlytics(本番 7 日移動平均) | Firebase Crashlytics (prod 7-day rolling) |
| バッテリー消費(1h 駐車中・画面オフ) | Battery drain (1h parked, screen off) | < 3% | iOS/Android の開発者ダッシュボード | iOS/Android dev dashboards |
セキュリティ要件 Security requirements
- 通信:HTTPS 必須(TLS 1.2 以上)。
NSAppTransportSecurity/ Android network-security-config は本番ドメインのみ許可 - Transport: HTTPS required (TLS 1.2+). Allow production domains only in
NSAppTransportSecurity/ Androidnetwork-security-config - JWT / refresh token:必ず Secure Storage(iOS Keychain / Android Keystore)に保存。
SharedPreferences・平文ファイル禁止 - JWT / refresh tokens: Always stored in Secure Storage (iOS Keychain / Android Keystore). Never in
SharedPreferencesor plain files - ログ:本番ビルドでは JWT・メール・電話番号・位置座標を出力しない(
kReleaseModeでガード) - Logs: Production builds must not log JWTs, emails, phone numbers, or coordinates (guard with
kReleaseMode) - 証明書ピンニング:v1 では任意(BFF / Supabase ドメインは Cloudflare / Supabase の TLS を信頼)。将来要件次第で追加
- Certificate pinning: Optional in v1 (rely on Cloudflare / Supabase TLS). Revisit as requirements tighten
- ディープリンク検証:外部から受けた URL はホワイトリスト照合後にナビゲーション。
javascript:スキーム等は拒否 - Deep-link validation: Verify incoming URLs against a whitelist before navigating. Reject
javascript:and similar - ルート検出:v1 ではブロックしない(アプリ内課金があるがサーバー側で検証するため)
- Root detection: Not blocking in v1 (IAP receipts are verified server-side)
プライバシー Privacy
- APPI(個人情報保護法)対応:プライバシーポリシーへの同意取得、削除依頼への対応(
POST /v1/me/withdraw) - APPI compliance: Privacy policy consent and deletion requests (
POST /v1/me/withdraw) - 13 歳未満 NG:利用規約で明記。登録時の年齢確認チェックは不要(ストア側の審査で対応)
- No users under 13: Stated in the terms. No in-app age-gate needed (store review handles it)
- 送信する個人情報:メールアドレス、位置情報(検索・駐車セッション時)、車両情報。プライバシー設定画面で分析データの送信を opt-out 可
- Personal data transmitted: email, location (during search / session), vehicle info. Analytics opt-out in the privacy settings screen
アクセシビリティ(WCAG 2.1 AA) Accessibility (WCAG 2.1 AA)
| 項目Item | 最低要件Minimum | ||
|---|---|---|---|
| コントラスト比 | Contrast ratio | 通常テキスト 4.5:1、大文字(18pt 以上) 3:1 | 4.5:1 for body, 3:1 for large text (≥18pt) |
| Dynamic Type | Dynamic Type | OS のフォントサイズ 100%–200% でレイアウト破綻しないこと | Layout must hold at 100%–200% OS font scaling |
| VoiceOver / TalkBack | VoiceOver / TalkBack | すべてのボタン・アイコンに Semantics(ラベル)を付与。画像には excludeSemantics: false で代替テキスト |
Every button / icon has a Semantics label; images include alt text (excludeSemantics: false) |
| タップターゲット | Tap targets | iOS 44×44 pt / Android 48×48 dp | |
| フォーカス順序 | Focus order | 論理的な読み上げ順(上→下、左→右)。Semantics(sortKey) で必要に応じて調整 |
Logical read order (top-to-bottom, left-to-right). Use Semantics(sortKey) to fix exceptions |
| 色だけで情報を伝えない | Do not rely on color alone | エラー表示はアイコン+テキスト、Good/Bad 評価はアイコン形状も差別化 | Errors use icon+text; Good/Bad uses distinct icon shapes |
| モーション縮退 | Reduced motion | OS の「モーションを減らす」設定を尊重(MediaQuery.disableAnimations) |
Respect "reduce motion" (MediaQuery.disableAnimations) |
ストア審査チェックリスト Store submission checklist
App Store(iOS) App Store (iOS)
- Privacy Manifest(
PrivacyInfo.xcprivacy):必須(2024 年 5 月以降)。以下の Required Reason API を正しく宣言NSPrivacyAccessedAPICategoryUserDefaults(SharedPreferences 相当を使う場合)NSPrivacyAccessedAPICategoryFileTimestamp(画像アップロード)NSPrivacyAccessedAPICategoryDiskSpace(Mapbox の地図タイルキャッシュ)
- Privacy Manifest (
PrivacyInfo.xcprivacy): Required since May 2024. Declare Required Reason APIs correctly (UserDefaults, FileTimestamp, DiskSpace, etc.) - App Tracking Transparency (ATT):今回は不要。IDFA を取得しない(サードパーティトラッキングしない)
- App Tracking Transparency (ATT): Not needed — we do not access IDFA or do third-party tracking
- Sign in with Apple:ソーシャルログインを追加する場合は必須。メール+パスワードのみの v1 では不要
- Sign in with Apple: Required if any social sign-in is added. Not required for email+password v1
- Usage descriptions (Info.plist):位置情報・カメラ・フォトライブラリ・通知の全てにユーザーが理解できる日本語の説明文を記載
- Usage descriptions (Info.plist): Human-readable descriptions for location, camera, photo library, and notifications
- In-App Purchase:サブスクリプション(自動更新)を使用。別途の価格表示はストアから取得して画面に出す
- In-App Purchase: Uses auto-renewable subscriptions. Prices are fetched from the store, not hard-coded
- 退会(アカウント削除):App Store Guideline 5.1.1(v) に準拠。
POST /v1/me/withdrawをアプリ内から呼べるようにする - Account deletion: Required by App Store Guideline 5.1.1(v). Expose
POST /v1/me/withdrawinside the app - 特商法表記:ポリシー画面内にリンク(サブスクを提供する場合は必須)
- JP Specified Commercial Transactions Law: Linked from the Policies screen (required when offering subscriptions in Japan)
Google Play(Android) Google Play (Android)
- Data Safety Form:Play Console で必須。収集データ(メール・位置情報・車両情報)、使用目的、第三者共有の有無、暗号化の有無を申告
- Data Safety Form: Required on Play Console. Declare data collected (email, location, vehicle), purpose, sharing, and encryption
- Target SDK:
targetSdkVersion=35(2026 年要件)に追随 - Target SDK: Follow the yearly bump (
targetSdkVersion=35in 2026) - App Bundle(AAB):APK ではなく AAB で提出
- App Bundle (AAB): Submit as AAB, not APK
- ACCESS_BACKGROUND_LOCATION:バックグラウンド位置情報を使う場合は別途申請して審査を受ける
- ACCESS_BACKGROUND_LOCATION: Requires a separate Play Console review when used
- 請求:Google Play Billing Library v6 以上
- Billing: Google Play Billing Library v6+
- 退会:アプリ内から削除要求できる導線を必須化(Play 2024 年要件)
- Account deletion: In-app deletion entry required (Play 2024 requirement)
アカウント名義・権限付与 Account ownership and access grant
Apple Developer Program/Google Play Console のアカウントはParky 運営側で保有します。
受注開発会社にはApp Manager / Admin ロールを付与し、ビルドのアップロードとテスト配布
(TestFlight / Internal testing)ができる権限を渡します。ストア公開(リリース操作)は
Parky 運営側で行います。
The Apple Developer Program and Google Play Console accounts are owned by Parky.
The development partner is granted App Manager / Admin roles — enough to upload builds
and distribute via TestFlight / Internal testing. Production release actions are performed by Parky.
CI / CD とテスト配布 CI / CD and test distribution
- テスト配布:iOS は TestFlight、Android は Firebase App Distribution を推奨
- Test distribution: TestFlight for iOS, Firebase App Distribution for Android (recommended)
- 署名:Apple Developer 証明書・Play App Signing のキーは Parky 運営が管理し、1Password 経由で CI に配信
- Signing: Apple certs and Play App Signing keys are managed by Parky and fed to CI via 1Password
- CI:受注側の既存 CI(GitHub Actions / Bitrise など)を利用可。環境変数の受け渡し方法は契約時に調整
- CI: Use the partner's existing CI (GitHub Actions / Bitrise / etc.). Secrets-handling details settled at contract time
テスト戦略 Testing strategy
- ユニットテスト:BFF クライアント・状態管理・ユーティリティのカバレッジ 70%
- Unit tests: BFF client, state, utils — 70% coverage target
- ウィジェットテスト:各画面の golden test(ライト/ダーク/RTL 不要)
- Widget tests: Golden tests per screen (light / dark; RTL not required)
- 統合テスト:駐車フロー(検索 → 詳細 → 開始 → 終了 → レビュー)の end-to-end 1 本
- Integration tests: One end-to-end flow (search → detail → start → end → review)
- UAT(受入テスト):Parky 運営側が 2 週間、dev 環境で検証
- UAT: Parky performs 2 weeks of acceptance testing on dev
ログ・監視 Logging & monitoring
- クラッシュ:Firebase Crashlytics
- Crashes: Firebase Crashlytics
- アプリ分析:Firebase Analytics(基本イベントのみ)。詳細の行動ログは
POST /v1/client-eventsで Parky 側に送信 - App analytics: Firebase Analytics (basic events only). Detailed behavior logs go to
POST /v1/client-events - 構造化ログ:Parky 全体の共通形式(
service: "mobile")に従う。詳細は ops/logging.md - Structured logs: Follow Parky's shared schema (
service: "mobile"). See ops/logging.md
お疲れさまでした — 次のアクションThat's the pack — next steps:
6 ページを読み終えたら、パック入口 の状態表を改めて確認し、
見積もりの土台が整ったことを確認してください。質問は Parky 運営まで。
Once you've read all six pages, revisit the status table on the pack entry page
to confirm the estimate foundation is solid. Direct questions to the Parky team.