2017-01-16 5 views
0

Я использую Xamarin для разработки приложения для Android. Я хочу, чтобы иметь возможность открыть приложение, когда пользователь открывает ссылку example://gizmos, поэтому я добавляю это мой файл манифеста:Xamarin Android глубокая ссылка не работает

<activity android:name="mynamespace.MyActivity" 
android:label="@string/application_name" > 
<intent-filter android:label="@string/application_name"> 
    <action android:name="android.intent.action.VIEW" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <category android:name="android.intent.category.BROWSABLE" /> 
    <!-- Accepts URIs that begin with "http://www.example.com/gizmos” --> 
    <data android:scheme="http" 
     android:host="www.example.com" 
     android:pathPrefix="/gizmos" /> 
    <!-- note that the leading "/" is required for pathPrefix--> 
    <!-- Accepts URIs that begin with "example://gizmos” --> 
    <data android:scheme="example" 
     android:host="gizmos" /> 

</intent-filter> 
</activity> 

Это взято непосредственно из документации Android. Я пытаюсь нажать на ссылку example://gizmos из почтового приложения на моем физическом устройстве Android, но я получаю сообщение: Unable to find application to perform this action

EDIT

Это не то же самое, как предложил дубликат, они не используют Xamarin.

+0

Возможный дубликат [Deep сшивание намерения не делает горе rk] (http://stackoverflow.com/questions/24808777/deep-linking-intent-does-not-work) – Demitrian

+0

Не дубликат. Они даже не используют Xamarin. – Darius

+0

У меня тоже такая же проблема, для меня получение класса не найдено исключение https://stackoverflow.com/questions/48680875/getting-class-not-found-exception-when-doing-deeplinking-in-xamarin-forms –

ответ

2

В Xamarin андроид конфигурация деятельности устанавливается в атрибуте класса активности

Например:

namespace XamarinAndroidDeepLink 
{ 
    [Activity(Label = "XamarinAndroidDeepLink", MainLauncher = true, Icon = "@drawable/icon")] 
    [IntentFilter(new[] { Android.Content.Intent.ActionView }, 
    DataScheme = "wori", 
    DataHost = "example.com", 
    DataPathPrefix ="/", 
    Categories = new[] { Android.Content.Intent.CategoryDefault,Android.Content.Intent.CategoryBrowsable })] 
    public class MainActivity : Activity 
    { 
     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      // Set our view from the "main" layout resource 
      SetContentView (Resource.Layout.Main);  
     } 
    } 
} 

И вам не нужно, чтобы установить фильтр намерений в Manifest С # будет помогите вам построить конфигурацию в манифесте.

Протестируйте Deeplink по ADB:

adb shell am start -W -a android.intent.action.VIEW -d "wori://example.com/?id=1234" XamarinAndroidDeepLink.XamarinAndroidDeepLink 

Вы найдете начать ваше приложение:

enter image description here

Некоторые браузер не может отличить URL. Они добавят http:// до вашего URL-адреса клиента, и когда вы вводите URL-адрес в адресной строке, он будет использовать поисковую систему.

Я предлагаю вам разработать вам собственный HTML-страницу и загрузить Google Chrome, чтобы открыть HTML-страницу:

Примечание: Не открывать страницу HTML с помощью HTML Viewer

<html> 
<head> 
    <title>Product 12345</title> 
</head> 
<body> 
    <a href="wori://example.com/?id=1234">lalala</a> 
</body> 
</html> 

Скачать Google Chrome и открыть ссылку:

enter image description here

+0

Это не работает, когда я открываю ссылку http://example.com. Нужно ли мне что-то добавлять в «Категории»? – Darius

+1

@Darius Я отредактировал ответ, изменив DataScheme на «wori». И откройте его браузером. Не открывайте страницу html с помощью браузера Chrome html viewer. –

+0

Это работает, спасибо! Однако я заметил что-то странное: когда я открываю приложение по ссылке, он открывает отдельное приложение (вместо того, чтобы использовать то же самое приложение, которое уже открыто), поэтому у меня есть 2 из того же приложения. Это происходит только на моем устройстве Nexus 5 (отлично работает на Galaxy S6). Я заметил, что когда приложение открывается так, название приложения отличается, оно использует имя сборки (или пространство имен) ... поэтому я считаю, что именно поэтому. Вы знаете, как указать имя для использования, чтобы я мог (возможно) избежать этого? – Darius