class APActivationPayload
(英語)
property list key NSAppClip
(英語)
ユーザーが特定の物理的な場所で利用するApp Clipを作成する際、ユーザーがタスクを実行する前に、ユーザーの位置情報を確認する必要がある場合があります。App Clipでは、ユーザーのプライバシーを保護しつつ高速起動を提供するため、ユーザーがいると想定される特定の場所を確認するための軽量メカニズムを利用しています。このメカニズムを採用し、ユーザーがこれを有効にした場合は、App Clipを呼び出すと表示されるApp Clipカードに、App Clipによる位置情報の確認をユーザーに通知するメモが表示されます。ユーザーは、App Clipカードのメモをタップして位置情報の確認を無効にすることもできます。
App Clipでユーザーの位置情報を確認できるようにするには、App ClipのInfo
ファイルを、次の手順で修正します。
App ClipのInfo
を開いてNSAppClip(英語)キーを追加し、型をDictionary
に設定します。
このディクショナリに、NSApp
(英語)をキーとするエントリを追加し、型としてBoolean
を選択して値をtrue
とします。
もしくは、プロパティリストエディタでInfo
ファイルを開き、キーのリストからApp Clipを選択してエントリを追加することもできます。これにより、キーがNSAppClip(英語)で、値がBoolean
型の2つのエントリ「Requests ephemeral user notifications(一時的なユーザー通知のリクエスト)」および「Requests location confirmation(位置情報の確認リクエスト)」がディクショナリに追加されます。デフォルトでは、両方のエントリの値はNO
です。「Requests location confirmation(位置情報の確認リクエスト)」の値をYES
に変更します。
注意
NSApp
(英語)キーのエントリは、完全版アプリのInfo
には追加しないでください。ユーザーの位置情報を確認する機能を利用できるのはApp Clipのみです。完全版アプリでは、コードを修正してユーザーの位置情報にアクセスする許可をリクエストするようにし、Core Location(英語)フレームワークを利用します。詳しくは、「ユーザーの位置情報の取得(英語)」を参照してください。
App ClipのInfo
ファイルを修正したら、想定される位置情報をApp Clipに提供するコードを追加します。位置情報を取得するには、App Clipを起動するURLの中にIDをエンコードし、このIDを使ってデータベースからビジネスの位置情報を検索します。また、App Clipを起動するURLの中に位置情報をエンコードする方法もあります。
起動時に位置情報にアクセスし、これに基づき半径最大500メートルのCLCircular
(英語)オブジェクトを作成した後、confirm
(英語)関数に渡します。
以下は、App Clipの起動時にユーザーの位置情報を確認するコードです。デバイスが位置情報サービスにアクセスすることをユーザーが拒否する場合も想定し、それぞれの結果に応じてユーザーインターフェイスを更新してください。
import UIKit
import AppClip
import AppClip
import CoreLocation
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
// Call the verifyUserLocation(_:) function in all applicable lifecycle callbacks.
func verifyUserLocation(_ activity: NSUserActivity?) {
// Guard against faulty data.
guard activity != nil else { return }
guard activity!.activityType == NSUserActivityTypeBrowsingWeb else { return }
guard let payload = activity!.appClipActivationPayload else { return }
guard let incomingURL = activity?.webpageURL else { return }
// Create a CLRegion object.
guard let region = location(from: incomingURL) else {
// Respond to parsing errors here.
return
}
// Verify that the invocation happened at the expected location.
payload.confirmAcquired(in: region) { (inRegion, error) in
guard let confirmationError = error as? APActivationPayloadError else {
if inRegion {
// The location of the NFC tag matches the user's location.
} else {
// The location of the NFC tag doesn't match the records;
// for example, if someone moved the NFC tag.
}
return
}
if confirmationError.code == .doesNotMatch {
// The scanned URL wasn't registered for the App Clip.
} else {
// The user denied location access, or the source of the
// App Clip’s invocation wasn’t an NFC tag or visual code.
}
}
}
func location(from url:URL) -> CLRegion? {
let coordinates = CLLocationCoordinate2D(latitude: 37.334722,
longitude: 122.008889)
return CLCircularRegion(center: coordinates,
radius: 100,
identifier: "Apple Park")
}
}
App Clipの呼び出しURLにアクセスする方法について、詳しくは「呼び出しへの応答」を参照してください。
class APActivationPayload
(英語)
property list key NSAppClip
(英語)