#ios #ios14 #apple-appclips
#iOS #ios14 #apple-appclips
Вопрос:
Когда я разрабатывал свой интерфейс запуска App Clip, я имел в виду, что приложение может быть запущено только через QR code
, NFC
или App Clip Code
. Вот почему я привязал запуск приложения к определенному местоположению с определенным идентификатором.
Когда мое приложение запустилось на прошлой неделе, и когда я пытаюсь отсканировать NFC-метку, приложение запускается каждый раз, как и ожидалось.
Теперь, если я нажму на значок клипа приложения на главном экране, приложение запустится с последним отсканированным URL-адресом. Я немного погуглил и обнаружил, что App Clip кэширует последний отсканированный URL-адрес и имитирует запуск универсальной ссылки при нажатии на значок!
Это не работает для меня! Итак, я ищу способ проверить, было ли запущено приложение с помощью сканирования или касания? Я пытался зарегистрировать запуск приложения, но оно всегда выполняется в порядке либо с помощью сканирования (NFC), либо с помощью значка:
AppDelegate.didFinishLaunchingWithOptions()
SceneDelegate.willConnectTo() // It's here where I am handling the Universal Link
Как я могу проверить, запустил ли пользователь приложение с помощью крана или сканирования? Зная, что приложение всегда имитирует универсальную ссылку запуска при нажатии на значок!
Или как я могу искать сохраненный URL-адрес? Я попытался получить все UserDefaults
и некоторые Keychain
данные, но ничего не нашел!
Комментарии:
1. Что означает запуск
App Clip Code
?2. Рассматривали ли вы возможность добавления параметра запроса к URL-адресам QR и NFC, который будет указывать, какой URL-адрес был получен из какого вызова? Я не могу придумать другого способа
3. @LiazKamper
App Clip Code
— это новый QR-код, созданный Apple и представленный на WWDC 2020, atadistance.net/2020/08/29 /…4. @LiazKamper Это именно то, что я делаю, каждый QR-код или NFC-метка имеет свой уникальный идентификатор, и он отлично работает, когда пользователь сканирует QR-код или NFC-метку. Проблема в том, что после установки приложения Clip пользователь запускает его вручную, поэтому последний QR-код / NFC-тег кэшируется, и запуск приложения с точки зрения разработчика будет таким, как если бы пользователь отсканировал QR-код / NFC-тег: (
5. Спасибо @LiazKamper, но это тоже не сработает, потому что процесс запуска приложения всегда одинаков, приложение всегда будет вводить SceneDelegate.willConnectTo таким же образом. Как мы можем проверить, является ли запуск N не кэшированным N-1?
Ответ №1:
Я столкнулся с той же проблемой! И, к сожалению, нет способа:
- Проверьте, как было запущено приложение, нажав на значок или отсканировав NFC / QR
- Для извлечения кэшированных данных из
UserDefaults
одного илиKeychain
В своих рекомендациях Apple четко указано, что если вы хотите поддерживать несколько предприятий, вам следует добавить фактор служб определения местоположения!
Рассмотрим несколько предприятий. Приложение Clip может поддерживать множество разных предприятий или бизнес, имеющий несколько местоположений. В обоих сценариях пользователи могут в конечном итоге использовать App Clip для более чем одного бизнеса или местоположения одновременно. Приложение Clip должно обрабатывать этот вариант использования и соответствующим образом обновлять свой пользовательский интерфейс. Например, рассмотрите способ переключения между недавними предприятиями или местоположениями в вашем приложении Clip и проверяйте местоположение пользователя при его запуске.
Итак, теперь ваши теги для определенного местоположения должны быть сопоставлены с координатами [Longitude, Latitude]
. Apple представила новый API проверки местоположения только для приложений Clips, который позволяет выполнять одноразовую проверку, чтобы увидеть, соответствует ли код клипа приложения, метка NFC или QR-код, отсканированный пользователем, там, где указано.
Включите приложение Clip для проверки местоположения пользователя Чтобы включить приложение Clip для проверки местоположения пользователя, измените файл приложения Clip Info.plist
:
- Откройте клип вашего приложения
Info.plist
, добавьте ключ NSAppClip и задайте его типDictionary
. - Добавьте запись в словарь в
NSAppClipRequestLocationConfirmation
качестве ключа, выберитеBoolean
в качестве ее типа и установите для нее значениеtrue
.
Но использование служб определения местоположения App Clip отличается:
- Проанализируйте информацию по URL-адресу, который запускает приложение CLip
- Отправьте запрос в свою базу данных для получения информации о местоположении для этого бизнеса
- Используется
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
Комментарии:
1. Именно это Apple сказала мне после обращения к ним. Спасибо @Сказал
2. Мы видим запрос, предоставляемый пользователю, если он хочет предоставить разрешения на местоположение для приложения Clip, когда мы вызываем payload.confirmedAcquired, хотя
NSAppClipRequestLocationConfirmation
true
в info.plist установлено значение. Мы не регистрируем бизнес-местоположение в Apple, поскольку это добавило бы нам значительные накладные расходы на регистрацию каждого местоположения для каждого клипа приложения. Любые предложения не запрашивать пользователя, насколько я понимаю, должны автоматически предоставляться разрешения на определение местоположения, когда вызовы выполняются с помощью сканирования NFC / QR-кода.