ハイライト
Apple は、Caffè Macs エンタープライズ アプリを例として、ユーザーのデフォルトの位置情報、Core Location の iBeacon 監視と測距、DateFormatter、および NumberFormatter を使用して、キャンパス レベルの測位エクスペリエンスをグローバルな従業員のシナリオに拡張する方法を示しています。
主要内容
Apple Park内にある社員食堂の入り口となるカフェマック。従業員は iPhone アプリを使用してメニューを閲覧し、注文し、Apple Pay で支払います。訪問者はiPadキオスクを使って食べ物を注文します。次に、キッチンは iPad のキッチン ディスプレイ システムを使用して注文を受け取り、食品の受け取りを通知します。ここでの配置要件は非常に具体的です。従業員がアプリを開いたときに、行きたいカフェのメニューが表示される必要があります。
難しさは公園の環境にあります。メインのカフェと近くのコーヒー ステーションは非常に近いため、1 人が同時に複数のダイニング スポットの近くにいる可能性があります。アプリが大まかな位置情報のみを使用する場合、メニューが間違った位置に切り取られ、ユーザーが行くつもりのなかったカウンターに注文することが簡単に起こります。
Appleのアプローチは抑制的だ。まず、従業員にデフォルトの場所を選択させ、「自分に最も近い」と特定のカフェの 2 つの入り口を提供します。ユーザーは近くの場所を自動的に照合する必要がある場合にのみ、中心となる場所の認証プロセスに入ります。これにより、従業員が位置情報の許可を拒否した場合でも、アプリはユーザーの好みに応じて指定されたメニューを開くことができます。
アプリが実際にライブ体験を必要とする場合、Core Location と iBeacon が使用されます。領域監視では、まず近くにターゲット ビーコンがあるかどうかが判断され、ビーコン レンジングでは距離に基づいて最も近い場所が判断されます。最後に、DateFormatter、NumberFormatter、およびローカライズされたレイアウトは、同じ一連のエンタープライズ エクスペリエンスをさまざまな地域にもたらし、グローバルな従業員のシナリオにおける時間、金額、および読み上げ言語のエラーを回避します。
詳細
まずユーザー設定を使用してデフォルトの場所を作成します
(03:28) このスピーチではまず、見落とされがちな問題、つまり位置情報の許可を急いでフリックしないでくださいという問題について取り上げます。 Caffè Macs では、従業員が「自分に最も近い」を選択することも、カフェを直接指定することもできます。後者は測位許可をまったく必要としないため、ユーザーが事前に拒否したり、一時的に許可したくない場合に適しています。
// Storing the user's preference using UserDefaults
UserDefaults.standard.set(defaultLocation.id, forKey: "defaultLocationId")
let defaultLocationId = UserDefaults.standard.integer(forKey: "defaultLocationId")
キーポイント:
defaultLocation.idはユーザーが選択したデフォルトの場所であり、配置に適しています。UserDefaultsこのタイプの小規模な永続ストレージ。 -defaultLocationId次回起動時に読み返し、ホームページにどの Caffè メニューを表示するかを決定するために使用されます。- このステップは位置情報サービスの前に実行されるため、位置認証が失敗した場合のフォールバックでもあります。
十分な位置情報の許可をリクエストする
(06:14) Caffè Mac は「使用時」の認証のみを要求します。この講演では、「常に」付与により位置情報へのバックグラウンド アクセスが許可されると明確に述べられていますが、このアプリのシナリオではそれは必要ありません。エンタープライズ アプリは、機能に必要なデータのみを要求し、Info.plist で目的の文字列を使用する理由を説明する必要があります。
// Add NSLocationWhenInUseUsageDescription to your Info.plist
// e.g. "Location is required for placing orders while using the app."
locationManager.requestWhenInUseAuthorization()
func locationManager(
_ manager: CLLocationManager,
didChangeAuthorization status: CLAuthorizationStatus) {
switch status {
case .restricted, .denied:
disableLocationFeatures()
case .authorizedWhenInUse, .authorizedAlways:
enableLocationFeatures()
case .notDetermined:
// The user hasn't chosen an authorization status
}
}
キーポイント:
NSLocationWhenInUseUsageDescription存在する必要があります。存在しない場合、承認リクエストはすぐに失敗します。 -requestWhenInUseAuthorization()ユーザーがポップアップ ウィンドウのソースを理解できないことを防ぐために、ユーザーが関連タスクを実行するときに呼び出す必要があります。 -didChangeAuthorizationこれは、権限ステータス変更のエントリ ポイントです。ユーザーがシステム設定で権限をオフにした場合にもトリガーされます。 -.restrictedそして.deniedダウングレード パスを選択し、以前のデフォルトの場所設定に戻ります。
まず、デバイスがビーコン機能をサポートしていることを確認します。
(07:02) 位置情報サービスはハードウェア機能に依存しています。音声を使用するには、使用する前に位置情報サービスを呼び出す必要がありますCLLocationManager能力チェック方法。これにより、iPad キオスク、古いデバイス、または管理対象デバイスに関連する機能が不足している場合に、アプリには制御可能な代替パスが用意されます。
if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
// Supports region monitoring to detect beacon regions
}
if CLLocationManager.isRangingAvailable() {
// Supports obtaining the relative distance to a nearby iBeacon device
}
キーポイント:
isMonitoringAvailable(for:)ビーコン領域の出入りを監視できるか確認してください。 -isRangingAvailable()デバイスが近くの iBeacon の相対距離を推定できるかどうかをチェックします。- いずれかの機能が利用できない場合、アプリはユーザーをオンサイトの位置情報プロセスに閉じ込めたままにしてはいけません。
地域監視を使用して近くのビーコンを見つける
(08:54) iBeacon は 2 つのステップをサポートしています。まず、領域モニタリングを使用して、近くに一致するビーコンがあるかどうかを検出します。ビーコン ハードウェアを展開するときは、近接 UUID、メジャー、マイナーを書き込む必要があります。講演では、これらの値を使用して、カフェ階層や特定のフード ステーションなどの階層を表現することを提案しています。
// Stage 1: Region Monitoring
func monitorBeacons() {
if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
let constraint = CLBeaconIdentityConstraint(uuid: proximityUUID)
let beaconRegion = CLBeaconRegion(
beaconIdentityConstraint: constraint,
identifier: beaconID
)
self.locationManager.startMonitoring(for: beaconRegion)
}
}
キーポイント:
CLBeaconIdentityConstraint近接 UUID を使用して、照合するビーコンのセットを記述します。 -CLBeaconRegion制約をビジネス識別子にバインドします。 -startMonitoring(for:)登録すると、マッチングエリアに出入りするときに代表者に通知が届きます。- 呼び出す前に作成する必要があります
CLLocationManagerそしてデリゲートを設定します。
ビーコン測距を使用して最も近い場所を特定する
(09:30) 地域に入ると、アプリは測距を開始します。測距は、より詳細な相対距離情報を提供し、同じ公園内の複数の食事スポットが近接しているという問題の解決に適しています。
// Stage 2: Beacon Ranging
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
guard let region = region as? CLBeaconRegion,
CLLocationManager.isRangingAvailable()
else { return }
let constraint = CLBeaconIdentityConstraint(uuid: region.uuid)
manager.startRangingBeacons(satisfying: constraint)
beaconsToRange.append(region)
}
func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
}
キーポイント:
didEnterRegionシステムが一致するビーコンを検出したことを示します。 -guard領域のタイプとレンジング機能も確認してください。 -startRangingBeacons(satisfying:)近くのビーコンの距離情報の取得を開始します。 -beaconsToRange現在の測距オブジェクトを記録して、必要に応じてその後の停止を容易にします。
(10:09) 測距結果を受信した後、Caffè Macs は最も近いビーコンを取得し、メジャー、マイナー、および近接度を使用してどの位置情報を表示するかを決定します。
// Stage 2: Beacon Ranging
func locationManager(
_ manager: CLLocationManager,
didRangeBeacons beacons: [CLBeacon],
in region: CLBeaconRegion) {
guard let nearestBeacon = beacons.first else { return }
let major = CLBeaconMajorValue(truncating: nearestBeacon.major)
let minor = CLBeaconMinorValue(truncating: nearestBeacon.major)
switch nearestBeacon.proximity {
case .near, .immediate:
displayInformation(for: major, and: minor)
default:
handleUnknownOrFarBeacon(for: major, and: minor)
}
}
キーポイント:
beacons.first現在の結果で最も近いビーコンを表します。 -majorそしてminor特定のレイヤー、特定のカフェ、特定の駅などのビジネス オブジェクトをマッピングするために使用されます。 -.nearそして.immediate位置情報は、位置が不明または遠方の場合にのみ表示され、保守的に扱われます。- 複数のビーコンが同じ UUID、メジャー、マイナーを共有する場合、講義リマインダーの結果は近さと正確さによってのみ区別される場合があります。
ロケーションエクスペリエンスを世界中の従業員に拡張
(11:32) 配置するマクロ レベルもあります。従業員が異なる地域にいる場合、同じ食事の受け取り時間を単一の形式で表示することはできません。 DateFormatter は、ユーザーのロケールの習慣に従って日付をテキストに変換します。
// Formatting Dates
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .short
dateFormatter.string(from: Date())
// "Jun 25, 2020 at 9:41 AM"
キーポイント:
dateStyle日付部分の表示粒度を制御します。 -timeStyle時間部分の表示粒度を制御します。 -string(from:)ユーザーが読み取り可能なテキストは、フォーマッタ設定に基づいて生成されます。- Caffè Macs のピックアップ ウィンドウ シーンでは、正確なローカリゼーション時間が必要です。
(12:41) 金額形式はデバイスのロケールのみを確認することはできません。講演内のキオスクの例は、ユーザーのロケールとビジネスの場所が異なる可能性があることを示しています。テキサスのレストランの注文金額は、他の地域通貨を誤って使用するのではなく、米ドルで構成する必要があります。
// Configuring the Format of Currency
let formatter = NumberFormatter()
formatter.currencyCode = "CAD"
formatter.numberStyle = .currency
formatter.string(from: amount)
// "CA$1.00"
キーポイント:
numberStyle = .currency事前定義された通貨形式を使用します。 -currencyCodeISO 4217 の 3 文字の通貨コードを使用します。CAD。- NumberFormatter は書式設定のみを担当し、通貨変換は担当しません。
- グローバル企業アプリでは、多くの場合、ユーザーのロケールとビジネスの場所の両方の通貨ルールを考慮する必要があります。
重要ポイント
1. パーク注文アプリのデフォルトの場所
手順: 会社のレストラン、ジム、またはシャトル アプリにデフォルトの位置設定を追加します。
実行する価値がある理由: このセッションの Caffè Mac は、最初にユーザー設定を使用してホームページのステータスを決定し、位置情報の許可が失敗した場合でも正しい位置を表示できます。
開始方法: を使用しますUserDefaults場所 ID を保存します。ホームページが起動したら、最初に設定を読みます。ユーザーが「最も近い」を選択した場合にのみ、コア ロケーション プロセスに入ります。
2. 近距離施設の認識
何をすべきか: 倉庫の棚、フロアの入り口、または会議室のドアにビーコンを配置して、従業員がいるエリアをアプリが自動的に識別できるようにします。
実行する価値がある理由: 複数の場所が互いに非常に近い場合、領域監視とビーコン測距によって識別の問題を解決できます。
開始方法: ビーコンの近接 UUID、メジャー、マイナーを計画します。使用CLBeaconIdentityConstraintそしてCLBeaconRegion監視エリア。エリアに入った後に呼ばれたstartRangingBeacons相対距離を取得します。
3. プライバシー最優先のロケーションポータル
対処方法: エンタープライズ アプリに場所を手動で選択する機能を追加し、機能拡張として場所のアクセス許可を使用します。
実行する価値がある理由: 講演では、位置情報サービスを承認するかどうかは従業員自身が決定するものであり、アプリは依然として拒否、制限付き、一時的な承認を適切に処理する必要があることを強調しました。
開始方法: 承認前にビジネス オプションを表示します。 Info.plist に目的を明確に書きます。didChangeAuthorizationミドルハンドル.restrictedそして.denied手動位置情報モードにマップします。
4. グローバル従業員の時間と人数の表示
やるべきこと: 地域をまたがる従業員アプリの食事の受け取り時間、予約枠、注文金額、償還金額を統一します。
実行する価値がある理由: DateFormatter と NumberFormatter を使用すると、手書き文字列によって引き起こされるローカル フォーマット エラーを減らすことができます。
開始方法: 使用日DateFormatter構成dateStyleそしてtimeStyle;金額についてNumberFormatterの.currencyスタイルを定義し、ビジネスに必要なものを明示的に設定しますcurrencyCode。
5. 多言語エンタープライズ インターフェイスの受け入れ
何をすべきか: エンタープライズ アプリのローカライズされたレイアウトを起動前チェックに組み込みます。
実行する価値がある理由: スピーチは、グローバル エンタープライズ エクスペリエンスの一環としての国際化で終わり、ユーザー インターフェイス ファイルが生成されます.strings翻訳用のプレースホルダー テキスト。
開始方法: まず、ユーザーに表示されるコピーを抽出します。 Xcode のローカリゼーション ツールを使用して生成します.strings;長い言語や右から左へ記述する言語でのレイアウトの柔軟性を確認します。
関連セッション
- ロケーションの新機能 — iOS 14 での Core Location の位置情報プライバシー制御と認証動作の変更を引き続き確認してください。
- 位置プライバシーのための設計 - 設計の観点から位置データを要求する方法を理解し、ユーザーに何を許可しているかを知らせます。
- フォーマッタ: データを人間にとって使いやすいものにする — 日付、時刻、数値、名前、リストのローカライズされた書式設定について詳しく説明します。
- Xcode を使用してローカリゼーションに適したレイアウトを構築する — グローバル従業員のシナリオで長いテキストと右から左への言語レイアウト チェックを完了します。
- スケーラブルなエンタープライズ アプリ スイートを構築する — 複数のエンタープライズ アプリが機能、構成、実稼働リリース戦略を共有する方法を引き続き学習します。
コメント
GitHub Issues · utterances