ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
位置情報を利用するエンタープライズAppを構築する
自社ビジネス用に、位置情報を利用するエンタープライズAppを開発し、従業員の日常生活を個人向けに使いやすくします。Appleが、iBeaconと位置情報サービスを使用し、自社内のカフェテリア向けにCaffe Macs appを構築した方法と、従業員のプライバシーを保護しながら、それらのツールとフレームワークをどのように貴社独自のAppに応用するか学びましょう。そこから、海外の従業員にすばらしい日常生活を届けるためのローカライズ活用方法についてもご説明します。
リソース
関連ビデオ
WWDC20
WWDC19
-
ダウンロード
こんにちは WWDCへようこそ “位置情報を利用する エンタープライズアプリケーションの構築” 私の名前はルーカス AppleのCaffè Macsチームのエンジニアです このセッションでは ミクロとマクロのレベルで ロケーションをどのように取り入れ Caffè Macs Appを 作っているのかをお話します ソーシャル・ディスタンシングに取り組む前の 従業員の体験を中心にお話し 安全に配慮した新機能についてもご紹介します 皆さんが作るAppが ご自身のカフェや会社の施設向け あるいは エンタープライズ・Appでも すばらしいAppを提供するのに役立つはずです 初めに Caffè Macsの内部をお見せします 仕組みを知れば 私たちのAppで ロケーションが重要な理由が分かるでしょう 次に 位置情報サービスを使わず ユーザー設定を使ったApp体験についてです そして 位置情報サービスを使った 現場に合わせたApp体験の提供についてお話し 最後に Appの国際化についても 簡単に触れます では Caffè Macsの概要と 従業員の体験からお話しましょう Caffè MacsはApple Parkにある 社員専用のスペースで 従業員は ここで会話を楽しんだり 食事をすることができます ランチや軽食 コーヒーなど 健康的でおいしい食事をとるには最高の場所です 私たちは従業員に 質のよい食事とサービスを提供するため メニューの閲覧からApple Payを使った決済まで 社内専用のAppで行えるようにしています ゲストはキオスクAppの入ったiPadを使用します ユーザーからの注文は厨房のiPadの Kitchen Display Systemへと送られ 注文を受け取るとシェフが作り始めます
料理が完成すると Kitchen Display Systemで ユーザーへ通知が送られます
Caffè Macs Appの 基本設定と位置情報サービスは 従業員に出来たての食事を提供するために 重要な要素です カフェの簡単な概要は以上です
次は 位置情報に基づいた 体験についてお話します Caffè Macs Appでは従業員は デフォルトのロケーションを設定します この設定でカフェのメニューを すぐに表示することができます 私は“最寄り”に設定しているので Appは私の現在地を使用して カフェのメニューを表示します 特定のカフェを設定すれば そのカフェのメニューを表示します ユーザーはロケーションに ひも付けるかどうかを選択でき 位置情報サービスを拒否することもできます ユーザーのカフェの設定は Appの起動時に確認します 設定が“最寄り”の場合は 位置情報サービスを基に表示するカフェを決定し 特定のカフェを選択した場合は そのカフェのメニューを表示します これらのオプションにより ユーザーは閲覧するメニューを選択できるのです これはCaffè Macs Appの 最新のアップデートにも役立っています カフェの受け取り窓口を すぐに選べるので ソーシャル・ディスタンスが保てるのです この設定をApp起動時のデフォルトとして 保存することもできます FoundationのUserDefaultsに ユーザー設定を保存すれば簡単に設定できます キーと値のペアが永続的に保存され Appの起動時は常に有効です Appで この種の小さな設定を保存するには UserDefaultsが適しています このように まずはユーザーがデフォルトの ロケーションを選べるようにするとよいでしょう 次に 位置情報を使って 現場に合わせた体験を提供する方法をお話します Caffè Macs Appの課題はユーザーの位置に 基づいた正しいメニューを表示することです 社内には大きなカフェと 近くにはコーヒーステーションがあり 常に人が行き来しています 皆さんもAppを作る際に 直面する問題かもしれません 複数のロケーションが隣接しているのです 私たちはユーザーの期待どおりに 確実に注文が入るようにしたいのです そこでCore Locationと iBeaconプロトコルを使うことができます AppでCore Locationを使用するには ユーザーにアクセス許可をリクエストします Appleはプライバシーを重視するため 位置情報サービスを許可するかどうかは 従業員が決められます アクセス許可は必要なデータのみに限定し 必要な理由をユーザーに説明することが大切です 位置情報のプライバシー確保については 今年の関連セッションをご覧ください Appが求めるアクセス許可は2種類あります “使用中は許可”と“常に許可”です “使用中は許可”はAppの起動中のみ locationイベントを受け取ります バックグランドのlocationの使用を有効化し アクセスを許可し続けることもできます “常に許可”はAppの起動等に関係なく バックグランドでアクセスを許可します しかし これはCaffè Macs Appには不要です Caffè Macs Appでは“使用中は許可”だけで 十分だからです 新たな“近似許可”のリクエストも含めた 許可リクエストの詳細は こちらの“Core Location”の セッションをご覧ください リクエストをしても 情報が得られるとは限りません アクセスを拒否された場合も 適切な処理が必要です ユーザーがリクエストどおりに許可しない場合や “1度だけ許可”を選択し 限定的に許可をすることもあります Appが“使用時にリクエスト”の 許可を求めるには NSLocationWhenInUseUsageDescription キーと 利用目的をInfo.plistファイルに追加します システムが利用目的の説明文と 許可リクエストのダイアログを表示するので 許可を求める前に必要なキーを Info.plistファイルに追加します キーが存在しなければ 許可リクエストは却下されます
ユーザーがタスクの実行において 位置情報サービスが必要な時のみ許可を求めます Appが位置情報を求める理由が明確でなければ ユーザーは拒否するかもしれません
許可を求めたり Appの許可ステータスが変わる時は locationManagerのデリゲートオブジェクトの didChangeAuthorizationメソッドを使います 位置情報サービスの可用性は 常に変わる可能性があります ユーザーは特定のAppのみ またはすべてのAppの 位置情報サービスを無効にできます Appの実行中に可用性ステータスが変わると システムはlocationManagerを呼び出し didChangeAuthorizationメソッドで通知します
位置情報サービスが求めるハードウェアは すべての端末にあるとは限りません 使用する位置情報サービスを決定する前に CLLocationManagerオブジェクトのメソッドで 端末がサービスに対応しているか確認しましょう 位置情報サービスが利用できない場合でも 先ほど話したデフォルト設定が使えます Appが許可され 端末が対応していれば すぐにロケーションを利用できます ビーコン信号の設置には Core Locationが使えます ビーコンは信号を発信するデバイスで その信号が検出されるとAppへ送られます この信号でユーザーがカフェにいるかを識別し 特定のビーコン信号を検出することで そのカフェのメニューを表示できるのです iBeaconプロトコルの使用に必要なのは 位置情報のアクセス許可のみです
ビーコン本体の配備には proximity UUID メジャー番号 マイナー番号の設定が必要です
各ビーコンを識別する一意的な番号をつけると Appがビーコンを区別できるようになります
また ユースケースに該当すれば 階層を作るのにも便利です 例えば 何階のカフェなのか どのフードステーションなのかです
ビーコンが端末に一意の番号を一斉送信し 位置情報に基づいた製品やサービスを提供します
ビーコン対応をAppに追加するには 2つの段階でビーコンの検出があります まず リージョン監視を使用し ビーコンを検出します もう1つは ビーコン距離測定を使用して 検出したビーコンへの接近度合を判断します 詳細を知りたい方は2019年の “What's New in Core Location”をご覧ください リージョン監視を使い ビーコン接近時に Appにアラートを出す方法はこうです ビーコンの監視にはproximityUUIDを使い CLBeaconIdentityConstraintオブジェクト作成 次に CLBeaconRegionオブジェクトを インスタンス化し CLLocationManagerオブジェクトの startMonitoringforメソッドで登録します beaconRegionには該当ビーコンのproximityUUID メジャー番号 マイナー番号があります 番号が一致するビーコンのみが デリゲートオブジェクトを呼び出します その前にCLLocationManagerオブジェクトを書き デリゲートをひも付けておく必要があります
一致するビーコンが検出されると CLLocationManagerオブジェクトは LocationManagerのdidEnterRegion メソッドを呼び デリゲートに通知します
同様に 検出されたビーコンが領域外になると locationManagerはLocationManagerの didExitRegionメソッドを呼びます
Appを実行している端末で 距離測定ができるかどうかは CLLocationManagerの isRangingAvailable型メソッドで確認できます
距離測定は端末がサービスに 対応している場合のみ始めましょう また オプションでビーコンを保存しておくと 距離測定をオンデマンド型で停止できます メジャー番号とマイナー番号を使うと ビーコンを一意的に特定できます 複数のビーコンが同一のUUID メジャー番号 マイナー番号を持つ場合 LocationManagerのdidRangeBeaconsin メソッドに渡されるビーコンの配列の区別は 接近度合と正確度の値だけができるでしょう ビーコン信号の距離測定の情報を活用すれば 現場に合った体験を提供できるのです また 位置情報サービスはAppを ユーザー環境にさらに連動させることができます では Appの動作をロケーションに 適応させる方法について世界規模で話しましょう Appleの従業員は世界中にいます 私たちは使用する地域に関係なく 最高の体験をAppで提供したいと考えています グローバルなエンタープライズ・Appには 国際化で考慮すべき点が多くあります ユーザーに見える日付や時間の表記には DateFormatterが提供する 多言語に対応した 事前設定や設定オプションがあります
DateFormatterのインスタンスは dateオブジェクトの文字列表現を作成し 日付と時間の文字表現を変換して dateオブジェクトに代入します
例えば 住む地域が異なれば 日付や時間も違う書式を好むかもしれません ソーシャル・ディスタンスのために 新しく追加したピックアップウィンドウ機能では ユーザーがどこにいても 時間の書式を 選択できるようにする必要があります DateFormatterインスタンスの 作成方法はこうです Foundationフレームワークも NumberFormatterクラスを持っています NumberFormatterのインスタンスは NSNumberオブジェクトの文字列表現を作り 数値の文字列表現に変換して NSNumberオブジェクトに代入できます ただし NumberFormatterは書式設定のみであり 通貨の換算は行いません
金額書式の設定には事前定義された 通貨書式スタイルの使用が可能で これをNumberFormatterの numberStyleプロパティが使います 端末のロケールとISO 4217通貨コードの 両方を守ることで NumberFormatterインスタンスを使って 金額の書式が設定できます このキオスクAppでも注文の一覧画面で NumberFormatterを使っています これは合計金額の書式を ユーザーのロケールに合わせるのに最適です しかし 合計額がウルグアイペソで 表示されているのにお気づきですか モーダルの後ろにはテキサスの “Parmer Lane 5カフェ”と見えます 金額書式を正すには通貨コードを アメリカドルに設定する必要があります あらかじめ書式が定められた 通貨スタイルに設定し NumberFormatterのロケールと 通貨コードも変更して下さい 通貨コードは3文字のコードで ほとんどの場合 国を表す2桁のインターネットコードと 通貨単位を示す1文字で構成されます 例えば カナダドルの通貨コードはCADです NumberFormatterのロケールインスタンス プロパティでは 通貨コードや小数点の記号など 数多くのフォーマッター属性の デフォルト値が決まっています 通貨コードとロケールを変更すれば ユーザーやビジネスに合った設定で表示できます 詳細については今年のフォーマッターに関する セッションをご覧ください 効果的なユーザー体験を提供するには 希望言語へのローカライズが必要です Xcodeはユーザーインターフェースのファイルに .stringsの拡張子付きのファイルを生成します その中に 後で翻訳文を挿入するための プレースホルダーがあります こちらのセッションで Appをローカライズする模範をご覧ください 今回はCaffè Macs Appを例に ユーザー設定を使い デフォルトロケーションの 体験を提供する方法を紹介しました 位置情報サービスは位置情報ベースの製品や サービスを提供し さらに進歩します 国際化が進み 皆さんのAppは 世界のどこでもすばらしい体験を与えるでしょう
Caffè Macs Appでは ミクロとマクロのレベルで ロケーションを取り入れることで Appleの従業員に すばらしい体験を提供しています 本日の内容が 皆さんのAppにどう生かされるか いつか見られる日を楽しみにしています
-
-
3:28 - Preferences: User-defined Preferred Location
// Storing the user’s preference using UserDefaults UserDefaults.standard.set(defaultLocation.id, forKey: "defaultLocationId") let defaultLocationId = UserDefaults.standard.integer(forKey: "defaultLocationId")
-
6:14 - Location Services: Requesting Authorization
// 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 } }
-
7:02 - Location Services: Determining Device Support
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 }
-
8:54 - Stage 1: Region Monitoring
// 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) } }
-
9:30 - Stage 2: Beacon Ranging
// 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) { }
-
10:09 - Stage 2: Beacon Ranging
// 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) } }
-
11:32 - Formatting Dates
// Formatting Dates let dateFormatter = DateFormatter() dateFormatter.dateStyle = .medium dateFormatter.timeStyle = .short dateFormatter.string(from: Date()) // "Jun 25, 2020 at 9:41 AM"
-
12:41 - Configuring the Format of Currency
// Configuring the Format of Currency let formatter = NumberFormatter() formatter.currencyCode = "CAD" formatter.numberStyle = .currency formatter.string(from: amount) // "CA$1.00"
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。