откройте приложение flutter, используя определенный URL (глубокая ссылка)

#android #flutter #deep-linking

#Android #flutter #глубокая ссылка

Вопрос:

Я только что разработал приложение для электронной коммерции с использованием платформы flutter, я пытаюсь предоставить определенный URL для любого продукта, чтобы клиент мог открыть этот экран сведений о продукте в приложении, используя общий URL. Я использовал пакет uni_links для работы с этой ссылкой, но я не знаю, в чем проблема, потому что приложение не открывается, когда я открываю URL в браузере, вот коды, которые я использовал.

1- AndroidManifest.xml

 <application
    android:name="io.flutter.app.FlutterApplication"
    android:label="ecards"
    android:icon="@mipmap/ic_launcher">
   
    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:theme="@style/LaunchTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize">
        <meta-data
          android:name="io.flutter.embedding.android.NormalTheme"
          android:resource="@style/NormalTheme"
          />
        <meta-data
          android:name="io.flutter.embedding.android.SplashScreenDrawable"
          android:resource="@drawable/launch_background"
          />
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
           <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
   
    <data
      android:scheme="unilinks"
      android:host="example.com" />
  </intent-filter>
    </activity>
    <!-- Don't delete the meta-data below.
         This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
    <meta-data
        android:name="flutterEmbedding"
        android:value="2" />
</application>
  

2- код uni_links, который используется для обработки URL

 import 'dart:async';
import 'package:uni_links/uni_links.dart';

StreamSubscription _sub;

Future<Null> initUniLinks() async {
  _sub = getLinksStream().listen((String link) {
    print(link);
  }, onError: (err) {
    print(err);
  });
}
  

3- Основной файл в проекте Flutter

 void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await initUniLinks();
  await translator.init(
    localeDefault: LocalizationDefaultType.device,
    languagesList: <String>['ar', 'en'],
    assetsDirectory: 'assets/langs/',
  );
  

примечание: Я использую Xiaomi mi 9t для тестирования приложения

Ответ №1:

Похоже, что есть несколько вещей, которые могут пойти не так.

Во-первых, для тестирования ссылок в Android вам нужно будет использовать adb из командной строки, а не вводить ссылку в браузере, например:

 adb shell am start -a android.intent.action.VIEW 
    -c android.intent.category.BROWSABLE 
    -d "http://flutterbooksample.com/book/1"
  

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

Если вы хотите поддерживать только Android, я бы рекомендовал просто следовать приведенному здесь руководству:https://flutter.dev/docs/development/ui/navigation/deep-linking и убедитесь, что у вас настроены соответствующие маршруты для ссылок, которые вы хотите обработать.

Если вы также хотите поддерживать iOS, я смог обрабатывать входящие ссылки с помощью uni_links, используя комбинацию кода изhttps://morioh.com/p/89f560dcaabd когда приложение запускается по ссылке и https://loic-ngou.medium.com/deep-linking-in-flutter-app-using-uni-links-4efc14412187 для того, когда приложение уже запущено.

Для 1-го я использовал функцию, подобную следующей, для передачи uri в мое приложение и вызвал ее из main:

 Future checkForLaunchFromLink() async {
  try {
    Uri? initialUri = await UniLink.getInitialUri();
    runApp(new MyApp(uri: initialUri));
  } on PlatformException {
    print("PlatformException");
  } on Exception {
    print('Exception thrown');
  }
}
  

Для 2-го я использовал StreamBuilder for home: в своем приложении MaterialApp для маршрутизации соответствующим образом, когда приложение уже было открыто.