Android Глубокая ссылка на то, как исправить ошибки проверки верификатора активов между успехом и неудачей, SHA256 в базе данных огня, минимальная цель 16, оптимальные намерения и обработка spla sh - PullRequest
0 голосов
/ 25 марта 2020

У меня было приложение 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/

...