【App Architecture編】流し読みするHuman Interface Guidelines

## App Architecture
🆕 は`iOS 15.0`から導入されたものです。

### Launching

- Provide a launch screen.
→ コンテンツのロード中にユーザを待機させない
参考: [Launch Screen](https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/launch-screen)
- Launch in the appropriate orientation.
→ アプリ起動時の画面の向きを考慮する
参考: [Adaptivity and Layout](https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/adaptivity-and-layout)
- Avoid asking for setup information up front.
→ 設定画面は最小限に(カスタマイズ性より汎用性 ※ユーザ意識)
- Avoid showing in-app licensing agreements and disclaimers.
→ App Store等に規約を明示する(ユーザにとって不要なダウンロードは避ける)
- Restore the previous state when your app restarts.
→ 何度も同じ手順を踏ませない
- Don't encourage rebooting.
→ 何度も再起動させない
- Avoid asking people to rate your app too quickly or too often.
→ レビューを強要しない

### Onboarding

- Provide onboarding that helps people enjoy your app, not just set it up.
→ 有意義な情報を精査する
- Get to the action quickly.
→ チュートリアルはスキップ可能にする
- Anticipate the need for help.
→ ユーザが困りそうな(または既に困っている)タイミングでチュートリアルを挿入する
- Stick to the essentials in tutorials.
→ チュートリアルに含む情報を精査する
- Make learning fun and discoverable
→ 体験学習をさせる(仕様を眺めさせない)

### Loading

- Make it clear when loading is occurring.
→ ユーザに待機させる場合はインジケーターを表示する
- Show content as soon as possible.
→ プレースホルダを用意して画面だけは先に表示する
- Educate or entertain people to mask loading time.
→ ロード時間を利用してTipsを提供する
- Customize loading screens.
→ インジケーターはアレンジする
参考: [Progress Indicators](https://developer.apple.com/design/human-interface-guidelines/ios/controls/progress-indicators/)

### Modality

- Use modality when it makes sense.
→ モーダルはユーザに重要な情報を提供するときのみ利用する
- Reserve alerts for delivering essential - and ideally actionable - information.
→ アラートはユーザ操作を阻害するものであることを念頭に置いておく
- In general, keep modal tasks simple, short, and narrowly focused.
→ モーダルはなるべく手短に済ませる
- Consider using a fullscreen modal style for immersive content or a complex task.
→ モーダルはフルスクリーン表示の方が没頭させられる
- Always include a button that dismisses the modal view.
→ モーダルは常に解除(非表示)できるようにする
- When necessary, help people avoid data loss by getting confirmation before closing a modal view.
→ データが消える場合にモーダルを利用する
- Make it easy to identify a modal view's task.
→ モーダルを表示する際はそのモーダルの責務を示す
- Coordinate the modal view's appearance with your app.
→ アプリケーションのUIに沿ったモーダルを作る
- Choose a modal transition style tat makes sense in your app.
→ モーダルの遷移スタイルは一貫させる

### Navigation

- Always provide a clear path.
→ 直感的に分かる遷移にする
- Design an information structure that makes it fast and easy to get to content.
→ 目的のコンテンツまで最短で遷移させる
- Use touch gestures to create fluidity.
→ ジェスチャーによる遷移を可能にする
- Use standard navigation components.
→ 標準的なナビゲーション部品を利用する
- Use a navigation bar to traverse a hierarchy of data.
→ ナビゲーションバーを利用する場合はタイトルに現在の階層を明示する
参考: [Navigation Bars](https://developer.apple.com/design/human-interface-guidelines/ios/bars/navigation-bars/)
- Use a tab bar to present peer categories of content or functionality.
→ タブバーを利用してコンテンツのカテゴリごとにまとめる
参考: [Tab Bars](https://developer.apple.com/design/human-interface-guidelines/ios/bars/tab-bars/)
- On iPad, use a split view instead of a tab bar.
→ iPadの場合はタブバーの代わりにSplit Viewを利用する
参考: [Split Views](https://developer.apple.com/design/human-interface-guidelines/ios/views/split-views/)
- Use a page control when you have multiple pages of the same type of content.
→ Page Controlを利用して類似コンテンツ間の遷移を可能にする
参考: [Page Controls](https://developer.apple.com/design/human-interface-guidelines/ios/controls/page-controls/)

### Accessing User Data and Resources

#### Requesting Access Permission

- Request permission only when your app clearly needs access to the data or resource.
→ リソースを利用するときにのみパーミッションダイアログを表示する
参考: [Using the Location Button](https://developer.apple.com/design/human-interface-guidelines/ios/app-architecture/accessing-user-data/#using-the-location-button)
- Request permission at launch only when the data or resource is necessary for your app to function.
→ アプリ全体でリソースを利用する場合は利用前にパーミッションダイアログを表示し、その旨も明示する
- Write copy that clearly describes how your app uses the data or resource you're requesting.
→ パーミッションダイアログでリソースを利用する場面とその理由を明示する
参考: [Requesting Access to Protected Resources](https://developer.apple.com/documentation/uikit/protecting_the_user_s_privacy/requesting_access_to_protected_resources) / [App Tracking Transparency](https://developer.apple.com/documentation/apptrackingtransparency)

#### 🆕 Using the Location Button

- Consider using the location button to give people a lightweight way to share their location for specific app features.
→ 位置情報を「一度のみ利用」すると予想できる場合はLocation Buttonでの実装を検討する
- Consider customizing the location button to harmonize with your UI.
→ アプリケーションのUIに合うようにカスタマイズする

#### 🆕 Using the Microphone in a ShazamKit App

- Stop recording as soon as possible.
→ 音声認識機能は短時間での利用に留める
- Let people opt in to storing your app's recognized songs to their iCloud library.
→ 音声認識によって判別した曲はiCloudに保管できるようにする
参考: [ShazamKit](https://developer.apple.com/documentation/shazamkit)

#### Displaying Custom Messaging Before the Alert

- Make it clear that opening the system alert is the only action people can take in your custom-messaging screen.
→ ユーザがリソースの利用を許可すると容易に想像できる場合は、パーミッションダイアログを表示する前に説明書きを表示する(続行ボタンのラベルは「続ける」や「次へ」を利用する)

#### Clarifying Tracking Requests

- Never precede the system-provided alert with custom messaging that could confuse or mislead people.
→ パーミッションダイアログ表示前の説明書きでは、ユーザがリソースの利用を承認するように仕向けない

#### Settings

- Infer what you can from the system.
→ リソースを利用することでユーザの設定項目を極力減らす
- Thoughtfully prioritize configuration options within your app.
→ 設定項目の重要度に応じてメイン画面とサブ画面に配置を分ける
- Expose infrequently changed configuration options in Settings.
→ 変更頻度の低い設定項目はアプリ内で設定できるようにする
参考: [Implementing an iOS Settings Bundle](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/UserDefaults/Preferences/Preferences.html)
- Provide shortcuts to Settings when appropriate.
→ 「設定」アプリに遷移する場合は遷移先に直接飛べるようにする
参考: [openSettingsURLString](https://developer.apple.com/documentation/uikit/uiapplication/1623042-opensettingsurlstring)