ドキュメント

ユーザーの物理的な位置の確認

プライバシーを尊重しながら、ユーザーの物理的な位置をすばやく確認するコードを追加します。

概要

ユーザーが特定の物理的な場所で利用するApp Clipを作成する際、ユーザーがタスクを実行する前に、ユーザーの位置情報を確認する必要がある場合があります。App Clipでは、ユーザーのプライバシーを保護しつつ高速起動を提供するため、ユーザーがいると想定される特定の場所を確認するための軽量メカニズムを利用しています。このメカニズムを採用し、ユーザーがこれを有効にした場合は、App Clipを呼び出すと表示されるApp Clipカードに、App Clipによる位置情報の確認をユーザーに通知するメモが表示されます。ユーザーは、App Clipカードのメモをタップして位置情報の確認を無効にすることもできます。

ユーザーの物理的な位置を確認できるApp ClipのApp Clipカード。

App Clipによるユーザーの位置情報の確認の有効化

App Clipでユーザーの位置情報を確認できるようにするには、App ClipのInfo.plistファイルを、次の手順で修正します。

  1. App ClipのInfo.plistを開いてNSAppClip(英語)キーを追加し、型をDictionaryに設定します。

  2. このディクショナリに、NSAppClipRequestLocationConfirmation(英語)をキーとするエントリを追加し、型としてBooleanを選択して値をtrueとします。

App Clipがユーザーの位置情報を確認するためのエントリが含まれるInfo.plistファイル。

もしくは、プロパティリストエディタでInfo.plistファイルを開き、キーのリストからApp Clipを選択してエントリを追加することもできます。これにより、キーがNSAppClip(英語)で、値がBoolean型の2つのエントリ「Requests ephemeral user notifications(一時的なユーザー通知のリクエスト)」および「Requests location confirmation(位置情報の確認リクエスト)」がディクショナリに追加されます。デフォルトでは、両方のエントリの値はNOです。「Requests location confirmation(位置情報の確認リクエスト)」の値をYESに変更します。

ユーザーの物理的な位置を確認するコードの追加

App ClipのInfo.plistファイルを修正したら、想定される位置情報をApp Clipに提供するコードを追加します。位置情報を取得するには、App Clipを起動するURLの中にIDをエンコードし、このIDを使ってデータベースからビジネスの位置情報を検索します。また、App Clipを起動するURLの中に位置情報をエンコードする方法もあります。

起動時に位置情報にアクセスし、これに基づき半径最大500メートルのCLCircularRegion(英語)オブジェクトを作成した後、confirmAcquired(in:completionHandler:)(英語)関数に渡します。

以下は、App Clipの起動時にユーザーの位置情報を確認するコードです。デバイスが位置情報サービスにアクセスすることをユーザーが拒否する場合も想定し、それぞれの結果に応じてユーザーインターフェイスを更新してください。


import UIKit
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にアクセスする方法について、詳しくは「呼び出しへの応答」を参照してください。

関連項目

起動