App Clip - 支持多个业务地点

App Clip - Support Multiple Businesses Locations

当我设计我的 App Clip Launch 体验时,我想应用程序只能通过 QR codeNFCApp Clip Code 触发。这就是为什么我 link 将 App Launch 编辑到具有特定 ID 的特定位置。

当我的应用程序上周上线时,当我尝试扫描 NFC 标签时,应用程序每次都按预期启动。

现在,如果我点击主屏幕上的 App Clip 图标,应用程序将以最后扫描的 URL 启动我进行了一些谷歌搜索,我发现 App Clip 正在缓存最后 [=30] =] 扫描并模拟通用 link 在点击图标时启动!

这对我不起作用!所以我正在寻找一种方法来检查应用程序是通过扫描还是点击启动的?我尝试记录应用程序的启动,但它总是按顺序 运行 通过扫描 (NFC) 或点击图标:

AppDelegate.didFinishLaunchingWithOptions()
SceneDelegate.willConnectTo() // It's here where I am handling the Universal Link

如何检查用户是否通过点击或扫描启动了应用程序?知道该应用程序总是在点击图标时模拟通用启动 Link!

或者如何查找已保存的 URL?我试图获取所有 UserDefaults 和一些 Keychain 数据,但我一无所获!

我遇到了同样的问题!不幸的是,没有办法:

  • 检查应用程序是如何启动的,点击图标或NFC/QR扫描
  • UserDefaultsKeychain
  • 中检索缓存数据

Apple 在他们的 Human Interface Guidelines 中明确表示,如果你想支持多个企业,你应该添加位置服务因素!

Consider multiple businesses. An App Clip may power many different businesses or a business that has multiple locations. In both scenarios, people may end up using the App Clip for more than one business or location at a time. The App Clip must handle this use case and update its user interface accordingly. For example, consider a way to switch between recent businesses or locations within your App Clip, and verify the user’s location when they launch it.

所以,现在您的特定位置标签应该映射到坐标 [Longitude, Latitude]。 Apple 为 App Clips 引入了新的位置验证 API,允许您进行 one-time 检查以查看用户扫描的 App Clip 代码、NFC 标签或 QR 码是否在其说明的位置是。

启用您的 App Clip 以验证用户的位置 要使您的 App Clip 能够验证用户的位置,请修改您的 App Clip 的 Info.plist 文件:

  1. 打开 App Clip 的 Info.plist,添加 NSAppClip 键,然后设置它 输入 Dictionary.
  2. NSAppClipRequestLocationConfirmation为键,select Boolean为字典添加条目 它的类型,并将其值设置为 true.

但是使用 App Clip Location 服务是不同的:

  1. 解析启动App CLipURL的信息
  2. 向您的数据库发送请求以获取该企业的位置信息
  3. 使用 activity.appClipActivationPayload 确认位置(在步骤 2 中)是否在用户当前所在的区域。

下面的代码(从 Apple 复制)解释了如何做。

import UIKit
import AppClip
import CoreLocation

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    
    var window: UIWindow?
    
    // Call the verifyUserLocation(_:) function in all applicable life-cycle 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? {
        
        // You should retrieve the coordinates from your Database
        let coordinates = CLLocationCoordinate2D(latitude: 37.334722,
                                                 longitude: 122.008889)
        return CLCircularRegion(center: coordinates,
                                radius: 100,
                                identifier: "Apple Park")
    }
}

就是这样,这就是您如何使用 App Clip 支持多个企业的方式