Использование схемы Flutter (браузер открывает приложение, а в приложении открывается другое приложение)

Flutter

🍵адрес проекта

Роль схемы URL

Введение в схему iOS

Все мы знаем, что APP в мобильном телефоне Apple имеет песочницу, а APP — это информационный остров, который не может общаться друг с другом. Но приложения iOS могут регистрировать собственную схему URL-адресов, которая предназначена для облегчения взаимных вызовов между приложениями. Мы можем открыть приложение через системный OpenURL и передать некоторые параметры.

Например, если вы введете www.alipay.com в Safari, вы сможете напрямую открыть приложение Alipay при условии, что Alipay установлен на вашем мобильном телефоне. Если у вас не установлен Alipay, должен отобразиться интерфейс загрузки Alipay.Нажав на него, вы перейдете к интерфейсу загрузки Alipay в AppStore.

Схема URL-адресов должна иметь возможность однозначно идентифицировать приложение. Если установленная вами схема URL-адресов конфликтует со схемой URL-адресов других приложений, ваше приложение может быть не активировано. Потому что, когда ваше приложение установлено, ваша схема URL-адресов была зарегистрирована в системе.

В обычных условиях будет вызвано приложение, которое было установлено первым. Но URL-схема системного приложения iOS, безусловно, самая высокая. Поэтому, когда мы определяем схему URL-адресов, старайтесь избегать схемы URL-адресов, которая была определена системным приложением.

Введение в схему Android

Схема в андроиде — протокол внутристраничного перехода;

Определив свой собственный протокол схемы, вы можете легко переходить на различные страницы в приложении;

С помощью протокола схемы сервер можно настроить так, чтобы приложение переходило на внутреннюю страницу приложения.

использоватьuni_linksбиблиотека

1 ,pubspec.yamlфайл добавить зависимость

dependencies:
  uni_links: 0.4.0

2. Установка

flutter pub get

Running "flutter pub get" in dynamic_theme...                       5.8s
Process finished with exit code 0

3. Используйте плагины в коде Dart

import 'package:uni_links/uni_links.dart';

Конфигурация Android

⚠️Примечание: именование схем не поддерживается.dynamic_themeсуществуетiOSЯ проверил это и не мог открыть это, изменил его на все строчные буквыdynamictheme

android/app/src/main/AndroidManifest.xml

Добавьте следующий кодПосмотреть полный код

<!-- Deep Links -->
<intent-filter>
    <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 YOUR_SCHEME://YOUR_HOST -->
    <data
          android:scheme="[YOUR_SCHEME]"
          android:host="[YOUR_HOST]" />
</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="dynamictheme"/>
  <data 
        android:host="detail"
        android:scheme="dynamictheme"/>
</intent-filter>

конфигурация iOS

ОткрытьXcode->Info->URL TypesнастраиватьURL Scheme

После добавления это также будет напрямую отражено в конфигурационном файле.info.plistКонечно, если вы чувствуете, что вы очень сильны, вы также можете напрямуюinfo.plistДобавить к.

iOS 配置

ios/Runner/Info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
...
<!-- 其它配置 -->
	<array>
		<dict>
			<key>CFBundleTypeRole</key>
			<string>Editor</string>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>dynamictheme</string>
			</array>
		</dict>
	</array>
...
<!-- 其它配置 -->
</dict>
</plist>

Код дротика

Реализовать переход на страницу в разных состояниях

Future<void> initPlatformStateForStringUniLinks() async {
    String initialLink;
    // App未打开的状态在这个地方捕获scheme
    try {
      initialLink = await getInitialLink();
      print('initial link: $initialLink');
      if (initialLink != null) {
        print('initialLink--$initialLink');
        //  跳转到指定页面
        schemeJump(context, initialLink);
      }
    } on PlatformException {
      initialLink = 'Failed to get initial link.';
    } on FormatException {
      initialLink = 'Failed to parse the initial link as Uri.';
    }
    // App打开的状态监听scheme
    _sub = getLinksStream().listen((String link) {
      if (!mounted || link == null) return;
      print('link--$link');
    //  跳转到指定页面
      schemeJump(context, link);
    }, onError: (Object err) {
      if (!mounted) return;
    });
}

Разобрать страницу перехода схемы

я настроилschemeдаdynamictheme://используетDeep Link, вы также можете настроить какhttp://www.xx.comа такжеhttps://www.xx.comЭтоApp Links.

final Uri _jumpUri = Uri.parse(schemeUrl.replaceFirst(
    'dynamictheme://',
    'http://path/',
  ));
  switch (_jumpUri.path) {
    case '/detail':
      Navigator.of(context).pushNamed(
        Detail.routeName,
        arguments: Detail(value: _jumpUri.queryParameters['name'] ?? '详情'),
      );
      break;
    default:
      break;
}

Scheme тестовый адрес

нужно тестить передУстановить APK(В настоящее время можно загрузить только Android APK, а iOS должна получить код и упаковать его самостоятельно).

<a href="dynamictheme://"> 打开App(dynamictheme://) </a>
<a href="dynamictheme://detail"> 打开App跳转到详情页面 </a>
<a href="dynamictheme://detail?name=flutter"> 打开App跳转到详情页面带上参数 </a>

Предварительный просмотр эффекта iOS

Приложение не открывается (прыгает после открытия)

Приложение было открыто (прослушивание Scheme)

Предварительный просмотр эффекта Android

Приложение не открывается (прыгает после открытия)

Приложение было открыто (прослушивание Scheme)