Flutter url_launcher не может запустить короткую ссылку на веб-форму в Google

Я использовал flutter для разработки приложения с пакетом url_launcher 5.7.2 https://pub.dev/packages/url_launcher, которые запускают webivew только для формы Google, когда пользователь нажимает какую-либо кнопку.

Однако я обнаружил, что при использовании сокращенного URL-адреса формы Google будет обнаружена ошибка ERR_UNKNOWN_URL_SCHEME, использование исходного URL-адреса работает.

Я использовал этот пример https://pub.dev/packages/url_launcher/example и заменил URL-адрес https://forms.gle/mEwVA8jXmwJEFn5X6, а затем нажмите кнопку Запустить в приложении (JavaScript включен)

await launch(url,forceSafariVC: true,
        forceWebView: true,
        enableJavaScript: true,);

При использовании исходного длинного URL-адреса работает.

Я уже добавляю android: usesCleartextTraffic = true в свой AndroidManifest.xml, но все еще не работаю для короткого URL


person B.Cos    schedule 12.10.2020    source источник


Ответы (2)


Я предлагаю вам использовать пакет flutter_webview_plugin вместо url_launcher.

Эта проблема возникает из-за перенаправления, и браузер не может понять начало намерения в Android.

введите описание изображения здесь

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: _buildBody(),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) =>
                  WebViewPage(url: 'https://forms.gle/mEwVA8jXmwJEFn5X6'),
            ),
          );
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }

  Widget _buildBody() {
    return Container();
  }
}

class WebViewPage extends StatefulWidget {
  final String url;
  WebViewPage({Key key, this.url}) : super(key: key);

  @override
  _WebViewPageState createState() => _WebViewPageState();
}

class _WebViewPageState extends State<WebViewPage> {
  final flutterWebviewPlugin = FlutterWebviewPlugin();

  @override
  void initState() {
    super.initState();
  }

  @override
  void dispose() {
    flutterWebviewPlugin.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Material(
      type: MaterialType.transparency,
      child: WebviewScaffold(
        appBar: AppBar(
          title: Text('WebView Page'),
        ),
        url: widget.url,
        userAgent: 'Fake',
        clearCookies: false,
        clearCache: false,
        hidden: true,
        appCacheEnabled: true,
        supportMultipleWindows: true,
      ),
    );
  }
}


person KuKu    schedule 12.10.2020
comment
Привет, запуск () может работать, но мне нужен запуск в веб-просмотре с использованием этого ожидания запуска (url, forceSafariVC: true, forceWebView: true, enableJavaScript: true,); - person B.Cos; 12.10.2020
comment
Как вы сказали, я изменил способ запуска. Но он снова работает хорошо. - person KuKu; 12.10.2020
comment
Может только айфон работать может? Я тестирую на Android, но все еще не работаю, - person B.Cos; 12.10.2020
comment
@ B.Cos Как насчет использования flutter_webview_plugin? Я изменил код с помощью flutter_webview_plugin. - person KuKu; 12.10.2020
comment
Как передать URL-адрес в WebviewScaffold () вместо жесткого кодирования URL-адреса? Пример: считывание значения URL-адреса текстового поля и переход к WebviewScaffold () - person B.Cos; 12.10.2020
comment
хорошо, я понял, спасибо за это альтернативное решение - person B.Cos; 12.10.2020
comment
один быстрый вопрос, зачем использовать userAgent: 'fake',? Я удаляю это или изменяю на Chrome, будет возвращена та же ошибка. Но использование поддельного userAgent работает - person B.Cos; 12.10.2020
comment
Если в flutter_webview есть нормальное значение userAgent, flutter_webview перенаправит https: // на intent: //. - person KuKu; 12.10.2020

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

Фрагмент кода:

class URLLauncher extends StatelessWidget {
  Future<void> _launchInBrowser(String url) async {
    if (await canLaunch(url)) {
      await launch(
        url,
        forceSafariVC: false,
        forceWebView: false,
        headers: <String, String>{'my_header_key': 'my_header_value'},
      );
    } else {
      throw 'Could not launch $url';
    }
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: RaisedButton(onPressed: () {
        // _launchInBrowser("https://docs.google.com/forms/d/e/1FAIpQLSfzXnHMRe890CJj5rSxN-jonjrvZ8HvRBSFcdyJD5IDhOr-IQ/viewform?usp=sf_link ");
        _launchInBrowser("https://forms.gle/mEwVA8jXmwJEFn5X6");
      }),
    );
  }
}
person Jitesh Mohite    schedule 12.10.2020
comment
Привет, мне нужен forceWebView: true, потому что мне нужно использовать в веб-просмотре приложения, чтобы скрыть отображаемый URL-адрес, чтобы пользователь не видел URL-адрес - person B.Cos; 12.10.2020
comment
где вы пробуете реальное устройство или на эмуляторе? - person Jitesh Mohite; 12.10.2020
comment
На реальном устройстве Android Android 9 - person B.Cos; 12.10.2020