Flutter url_launcher 未在发布模式下启动 url
Flutter url_launcher is not launching url in release mode
我不知道出于某种原因 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的开发频道(1.22.0-9.0.pre是一个开发版本,发布于2/9/2020)。由于您的应用程序正在生产中,请将频道更改为稳定版,因为它没有重大错误。
flutter channel stable
然后做flutter升级
flutter upgrade
现在,尝试将 url_launcher 软件包升级到最新版本。它应该可以工作。
PS:不用担心flutter升级,只要是在stable分支升级即可。始终建议 运行 最新版本。
我在 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" />
我跳过了在 try-catch 中调用 canLaunch(url) 和调用 launch(url),它起作用了
看起来从 API 30 of Android 开始,您应该需要添加明确的意图。例如,如果您要打开 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
从 API 30 开始 Android 需要在您的 AndroidManifest.xml
中配置程序包可见性,否则 canLaunch 将 return 错误。 <queries>
元素必须作为根元素的子元素添加到您的清单中。
下面的代码片段显示了一个应用程序示例,该应用程序使用 https
、tel
和 mailto
URL 以及 url_launcher。有关其他查询的示例,请参阅 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
。
我在 try-catch 块中直接使用了 launch(),没有任何 canLaunch() 条件,它运行良好
向 添加权限
在
我不知道出于某种原因 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的开发频道(1.22.0-9.0.pre是一个开发版本,发布于2/9/2020)。由于您的应用程序正在生产中,请将频道更改为稳定版,因为它没有重大错误。
flutter channel stable
然后做flutter升级
flutter upgrade
现在,尝试将 url_launcher 软件包升级到最新版本。它应该可以工作。
PS:不用担心flutter升级,只要是在stable分支升级即可。始终建议 运行 最新版本。
我在 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" />
我跳过了在 try-catch 中调用 canLaunch(url) 和调用 launch(url),它起作用了
看起来从 API 30 of Android 开始,您应该需要添加明确的意图。例如,如果您要打开 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
从 API 30 开始 Android 需要在您的 AndroidManifest.xml
中配置程序包可见性,否则 canLaunch 将 return 错误。 <queries>
元素必须作为根元素的子元素添加到您的清单中。
下面的代码片段显示了一个应用程序示例,该应用程序使用 https
、tel
和 mailto
URL 以及 url_launcher。有关其他查询的示例,请参阅 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
。
我在 try-catch 块中直接使用了 launch(),没有任何 canLaunch() 条件,它运行良好
向