Диплинк не работает в мобильном Chrome в Xamarin Forms.

Вопрос или проблема

Я работаю с Xamarin Forms, где мне нужно использовать Deep Link для Android. Deep Link работает из любого мессенджера (Skype, WhatsApp и т. д.), но не работает в любом браузере на мобильном устройстве. Ниже мой код. Я опубликовал код JavaScript в deeplink.html

    <!DOCTYPE html>
<html>
<head>
<title>Приложение Veepee</title>
</head>
<body>
<!--<button id="checkApp">Проверить, установлено ли приложение Veepee</button>-->
<script>
    const urlParams = new URLSearchParams(window.location.search);
        //document.getElementById('checkApp').addEventListener('click', function() {
        window.addEventListener('load', function() {
            var pageName = urlParams.get('page'); // Замените на фактическое имя страницы, которую хотите передать
 
            // Функция для обнаружения, является ли устройство Android
            function isAndroid() {
                return /Android/i.test(navigator.userAgent);
            }
 
            // Функция для обнаружения, является ли устройство iOS
            function isIOS() {
                return /iPhone|iPad|iPod/i.test(navigator.userAgent);
            }
 
            if (isAndroid()) {
                // Код для Android
                var appPackageName="com.companyname.veepee";
                var appLink = 'intent://wholesale.veepeeonline.com/'+ pageName +'/#Intent;scheme=http;package=" + appPackageName + ";end';
 
                // Попытка открыть приложение
                window.location = appLink;
 
                // Резервный вариант для Play Store, если приложение не установлено
                setTimeout(function() {
                    alert('Приложение не установлено.');
                    window.location.href="https://play.google.com/store/apps/details?id=" + appPackageName;
                }, 2000);
            } else if (isIOS()) {
                // Код для iOS
                var appLink = 'veepeedomain://veepeedomain/'+ pageName ;
 
                // Попытка открыть приложение
                window.location = appLink;
 
                // Резервный вариант для App Store, если приложение не установлено
                setTimeout(function() {
                    alert('Приложение не установлено.');
                    window.location.href="https://apps.apple.com/in/app/veepee-international/id6450380169";
                }, 2000);
            } else {
                alert('Несоответствующее устройство.');
            }
        });
</script>
</body>
</html>

assetlinks.json

[
  {
    "relation": ["delegate_permission/common.handle_all_urls"],
    "target": {
      "namespace": "android_app",
      "package_name": "com.companyname.veepee",
      "sha256_cert_fingerprints": [
        "debug sha....",  
        "release sha..."
      ]
    }
  }
]

AndroidMenifest.xml

  <activity android:name="SplashActivity" android:exported="true" android:launchMode="singleTop">

</activity>

MainActivity.cs

 [Activity(Label = "Veepee", Icon = "@drawable/logo", Exported = true, Theme = "@style/MainTheme", MainLauncher = false, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, LaunchMode = LaunchMode.SingleTop)]
 [IntentFilter(new[] { Android.Content.Intent.ActionView },
               DataScheme = "http",
               DataHost = "wholesale.veepeeonline.com",
               DataPathPrefix = "/",
               AutoVerify = true,
               Categories = new[] { Android.Content.Intent.ActionView, Android.Content.Intent.CategoryDefault, Android.Content.Intent.CategoryBrowsable })]

 [IntentFilter(new[] { Android.Content.Intent.ActionView },
               DataScheme = "https",
               DataHost = "wholesale.veepeeonline.com",
               DataPathPrefix = "/",
               AutoVerify = true,
               Categories = new[] { Android.Content.Intent.ActionView, Android.Content.Intent.CategoryDefault, Android.Content.Intent.CategoryBrowsable })]

App.xaml.cs
protected override void OnAppLinkRequestReceived(Uri uri)
{
base.OnAppLinkRequestReceived(uri);

      if (uri.Host.ToLower() == "wholesale.veepeeonline.com" && uri.Segments != null && uri.Segments.Length == 2)
      {
          var queryParams = System.Web.HttpUtility.ParseQueryString(uri.Query);
          string name = queryParams["page"];
          //string action = uri.Segments[1].Replace("/", "");
          string action = name;
          bool isActionParamsValid = long.TryParse(uri.Segments[1], out long productId);
          Constants.PageNameFromURL = action;
          Constants.OpenFromURL = true;
          //if (action.ToLower() == "pendingreportview")
          //{
          //}
      }
  }

Пожалуйста, дайте мне решение. Спасибо заранее!

Ответ или решение

Ваша проблема заключается в том, что Deep Link работает из мессенджеров (таких как Skype и WhatsApp), но не функционирует в мобильных браузерах. Это распространенная проблема, связанная с обработкой URL-ссылок на Android. Давайте разберём основные моменты, которые могут помочь вам в разрешении данной ситуации.

Шаг 1: Проверка конфигурации файла AndroidManifest.xml

В вашем AndroidManifest.xml у вас уже настроены IntentFilter. Однако вам следует убедиться, что LaunchMode вашего MainActivity правильно настроен для обработки входящих ссылок:

[Activity(Label = "Veepee", Icon = "@drawable/logo", Exported = true, Theme = "@style/MainTheme", MainLauncher = false, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, LaunchMode = LaunchMode.SingleTop)]

Следите за тем, чтобы ваше activity было экспортировано, и добавьте следующее в IntentFilter:

[IntentFilter(new[] { Android.Content.Intent.ActionView },
               DataScheme = "http",
               DataHost = "wholesale.veepeeonline.com",
               DataPathPrefix = "/",
               AutoVerify = true,
               Categories = new[] { Android.Content.Intent.ActionView, Android.Content.Intent.CategoryDefault, Android.Content.Intent.CategoryBrowsable })]

Кроме того, убедитесь, что указаны все возможные пути и схемы, которые могут приводить к вашему приложению.

Убедитесь, что ваш assetlinks.json доступен по URL https://wholesale.veepeeonline.com/.well-known/assetlinks.json. Сертификаты должны соответствовать тем, которые указаны для вашего приложения. Проверьте, что SHA256 отпечатки действительно соответствуют вашим действительным подписи.

Шаг 3: Проверка JavaScript кода

Ваш JavaScript код кажется корректным, но стоит добавить дополнительные проверки для корректной обработки случаев, когда браузеры могут блокировать переход по ссылкам, если scheme не установлен. Вместо этого можно использовать явные HTTP и HTTPS ссылки как запасные пути.

var appLink = 'intent://wholesale.veepeeonline.com/'+ pageName +'/#Intent;scheme=http;package= com.companyname.veepee;end';

Этот вызов должен быть корректно прописан, чтобы указать на ваше приложение.

Если Deep Link не срабатывает, даже после всех проверок, крайне важно убедиться в правильной реализации метода OnAppLinkRequestReceived в вашем App.xaml.cs:

protected override void OnAppLinkRequestReceived(Uri uri)
{
    base.OnAppLinkRequestReceived(uri);
    // Дополнительная обработка, если необходимо
}

Убедитесь, что вы корректно анализируете URL и обрабатываете запрос.

Шаг 5: Проверка на другом устройстве или эмуляторе

Некоторые приложения, такие как Chrome на Android, могут иметь встроенные проверки безопасности, которые могут блокировать ваши ссылки. Попробуйте протестировать Deep Link на других устройствах или эмуляторах с разными версиями Android.

Заключение

Если всё вышеперечисленное не решает вашу проблему, возможно, стоит рассмотреть использование специализированных библиотек для реализации Deep Link в Xamarin или обратиться на форумы сообщества для получения дополнительной помощи.

Обратите внимание на любые ошибки в консоли браузера, так как они могут дать ценные подсказки о проблемах в вашей реализации. Надеюсь, эти шаги помогут вам устранить проблему с Deep Link в вашем приложении!

Оцените материал
Добавить комментарий

Капча загружается...