【问题标题】:Flutter url_launcher is not launching url in release modeFlutter url_launcher 未在发布模式下启动 url
【发布时间】:2021-04-29 04:53:32
【问题描述】:

我不知道出于某种原因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版本安全吗?由于我的应用已经投入生产,我不能冒险引发更多问题

这是我尝试升级到最新版本 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


    【解决方案1】:

    我在使用 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" />
    

    【讨论】:

    • 非常感谢!添加权限效果很好,与 API 级别 30 有相同的问题。
    • 添加权限也对我有用,但是我必须卸载并重新安装该应用程序。 Flutter clean 没有通过清单更改重建。
    • 也感谢我。你节省了我的时间。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      flutter channel stable
      

      然后进行颤振升级。

       flutter upgrade
      

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

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

      【讨论】:

      • 好的,我会这样做。祝我好运。我会让你知道结果
      • 好的,如果您有任何问题,请告诉我。
      • 升级flutter和url启动器版本后,在调试模式下一切正常。如何在发布模式下启动应用程序?我想在将应用上传到 google playstore 之前对其进行测试。
      • "flutter build apk --release" 或者查看这个问题的接受答案stackoverflow.com/questions/51000869/…
      • 是的,它奏效了。太感谢了。我忘了接受答案。谢谢你提醒我。
      【解决方案4】:

      看起来,从 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

      【讨论】:

        【解决方案5】:

        从 API 30 开始,Android 需要在 AndroidManifest.xml 中配置包可见性,否则 canLaunch 将返回 false。 &lt;queries&gt; 元素必须作为根元素的子元素添加到您的清单中。

        下面的 sn-p 显示了使用带有 url_launcher 的 httpstelmailto URL 的应用程序示例。有关其他查询的示例,请参阅 Android documentation

        <queries>
          <!-- If your app opens https URLs -->
          <intent>
            <action android:name="android.intent.action.VIEW" />
            <data android:scheme="https" />
          </intent>
          <!-- If your app makes calls -->
          <intent>
            <action android:name="android.intent.action.DIAL" />
            <data android:scheme="tel" />
          </intent>
          <!-- If your sends SMS messages -->
          <intent>
            <action android:name="android.intent.action.SENDTO" />
            <data android:scheme="smsto" />
          </intent>
          <!-- If your app sends emails -->
          <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="*/*" />
          </intent>
        </queries>
        

        简单地说,只需将上面的queries(您正在寻找的)添加到您的Androidmanifest.xml

        【讨论】:

          【解决方案6】:

          我直接在try-catch块中使用了launch(),没有canLaunch()的任何条件,它工作正常

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-12-16
            • 2021-02-08
            • 2021-07-17
            • 2022-10-17
            • 2021-02-15
            • 2020-12-12
            • 2018-09-06
            相关资源
            最近更新 更多