У меня было приложение Deeplinking, работавшее на iOS, но долгое время оно только частично работало на Android - оно показывало бы всплывающее окно с разборчивостью, но не go прямо в приложение (как будто autoVerify не было ' установлен на true). Здесь я поделюсь своим опытом работы с этим здесь, а также своими нерешенными вопросами по тем областям, которые мне пока не совсем удобны.
TLDR; Попробуйте очистить ваш Android HTTP / кэш службы утверждений !!
Вот еще кое-что, что я исправил по пути к этой точке ...
1) Эта статья здесь https://chris.orr.me.uk/android-app-linking-how-it-works/ рассказал мне о команде для очистки HTTP-кэша в Android, сочетая это с полной деинсталляцией после этого и повторным развертыванием было достаточно, чтобы заставить ее работать.
adb shell pm clear com.android.statementservice
2) В случае сомнений всегда полностью удаляйте установку, перед установкой и подождите 15 секунд, прежде чем пытаться проверить какие-либо команды ADB.
3) У меня было три домена, которые я хотел работать uat.myapp.com, www.myapp.com и myapp.com и я развернули мои Android ссылки на ресурсы. json неправильно, они были развернуты во всех средах, но во время тестирования я редактировал только одну в UAT. Оказывается, что в случае сбоя какого-либо ОДНОГО домена, это может привести к полной неудаче проверки при любых последующих попытках проверки! Я полагаю, что исправление ссылок на активы. json и очистка кэша на шаге 1 было достаточным для разрешения автоматической проверки.
4) В Safari на Ma c не работают цифровые средства проверки активов от Google, кнопки Ma *1119* отключены, что делает невозможным тестирование. Как только я использовал браузер Chrome вместо этого, я обнаружил, что мой UAT-файл хорошо подбирается, а мои UAT и LIVE - нет. Это подтвердило, что UAT работает, но мои два действующих домена не работают.
5) Я неправильно поместил пространство имен своих приложений в ссылки на ресурсы. json, но это ДОЛЖНО быть "android_app", это очень обманчиво, когда вы пытаясь следовать документации и заполнить ее собственным пространством имен, например
[
{
"relation":[
"delegate_permission/common.handle_all_urls"
],
"target":{
"namespace":"android_app",
"package_name":"com.mycompany.myapp",
"sha256_cert_fingerprints":[
"MY:REDACTED:SHA:WAS:HERE"
]
}
}
]
6) Будьте осторожны, не вставляйте в свой SHA1 вместо ключа подписи SHA256, который вы используете для своих сборок.
7) Моя подсказка была в том, что я выполнил эти команды ADB
$ adb shell dumpsys package domain-preferred-apps
Это вернуло 'ask' вместо ожидаемого 'Always'
App verification status:
...
Package: com.mycompany.myapp
Domains: myapp.com www.myapp.com uat.myapp.com
Status: ask <-- should be always
App linkages for user 0:
...
8a) Тестирование не работает, если вы вставляете URL-адрес непосредственно в строке поиска Chrome 8b) Тестирование не работает, если на вашем сайте есть ссылка на URL-адрес с глубокими ссылками, размещенный на том же сайте 8 c) Я протестировал, поместив файл publi c HTML в моем корзине Amazon S3 (таким образом, исходный домен был моим s3.eu-west-2.amazon aws .com) 8d) Эта команда ADB поможет вам протестировать без каких-либо из перечисленных выше осложнений
adb shell am start -a android.intent.action.VIEW \
-c android.intent.category.BROWSABLE \
-d "https://uat.myapp.com/search/xxxxx"
Это приведет к выводу как Следуя
Starting: Intent { act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=https://uat.myapp.com/... }
Приложение должно запускаться без двусмысленности / всплывающего окна приложения. Если вы установили всплывающее окно, то вернитесь отсюда назад и убедитесь, что вы сделали все вышеописанное. Это сработало для меня, но я не могу обещать, что это будет для вас. Если этого не произойдет, то есть и другие хорошие ссылки, которые объясняют, что еще может сбить вас с толку. Я перечислил их в конце этого SO вопроса.
9) Другой подсказкой было то, что журналы АБР должны показывать подтверждение того, что с проверкой все в порядке, но вместо этого ничего не говорилось
03-25 16:23:58.127: I/ActivityManager(769): START u0 {act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=https://uat.myapp.com/... flg=0x10000000 cmp=android/com.android.internal.app.ResolverActivity} from uid 2000
03-25 16:23:58.244: I/MicroDetectionState(6889): Should stop hotword detection immediately - false
03-25 16:23:58.296: I/ActivityManager(769): Displayed android/com.android.internal.app.ResolverActivity: +139ms
03-25 16:23:58.315: W/ResourceType(20085): Found multiple library tables, ignoring...
10) По какой-то причине вам нужна копия вашего приложения уже в магазине приложений (я думаю, они имеют в виду только в Google Play)
Итак, теперь я вам помог, возможно, вы сможете мне помочь понять несколько битов?
Q1) Почему цифровой верификатор активов иногда говорит, что он работает нормально, а затем сразу же говорит, что он не работает? Как ни странно, у тех, кто работает, максимальный возраст всегда меньше 60, у тех, кто терпит неудачу, максимальный возраст 600 - но если я переименую браузер sh, они сбрасывают обратно до 60 или 600. Так что это не проблема кэширования в браузере ( вынужденный refre sh) все же они, кажется, переключаются между рабочим и не все еще.
A) Рабочий ответ ...
(Обратите внимание, что у него есть баннер ERRORS , но он говорит «Нет»)
{
"statements": [
{
"source": {
"web": {
"site": "https://uat.myapp.com."
}
},
"relation": "delegate_permission/common.handle_all_urls",
"target": {
"androidApp": {
"packageName": "com.mycompany.myapp",
"certificate": {
"sha256Fingerprint": "MY:REDACTED:SHA:WAS:HERE"
}
}
}
}
],
"maxAge": "32.620904405s",
"debugString": "********************* ERRORS *********************\nNone!\n********************* INFO MESSAGES *********************\n* Info: The following statements were considered when processing the request:\n\n---\nSource: Web asset with site https://uat.myapp.com. (which is equivalent to 'https://uat.myapp.com')\nRelation: delegate_permission/common.handle_all_urls\nTarget: Android app asset with package name com.mycompany.myapp and certificate fingerprint MY:REDACTED:SHA:WAS:HERE\nWhere this statement came from:\n Origin of the statement: Web asset with site https://uat.myapp.com. (which is equivalent to 'https://uat.myapp.com')\n Include directives followed (in order):\n \u003cNone\u003e\nMatches source query: Yes\nMatches relation query: Yes\nMatches target query: Yes\n\n--- End of statement list. ---\n\n\n"
}
B) Сбой ...
{
"maxAge": "599.999999944s",
"debugString": "********************* ERRORS *********************\n* Error: unavailable: Error fetching statements from https://uat.myapp.com./.well-known/assetlinks.json (which is equivalent to 'https://uat.myapp.com/.well-known/assetlinks.json'): URL_ERROR/3 [10] while fetching Web statements from https://uat.myapp.com./.well-known/assetlinks.json (which is equivalent to 'https://uat.myapp.com/.well-known/assetlinks.json') using download from the web (ID 1).\n********************* INFO MESSAGES *********************\n* Info: No statements were found that match your query\n",
"errorCode": [
"ERROR_CODE_FETCH_ERROR"
]
}
Q2) Я ссылался на ключ подписи приложения (SHA256) в ссылках на ресурсы. json, но в документации Xamarin https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/deep-linking#android он ссылается на Firebase и наш проект firebase, который мы используем из приложения Центр уведомлений pu sh использует совершенно другой ключ SHA, поэтому google-services. json не чувствуют себя завершенными (он не ссылается на наш ключ подписи приложения - но из памяти уведомление / приложение pu sh). -center на самом деле все равно, только приглашения Firebase или API Firebase). Когда я попытался добавить свой ключ подписи приложения в тот же проект Firebase, он раздраженно сказал: «Клиент oAuth2 уже существует для этого пакета и SHA-1 в другом проекте». На самом деле, когда я читал, что в нем упоминается SHA1, и, возможно, я не вставлял в SHA256 ... Должен ли проект firebase ссылаться на ключ подписи приложения, чтобы заставить работать какой-либо механизм индексирования (я пока не сделал этого) ).
Q3) Функциональность индексации и глубокого связывания приложений Xamarin.Forms доступна только на платформах iOS и Android и требует минимум iOS 9 и API 23 соответственно. У меня установлена минимальная цель 16 и цель 28 (Android 9) - что будет с API <23? Будет только приложение diassambiguity всплывающее окно появляется (без авто не проверить) </p>
Q4) Я использую несколько фильтров намерений, но я не 100% уверен, что они не заменяют друг друга.
// *** HTTP Variants***
// Deep Links - uat.myapp.com
[IntentFilter(new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault },
DataScheme = "http",
DataHost = "uat.myapp.com",
DataPathPrefix = "/search/",
AutoVerify = true)]
// Deep Links - uat.myapp.com
[IntentFilter(new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault },
DataScheme = "https",
DataHost = "uat.myapp.com",
DataPathPrefix = "/search",
AutoVerify = true)]
// Deep Links - myapp.com
[IntentFilter(new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault },
DataScheme = "http",
DataHost = "myapp.com",
DataPathPrefix = "/search/",
AutoVerify = true)]
// Deep Links - www.myapp.com
[IntentFilter(new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault },
DataScheme = "http",
DataHost = "www.myapp.com",
DataPathPrefix = "/search/",
AutoVerify = true)]
//*** HTTPS Variants***
// Deep Links - myapp.com
[IntentFilter(new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault },
DataScheme = "https",
DataHost = "myapp.com",
DataPathPrefix = "/search/",
AutoVerify = true)]
// Deep Links - www.myapp.com
[IntentFilter(new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault },
DataScheme = "https",
DataHost = "www.myapp.com",
DataPathPrefix = "/search/",
AutoVerify = true)]
Я также отмечаю, что вы можете использовать массивы в DataHost и DataScheme, так что это можно безопасно сократить до следующего ...
[IntentFilter(new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault },
DataSchemes = new string[] {
"http",
"https"
},
DataHosts = new string[] {
"myapp.com",
"uat.myapp.com",
"www.myapp.com"
},
DataPathPrefix = "/search/",
AutoVerify = true)]
Q5) В моей деятельности Я использую режим запуска LaunchMode.SingleTask, будет ли это нормально для глубоких ссылок и комбинаций индексации приложений?
// WARNING - Don't set this to be singleInstance as this might affect the ProxyAndroidActivityResult function
// refer to https://groups.google.com/forum/#!topic/android-platform/gcgxOSBZNpY
[Activity(Label = "My App", Icon = "@mipmap/ic_launcher", RoundIcon = "@mipmap/ic_round_launcher", WindowSoftInputMode = SoftInput.AdjustResize, MainLauncher = false, LaunchMode = LaunchMode.SingleTask, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Xamarin.Forms.Platform.Android.FormsAppCompatActivity
Q6) Мой IntentFilter зарегистрирован на моей MainActivity, но я также использую SplashScreenActivity, которая запускает моя основная деятельность. Когда глубокая ссылка запускает приложение, мне интересно, добавлять ли аннотации IntentFilter в spla sh, но затем: а) что произойдет, если приложение уже запущено - будет ли показ spla sh, а затем вызовет основное действие? и будет ли это означать, что мне нужно передать данные из операции spla sh в MainActibity или же будут доступны глубокие ссылки непосредственно из MainActivity?
Q7) Во время настройки проекта мне нужно было обновить к последним нюгетам Firebase (из-за проблем со сборкой) и добавьте нюгет https://www.nuget.org/packages/Xamarin.Forms.AppLinks/. Мы используем ProGuard в нашем проекте, и я обеспокоен тем, что мне может понадобиться добавить что-то, чтобы ProGuard ничего не удаляла?
Использованные ресурсы
Xamarin Specifi c - https://docs.microsoft.com/en-us/xamarin/android/platform/app-linking#configure -intent-filter
Xamarin Specifi c - https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/deep-linking
Очень хорошо - https://medium.com/@ageitgey / все, что вам нужно -to-know-about-реализовать- ios -and- android -mobile-deep-linking-f4348b265b49
Приложение связывает фильтры намерений в ссылках на ресурсы. json не работает Android
https://developers.google.com/digital-asset-links/tools/generator (у меня работает только в Chrome, а не Safari на Ma c - кнопки остаются отключенными)
https://chris.orr.me.uk/android-app-linking-how-it-works/