#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 для маршрутизации соответствующим образом, когда приложение уже было открыто.