Flutter url_launcher 未在发布模式下启动 url

问题描述 投票:0回答:12

我不知道出于某种原因

url_launcher
https://pub.dev/packages/url_launcher)从google playstore下载应用程序后无法工作。在调试模式下,它按应有的方式工作。但是在 Playstore 上上传应用程序并从那里下载后,url 启动器不会启动任何 url。这是为什么?

import 'package:url_launcher/url_launcher.dart';

 onTap: () {
  launchURL("https://www.google.com");
},
..............
  launchURL(String url) async {
    if (await canLaunch(url)) {
      await launch(url);
    } else {
      throw 'Could not launch $url';
    }
  }

pubspec.yaml

url_launcher: ^5.7.6

我还添加了

android.permission.INTERNET

我没有使用最新版本的

url_launcher
,因此可能使用最新版本可以解决问题,但问题是最新版本的
url_launcher
需要最新版本的flutter。升级flutter版本安全吗?我不能冒造成更多问题的风险,因为我的应用程序已经投入生产

这是我尝试升级到最新版本

url_launcher: ^5.7.10
并运行flutter pub get

时得到的结果
[xxxxx] flutter pub get
Running "flutter pub get" in xxxxx...                       
The current Flutter SDK version is 1.22.0-9.0.pre.

Because url_launcher >=5.7.7 <6.0.0-nullsafety depends on url_launcher_platform_interface >=1.0.9 <2.0.0-nullsafety which requires Flutter SDK version >=1.22.0 <2.0.0, url_launcher >=5.7.7 <6.0.0-nullsafety is forbidden.

So, because xxxxx depends on url_launcher ^5.7.10, version solving failed.
pub get failed (1; So, because storeifie depends on url_launcher ^5.7.10, version solving failed.)
exit code 1
flutter dart url launcher
12个回答
58
投票

我在 Android 11(API 级别 30)上也遇到了同样的问题 - 在软件更新之前一切都运行良好(并且在运行早期版本的测试设备上) - 以下内容似乎让我走上了正确的轨道 https://developer.android.com/training/basics/intents/package-visibility#all-apps

我通过在 AndroidManifest.xml 中添加以下内容解决了我的问题(尽管可能没有必要。)

<activity android:name="io.flutter.plugins.urllauncher.WebViewActivity"
           android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
           android:exported="false"/>

仅此方法不起作用,然后我添加到下面的行中

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

20
投票

我跳过了调用canLaunch(url)并在try-catch中调用launch(url),它的工作


16
投票

看起来从 Android API 30 开始,您应该需要添加明确的意图。例如,如果您要打开一个 URL,则需要将以下代码添加到您的 AndroidManifest 中。

<queries>
    <!-- to opens https URLs -->
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="https" />
    </intent>
</queries>

您可以在 url_launcher read.me 中看到更新:https://pub.dev/packages/url_launcher


6
投票

如果您正在 Android 中尝试 URL 启动器并且设备 API 超过 30 个,请尝试在 Android 清单中的应用程序标记之外添加查询意图。

<queries>
  <intent>
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="https" />
  </intent>
</queries>

5
投票

我直接在 try-catch 块中使用 launch() ,没有任何 canLaunch() 条件,并且效果很好


3
投票

首先,您处于flutter的开发频道(1.22.0-9.0.pre是开发版本,于2020年2月9日发布)。由于您的应用程序正在生产中,请将频道更改为稳定版,因为它没有重大错误。

flutter channel stable

然后进行flutter升级。

 flutter upgrade

现在,尝试将 url_launcher 包升级到最新版本。应该可以。

PS:不用担心flutter升级,只要是在stable分支升级即可。始终建议运行最新版本。


2
投票

这可能是由于

Kotlin Gradle
版本较低。我的旧版本
1.6.10
有问题。我更新到
1.7.10
后,问题就解决了。


1
投票

要从 AndroidManifest.xml 添加以下代码,

<queries>
  <!-- If your app checks for url support -->
  <intent>
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="https" />
  </intent>
</queries>




class MapsUtils
{
  MapsUtils._();

  //latitude and longitude

  static Future<void> openMapWithPosition(double latitude, double longitude) async
  {
    String googleMapUrl = "https://www.google.com/maps/search/?api=1&query=$latitude,$longitude";

    if (await canLaunchUrlString(googleMapUrl))
      {
        await launchUrlString(googleMapUrl, mode: LaunchMode.externalApplication);
      }
    else
      {
        throw "Could not open map.";
      }
  }

  //text address
  static Future<void> openMapWithAddress(String completeAddress) async
  {
    String query = Uri.encodeComponent(completeAddress);
    String googleMapUrl = "https://www.google.com/maps/search/?api=1&query=$query";

    if (await canLaunchUrlString(googleMapUrl))
    {
      await launchUrlString(googleMapUrl, mode: LaunchMode.externalApplication);
    }
    else
    {
      throw "Could not open map.";
    }
  }

}

了解更多信息laucher


1
投票

以我为例 我正在创建我的 Uri : Uri.dataFromString(String) 虽然我应该使用

.parse
而不是
.dataFromString
示例代码:

  try {
      // Uri requestedUri = Uri.dataFromString(url); //.dataFromString [wrong method]

  Uri requestedUri = Uri.parse(url);// .parse is the correct method

  if (await canLaunchUrl(requestedUri)) {
    await launchUrl(requestedUri);
  } else {
    throw  Exception('Could not launch $url');
  }
} on PlatformException catch (e) {
debugPrint("PlatformException launchInBrowser : $e");
} on Exception catch (e) {
debugPrint( "Exception launchInBrowser : $e");
}

1
投票

这对我有用

添加到您的 Android 清单中

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

0
投票

对我来说这很有效

  1. flutter pub 缓存清理
  2. 更改 pubspec.yml sdk:">=3.0.0 <=3.24.5"
  3. url_启动器:^6.3.1
  4. cd ios
  5. pod install(删除锁定文件)
  6. 颤抖奔跑

这将清除旧 url_launcher 的所有缓存并获取新的,即 6.3.1,它将起作用。


-1
投票

添加权限至

© www.soinside.com 2019 - 2024. All rights reserved.