App Clip - 支持多个营业地点

Posted

技术标签:

【中文标题】App Clip - 支持多个营业地点【英文标题】:App Clip - Support Multiple Businesses Locations 【发布时间】:2020-10-11 13:53:55 【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

App Clip Code触发是什么意思? 您是否考虑将查询参数添加到 QR 和 NFC URL,以指示哪个 URL 来自哪个调用?我想不出别的办法 @LiazKamper App Clip Code 是 Apple 创建并在 WWDC 2020 期间展示的新二维码 atadistance.net/2020/08/29/… @LiazKamper 这正是我正在做的,每个二维码或 NFC 标签都有其唯一的 Id,当用户扫描二维码或 NFC 标签时它工作正常。问题是一旦安装了 App Clip,用户就可以手动启动它,因此缓存了最后一个 QR 码/NFC 标签,从开发人员的角度来看,应用程序启动就像用户扫描了 QR 码/NFC 标签一样: ( 感谢@LiazKamper,但这也不行,因为App启动体验总是一样的,App总是会以同样的方式进入SceneDelegate.willConnectTo。我们如何检查 N 启动是否不是缓存的 N-1? 【参考方案1】:

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

检查应用程序的启动方式、图标点击或 NFC/QR 扫描 从UserDefaultsKeychain 检索缓存数据

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

考虑多家企业。一个 App Clip 可以为许多不同的 企业或拥有多个地点的企业。同时 场景中,人们可能最终会使用 App Clip 不止一次 一次的业务或位置。 App Clip 必须处理这个用例 并相应地更新其用户界面。例如,考虑一种方式 在 App Clip 中最近的商家或位置之间切换, 并在用户启动时验证用户的位置

因此,现在您的特定位置标签应该映射到坐标[Longitude, Latitude]。 Apple 为 App Clips 引入了一个新的位置验证 API,它允许您一次性检查用户扫描的 App Clip 代码、NFC 标签或 QR 代码是否在它所说的位置。

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

    打开 App Clip 的 Info.plist,添加 NSAppClip 键,然后设置其 输入Dictionary。 以NSAppClipRequestLocationConfirmation为键向字典中添加一个条目,选择Boolean为 它的类型,并将其值设置为true

但使用 App Clip Location 服务不同:

    解析启动 App CLip 的 URL 上的信息 向您的数据库发送请求以获取此商家的位置信息 使用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 支持多个企业的方式

【讨论】:

没错,这就是 Apple 在联系他们后告诉我的。谢谢@Said 当我们调用 payload.confirmedAcquired 时,我们会看到一个提示,如果用户想要授予 App Clip 的位置权限,即使 info.plist 中的 NSAppClipRequestLocationConfirmation 设置为 true。我们没有向 Apple 注册营业地点,因为这会增加我们为每个 App Clip 注册每个地点的大量开销。根据我的理解,任何不提示用户的建议是,当通过 NFC/QR 码扫描进行调用时,应自动授予位置权限。

以上是关于App Clip - 支持多个营业地点的主要内容,如果未能解决你的问题,请参考以下文章

高德地图如何做地点标注?

企业营业执照识别的具体流程

地图如何标记多个地点?

应用缺少POI数据,如何开发地点深度信息?

google maps API 获取所有地点信息,如电话号码、营业时间

具有通用浏览器支持的 Clip-Path 的替代方案?