这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
url_launcher
用于在移动平台中启动URL的Flutter插件。 支持iOS和Android。 支持网络,电话,短信和电子邮件方案,以及打开其他app。
主要功能有:
支持的URL方案
该 launch method 方法采用包含URL的字符串参数。可以使用许多不同的URL方案格式化此URL。支持的URL方案取决于底层平台和已安装的应用程序。
iOS和Android都支持的常见方案:
Scheme | Action |
---|---|
http:<URL> , https:<URL> , 例如: http://flutter.io | 在默认浏览器中打开URL |
mailto:<email address>?subject=<subject>&body=<body> , 例如: mailto:smith@example.org?subject=News&body=New%20plugin | 在默认电子邮件应用中为<电子邮件地址>创建电子邮件 |
tel:<phone number> , 例如: tel:+1 555 010 999 | 使用默认电话应用程序拨打<电话号码>的电话 |
sms:<phone number> , 例如: sms:5550101234 | 使用默认消息传递应用程序向<电话号码>发送短信 |
携带文本内容给指定号码发送短信:
if (Platform.isAndroid) {
const uri = 'sms:+86123456?body=hello world';
await launch(uri);
} else if (Platform.isIOS) {
// iOS
const uri = 'sms:123456&body=hello world';
await launch(uri);
}
处理丢失的URL接收器
特定移动设备可能无法接收所有支持的URL方案。例如,平板电脑可能没有蜂窝无线电,因此不支持使用该sms方案启动URL ,或者设备可能没有电子邮件应用程序,因此不支持使用该email方案启动URL 。
我们建议canLaunch 在调用之前使用该方法检查支持哪些URL方案 launch。如果canLaunch方法返回false,作为最佳实践,我们建议调整应用程序UI,以便永远不会触发不支持的URL; 例如,如果email不支持该方案,则可以更改已发送电子邮件的UI按钮,以使用该http方案后面的URL将用户重定向到网页。
浏览器与应用内处理
默认情况下,Android在处理URL时会打开浏览器。您可以传递forceWebView:true参数来告诉插件改为打开WebView。在iOS上,默认行为是打开应用程序中的所有Web URL。其他所有内容都被重定向到app处理程序。
使用
添加依赖
要使用此插件,请在pubspec.yaml文件中添加url_launcher作为依赖项。
dependencies:
flutter:
sdk: flutter
# 添加以下代码.
url_launcher: ^3.0.3
安装依赖包
并执行 flutter packages get
导入依赖包
在需要用到的dart文件中导包: import 'package:url_launcher/url_launcher.dart';
举例:
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
void main() {
runApp(new Scaffold(
body: new Center(
child: new RaisedButton(
onPressed: _launchURL,
child: new Text('Show Flutter homepage'),
),
),
));
}
_launchURL() async {
const url = 'https://flutter.io';
if (await canLaunch(url)) {
await launch(url);
} else {
throw 'Could not launch $url';
}
}
方法:
canLaunch(url)
能够检查链接是否有效 . 它会先检查url字符串是否为空再通过MethodChannel调用原生,并通过返回一个bool
launch(String urlString, { bool forceSafariVC,bool forceWebView,Brightness statusBarBrightness = Brightness.light})
解析指定的URL字符串并将其处理委托给底层平台。
打开其他App
关于打开链接,电话,短信和电子邮件等方式在上面表格中有写,使用方法跟例子一样,不再赘述。 下面我们看一下怎么打开手机中的其他App。
想要打开其他app,需要知道被打开app的scheme, 如果是自己的app,Android可以在Manifest中看到:
<intent-filter>必须单独写一个,不要和其他filter混用,否则无效。
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="li.zhuoyuan"
android:scheme="flutter" />
</intent-filter>
上面<data>
标签中的就是我们需要知道的url中的东西, 定义了scheme为flutter, host为li.zhuoyuan. 记住这两个字段,在我们想打开这个app的地方需要。可以只定义scheme ,host为可选项。
那么,我们需要的url组成部分就是:scheme://host
如果有host的话。
注意:这里scheme为必填,host、path为选填。选填内容可以不填,但是一旦填上了就必须全部完全匹配才会成功拉起。
我们需要打开的地方执行代码为:
void _openOtherApp() async {
const url = 'flutter://li.zhuoyuan'; //这个url就是由scheme和host组成的 :scheme://host
if (await canLaunch(url)) {
await launch(url);
} else {
throw 'Could not launch $url';
}
}
看下效果:
Android权限
Android11及以上: 在Manifest.xml中添加以下内容: 把你想要打开的app的包名添加在这个列表中, 详情查看:Android 11 中的软件包可见性
<queries>
<package android:name="app包名" />
<package android:name="com.facebook.katana" />
<package android:name="ccom.instagram.android" />
<package android:name="com.twitter.android" />
<package android:name="com.whatsapp" />
</queries>
ios白名单
在ios上打开其他App有的需要设置白名单,在info.plist中添加
打开Facebook
static const String FACEBOOK_URL = 'https://www.facebook.com/617960732190357/';
static String fbAppPage =
Platform.isAndroid ? 'fb://page/617960732190357' : 'fb://profile/617960732190357';
//deepLink:fbAppPage
//webLink:FACEBOOK_URL
try {
bool canLaunchB = await launch(deepLink, forceSafariVC: false);
print(canLaunchB);
if (!canLaunchB) {
await launch(webLink, forceSafariVC: false);
}
} catch (e) {
await launch(webLink, forceSafariVC: false);
}
首先需要构造两个URL。 一个用于启动APP,一个用于打开浏览器(主要用于没有安装App的时候)
- 启动原生应用的URL
如果是针对一个页面,而且平台是Android,你需要
FBUrl="fb://page/{id}"
。 否则(比如iOS),你需要fbProtocolUrl="fb://profile/{id}"
。 - 打开浏览器的URL
webUrl = "https://www.facebook.com/{id}"
,如果没有安装原生应用,启动webview的URL。 如果你喜欢的话,可以使用webUrl = "https://www.facebook.com/reddit"
或者类似的。参考
打开Instagram
static const String INSTAGRAM_URL = 'https://www.instagram.com/juno.horoscopes/';
launch(INSTAGRAM_URL, forceSafariVC: false);