Flutter 插件url_launcher简介

url_launcher是用于在移动平台中启动URL的Flutter插件,适用于IOS和Android平台。他可以打开网页,发送邮件,还可以拨打电话。

github地址:https://github.com/flutter/plugins/tree/master/packages/url_launcher

最近项目需求就是打开一个连接跳转到安卓或苹果默认的浏览器。虽然开始一个简单的要求,其中的一个细节就是执行打开网页这一操作后,不能看上去像在应用内部打开,看上去要在应用外部打开。pub.dev提供了加载网页的插件url_launcher;所谓的插件也是用安卓和苹果原生代码实现的,对插件的代码进行解压可以看到。

加载网页的方式:

_launchURL() async {
 const url = '要加载的网页地址';
 if (await canLaunch(url)) {
 await launch(url);
 }
}

简单查看一下插件的源码:

Future<bool> launch(
 String urlString, {
 bool forceSafariVC,
 bool forceWebView,
 bool enableJavaScript,
 bool enableDomStorage,
 bool universalLinksOnly,
 Map<String, String> headers,
 Brightness statusBarBrightness,
 }) async {
 assert(urlString != null);
 ........................................

属性:forceSafariVC 

/// [forceSafariVC] is only used in iOS with iOS version >= 9.0. By default (when unset), the launcher
/// opens web URLs in the Safari View Controller, anything else is opened
/// using the default handler on the platform. If set to true, it opens the
/// URL in the Safari View Controller. If false, the URL is opened in the
/// default browser of the phone. Note that to work with universal links on iOS,
/// this must be set to false to let the platform's system handle the URL.
/// Set this to false if you want to use the cookies/context of the main browser
/// of the app (such as SSO flows). This setting will nullify [universalLinksOnly]
/// and will always launch a web content in the built-in Safari View Controller regardless
/// if the url is a universal link or not.

forceSafariVC 仅被用于IOS版本为0.9和0.9以上的系统。默认情况下不设置,如果设置加载网页连接在Safari视图控制器打开,其他操作系统打开使用默认设置。如果设置为true,在Safari视图控制器打开URL。如果设置为false,在手机默认浏览器中打开。注意网页连接在IOS 平台操作系统上打开必须设置为false。如果你想去用cookies在app网页端实现登录需要设置为false。

如果加载在内置Safari视图控制器的网页内容是universal link或不是,设置universalLinksOnly无效。

Universal Link:(点击连接打开应用)参考参考

属性:forceWebView

/// [forceWebView] is an Android only setting. If null or false, the URL is
/// always launched with the default browser on device. If set to true, the URL
/// is launched in a WebView. Unlike iOS, browser context is shared across
/// WebViews.

该属性只在安卓平台设置。如果设置为false或不设置,网络地址被加载在设备默认浏览器。如果设置为true,网络地址被加载在自定义WebView。ios系统的浏览器可以共享数据。

属性:enableJavaScript

/// [enableJavaScript] is an Android only setting. If true, WebView enable
/// javascript.

该属性只在安卓平台设置。如果为true,webview可加载脚步。

属性:enableDomStorage

/// [enableDomStorage] is an Android only setting. If true, WebView enable
/// DOM storage.

该属性只在安卓平台设置。如果为true,webView加载本地网页缓存。

属性:universalLinksOnly

/// [universalLinksOnly] is only used in iOS with iOS version >= 10.0. This setting is only validated
/// when [forceSafariVC] is set to false. The default value of this setting is false.
/// By default (when unset), the launcher will either launch the url in a browser (when the
/// url is not a universal link), or launch the respective native app content (when
/// the url is a universal link). When set to true, the launcher will only launch
/// the content if the url is a universal link and the respective app for the universal
/// link is installed on the user's device; otherwise throw a [PlatformException].

该属性只在IOS平台使用并且IOS版本为10.0或10.0以上。当前该属性设置成false生效。默认值是false。默认情况下,通过手机手机浏览器加载网页(当这个链接不是一个universal link)或 加载各自app(当这个链接是一个universal link,点击进行下载应用包)。如果设置属性值为true,如果这个连接是一个universal link并且各自的应用通过这个universal link安装在用户的设备上,那么改网页会被加载。否则抛出PlatformException。

属性:statusBarBrightness

/// [statusBarBrightness] Sets the status bar brightness of the application
/// after opening a link on iOS. Does nothing if no value is passed. This does
/// not handle resetting the previous status bar style.

设置的状态栏亮度在IOS应用打开一个连接后可以看到。如果没有设置该属性不会有效果的。状态栏样式重复设置以第一次设置为准。

Future<bool> launch(
 String urlString, {
 bool forceSafariVC,
 bool forceWebView,
 bool enableJavaScript,
 bool enableDomStorage,
 bool universalLinksOnly,
 Map<String, String> headers,
 Brightness statusBarBrightness,
 }) async {
 assert(urlString != null);
 final Uri url = Uri.parse(urlString.trimLeft());
 final bool isWebURL = url.scheme == 'http' || url.scheme == 'https';
 if ((forceSafariVC == true || forceWebView == true) && !isWebURL) {
 throw PlatformException(
 code: 'NOT_A_WEB_SCHEME',
 message: 'To use webview or safariVC, you need to pass'
  'in a web URL. This $urlString is not a web URL.');
 }
 bool previousAutomaticSystemUiAdjustment;
 if (statusBarBrightness != null && defaultTargetPlatform == TargetPlatform.iOS) {
 previousAutomaticSystemUiAdjustment =
 WidgetsBinding.instance.renderView.automaticSystemUiAdjustment;
 WidgetsBinding.instance.renderView.automaticSystemUiAdjustment = true;
 SystemChrome.setSystemUIOverlayStyle(statusBarBrightness == Brightness.light
 ? SystemUiOverlayStyle.dark
 : SystemUiOverlayStyle.light);
 }
 final bool result = await UrlLauncherPlatform.instance.launch(
 urlString,
 useSafariVC: forceSafariVC ?? isWebURL,
 useWebView: forceWebView ?? false,
 enableJavaScript: enableJavaScript ?? false,
 enableDomStorage: enableDomStorage ?? false,
 universalLinksOnly: universalLinksOnly ?? false,
 headers: headers ?? <String, String>{},
 );
 if (statusBarBrightness != null) {
 WidgetsBinding.instance.renderView.automaticSystemUiAdjustment =
 previousAutomaticSystemUiAdjustment;
 }
 return result;
}

安卓或苹果平台加载:

实现让用户看到不少应用内部跳转打开网页加载,是跳转到手机默认浏览器加载。

if (Platform.isIOS) {
  launch(url, forceSafariVC: false, forceWebView: true);
  return;
 }
 if (Platform.isAndroid) {
  launch(url);
 }

解压插件源码可以看到Flutter就是调用安卓或者ios原生代码进行加载网页。

安卓中通过webview加载网页或者跳转默认浏览器加载网页:

LaunchStatus launch(
 String url,
 Bundle headersBundle,
 boolean useWebView,
 boolean enableJavaScript,
 boolean enableDomStorage) {
 if (activity == null) {
 return LaunchStatus.NO_ACTIVITY;
 }

 Intent launchIntent;
 if (useWebView) {
 launchIntent =
  WebViewActivity.createIntent(
  activity, url, enableJavaScript, enableDomStorage, headersBundle);
 } else {
 launchIntent =
  new Intent(Intent.ACTION_VIEW)
  .setData(Uri.parse(url))
  .putExtra(Browser.EXTRA_HEADERS, headersBundle);
 }

 activity.startActivity(launchIntent);
 return LaunchStatus.OK;
 }

在ios手机中默认浏览器打开

- (void)launchURLInVC:(NSString *)urlString result:(FlutterResult)result API_AVAILABLE(ios(9.0)) {
 NSURL *url = [NSURL URLWithString:urlString];
 self.currentSession = [[FLTURLLaunchSession alloc] initWithUrl:url withFlutterResult:result];
 __weak typeof(self) weakSelf = self;
 self.currentSession.didFinish = ^(void) {
 weakSelf.currentSession = nil;
 };
 [self.topViewController presentViewController:self.currentSession.safari
     animated:YES
     completion:nil];
}

在ios中用内置浏览器打开:

- (void)launchURL:(NSString *)urlString
  call:(FlutterMethodCall *)call
  result:(FlutterResult)result {
 NSURL *url = [NSURL URLWithString:urlString];
 UIApplication *application = [UIApplication sharedApplication];

 if (@available(iOS 10.0, *)) {
 NSNumber *universalLinksOnly = call.arguments[@"universalLinksOnly"] ?: @0;
 NSDictionary *options = @{UIApplicationOpenURLOptionUniversalLinksOnly : universalLinksOnly};
 [application openURL:url
   options:options
 completionHandler:^(BOOL success) {
  result(@(success));
 }];
 } else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
 BOOL success = [application openURL:url];
#pragma clang diagnostic pop
 result(@(success));
 }
}

如果在安卓或者苹果加载http网页出现无法加载:

///安卓:在xml文件夹下创建network_security_config.xml ,然后在AndroidManifest.xml 标签application引用

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
 <base-config cleartextTrafficPermitted="true">
 <trust-anchors>
  <certificates src="system" />
 </trust-anchors>
 </base-config>
</network-security-config>
///IOS:

参考:

Android WebView:https://developer.android.google.cn/guide/webapps/webview?hl=zh_cn

SafariServices:https://developer.apple.com/documentation/safariservices

总结

到此这篇关于Flutter 插件url_launcher简介的文章就介绍到这了,更多相关Flutter 插件url_launcher内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Flutter permission_handler 权限插件的使用详解

    编译环境:Flutter 版本v1.12.hotfix9 dart SDK:2.7.2 1 pubspec.yaml中引入: #  权限   permission_handler: ^3.2.0 ios中info.plist配置(根据权限情况使用): <!-- Permission options for the `location` group --> <key>NSLocationWhenInUseUsageDescription</key> <string&

  • Android Studio 下 Flutter 开发环境搭建,Flutter,Dart 插件安装,Flutter SDK 安装,环境变量配置,开发环境检查

    I . Flutter 学习资料 Flutter 学习资料 : ① 官方文档 : https://flutter.dev/docs ② Flutter Android 开发者文档 : https://flutter.dev/docs/get-started/flutter-for/android-devs ② Flutter 插件库 : https://pub.dev/ II . Flutter 开发环境搭建 Flutter 开发环境搭建 : ① Android Studio : https:/

  • Flutter 插件url_launcher简介

    url_launcher是用于在移动平台中启动URL的Flutter插件,适用于IOS和Android平台.他可以打开网页,发送邮件,还可以拨打电话. github地址:https://github.com/flutter/plugins/tree/master/packages/url_launcher 最近项目需求就是打开一个连接跳转到安卓或苹果默认的浏览器.虽然开始一个简单的要求,其中的一个细节就是执行打开网页这一操作后,不能看上去像在应用内部打开,看上去要在应用外部打开.pub.dev提

  • 使用PlatformView将 Android 控件view制作成Flutter插件

    目录 引言 1. FlutterPlugin 创建 2. 创建 Android 控件 3. 注册 Android 控件 4. 封装 Android 层通信交互 ‘CustomViewController’ 代码说明 5. 在 flutter 中如何使用已注册的 Android 控件(view) 代码说明 如何使用这个View 6. 附上 example 完整代码 引言 小编最近在项目中实现相机识别人脸的功能,将 Android 封装的控件 view 进行中转,制作成 FlutterPlugin

  • Jquery图形报表插件 jqplot简介及参数详解

    功能概述: 有多种图表样式可供选择 可以自定义日期轴线 可设置旋转轴文字 自动计算趋势线 工具条提示和高亮数据点 默认最优设置,非常易于使用 以上功能在jqPlot主页中的示例页面有 很多直观的展示.这里是它详细使用文档. 缺点:柱状图无法显示具体数据值.饼状图无法显示具体百分比. 下边是搜集的详细参数配置: 复制代码 代码如下: options = { seriesColors: [ "#4bb2c5", "#c5b47f", "#EAA228"

  • Flutter自动路由插件auto_route使用详解

    目录 一.简介 二.基本使用 2.1 安装插件 2.2 定义路由表 2.3 生成路由 2.4 路由跳转 2.5 处理返回结果 三.路由导航 3.1 嵌套导航 3.2 Tab 导航 3.3 PageView 3.4 声明式导航 四.高级用法 4.1 路由控制器 4.2 Paths 4.2.1 Path Parameters 4.2.2 Inherited Path Parameters 4.2.3 Query Parameters 4.2.4 Redirecting Paths 4.3 路由守护

  • 详解Flutter中视频播放器插件的使用教程

    目录 创建一个新的视频播放器 添加播放和暂停按钮 创建一个快进 添加一个视频进度指示器 应用视频的字幕 结论 您已经看到很多包含视频内容的应用程序,比如带有视频教程的食谱应用程序.电影应用程序和体育相关的应用程序.您是否想知道如何将视频内容添加到您的下一个Flutter应用程序中? 从头开始实现视频功能将是一项繁重的任务.但有几个插件可以让开发者的生活变得轻松.视频播放器插件是可用于 Flutter 的最佳插件之一,可满足这一要求. 在这篇文章中,您将学习如何应用视频播放器插件以及控制视频播放器

  • MacBook M1 Flutter环境搭建的实现步骤

    目录 一.基础环境搭建 git: Flutter SDK: CocoaPods: 二.安装IDE IDEA: Xcode: AndroidStudio: 三.跑一个app试试 最近入手了Apple M1,MacBook Air,由于之前未使用苹果系列产品,并且Flutter官方和各项配套的软件环境也还没有成熟,导致搭建环境时碰到了不少坑,这里总结记录一波,来看文档的同学,有不懂的地方直接发评论或者消息就好 一.基础环境搭建 git: 我是装完homebrew,git就装好了,homebrew的安

  • Flutter Boost 混合开发框架

    目录 一.Flutter Boost简介 二.Flutter Boost集成 2.1 Android集成 2.2 iOS集成 三.Flutter Boost架构 四.FlutterBoost3.0更新 4.1 不入侵引擎 4.2 不区分Androidx和Support分支 4.3 双端设计统一,接口统一 4.4 支持 [打开flutter页面不再打开容器] 场景 4.5 生命周期的精准通知 4.6 其他Issue 一.Flutter Boost简介 众所周知,Flutter是一个由C++实现的F

  • flutter消息推送客户端集成方案详解

    目录 一.背景 二.第三方消息推送——个推 1.简介 2.注册开通 3.自定义消息推送——透传 三.项目集成 1.个推客户端flutter插件 2.Android和IOS配置 1)Android 2) iOS 3.通知栏插件flutter_local_notifications 4.个推消息与通知栏整合 最后 一.背景 公司一个CRM APP项目是用Flutter写的,根据业务要求,需要集成消息推送功能.所谓的消息推送就是系统会根据某些行为自动推送信息,手机的通知栏会接收到信息,点击可以打开ap

  • Windows实现Flutter环境搭建及配置这一篇就够了

    最近正式入坑Flutter,首先从环境搭建开始,看了网上好多关于Windows环境搭建的资料,基本都是按官方文档写的,看完的感受是,还不如直接去看官方文档. 官方英文文档传送门:Get Started: Install on Windows . 本文主要总结我实际搭建的过程,最后发现不一定按网上那些博客或者官方文档写的来也可以搭建成功. 总的来说需要的也就4样东西,找齐了配置一下就OK: (1)Flutter SDK (建议下载官网的,下载完直接能用) (2)下载Dart插件 (3)下载Flut

随机推荐