scheme 是一种页面之间跳转的协议,不仅可以用于App之间进行跳转,还可以用于 H5 页面跳转到app页面。
通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。
无论Android还是IOS,都可以通过在H5页面中打开 scheme 协议的地址,从而打开本地app。
客户端应用可以向操作系统注册一个 URL scheme,该 scheme 用于从浏览器或其他应用中启动本应用。通过指定的 URL 字段,可以让应用在被调起后直接打开某些特定页面,比如商品详情页、活动详情页等等。也可以执行某些指定动作,如完成支付等。也可以在应用内通过 html 页来直接调用显示 app 内的某个页面。综上URL Scheme使用场景大致分以下几种:
scheme 协议定义和 http 协议类似,都是标准的 URI 结构。
[scheme:][//host:port][path][?query][#fragment]
scheme : 协议名称 - 必须
host : 协议地址 - 必须
port : 协议的端口,可以不填
path : 协议路径,可用 / 连接多个
query : 携带的参数可用 & 连接多个
fragment : 锚点
例子
下面看一个例子:
wexin://tencent.com:8080/dl/news/open?data=902323¶ms=test
<activity />
标签增加<intent-filter />
设置Scheme(只有第一步是必须配置的)
<activity
android:name="com.app.MainActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
android:label="@string/app_name"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowsoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<!--协议部分,随便设置-->
<!-- 下面的scheme地址为 xl://goods -->
<data android:scheme="xl"
android:host="goods"/>
<!--下面这几行也必须得设置-->
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
在其他Activity
Java
<activity
android:name=".GoodsDetailActivity"
android:theme="@style/AppTheme">
<!--要想在别的App上能成功调起App,必须添加intent过滤器-->
<intent-filter>
<!--协议部分,随便设置-->
<!-- 下面的scheme地址为 xl://goods:8888/goodsDetail -->
<data android:scheme="xl"
android:host="goods"
android:path="/goodsDetail"
android:port="8888"/>
<!--下面这几行也必须得设置-->
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
注释:
需要配置能被js调起,一定要配置下面这句
<category android:name="android.intent.category.BROWSABLE"/>
Java
<!--必有项-->
<action android:name="android.intent.action.VIEW" />
<!--表示该页面可以被隐式调用,必须加上该项-->
<category android:name="android.intent.category.DEFAULT" />
<!--如果希望该应用可以通过浏览器的连接启动,则添加该项-->
<category android:name="android.intent.category.BROWSABLE" />
扩展:
上面的 data 节点中可以包含下面的信息来对相应的scheme进行过滤,一般需要配置 scheme 和 host。
<data
android:scheme=""
android:host=""
android:port=""
android:path=""
android:mimeType=""
android:pathPattern=""
android:pathPrefix=""
android:ssp=""
android:sspPattern=""
android:sspPrefix=""
/>
然后在相应的 activity 可以获取 uri 中参数。
Java
public class DeepLinkActivity extends AppCompatActivity {
private static final String TAG = "DeepLinkActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = getIntent();
Log.e(TAG, "scheme:" + intent.getScheme());
Uri uri = intent.getData();
Log.e(TAG, "scheme: " + uri.getScheme()); // 获取 scheme 名称
Log.e(TAG, "host: " + uri.getHost()); // 获取 scheme 的host
Log.e(TAG, "path: " + uri.getPath()); // 获取 scheme 的路径
Log.e(TAG, "queryString: "+ uri.getQuery()); // 获取 scheme 的参数,?后面的部分
Log.e(TAG, "queryParameter: " + uri.getQueryParameter("param")); // 获取 scheme 中的 param 参数
}
}
其中的 intent 实例有下面的方法可以获取相应的 scheme 信息:
<activity
android:name=".MainActivity"
android:launchMode="singleTask">
@Override
public void onNewIntent(Intent intent){
super.onNewIntent(intent);
setIntent(intent);
}
注:
singTask 启动模式在从后台唤醒时它的生命周期:
如果IntentActivity处于任务栈的顶端,也就是说之前打开过的Activity,现在处于
onPause
onStop 状态的话,
其他应用再发送Intent的话,执行顺序为:
onNewIntent
onRestart
onStart
onResume
只需要配置info.plist 文件,只需要配置URL Schemes就可以了,identifier是可选配置
自己编写一个html页面,发到微信,用qq浏览器打开,点击"打开app"按钮,会提示是否“允许”,点击允许,自动打开app。
如果打开的 scheme 在本地没有对应的 app,则点击连接不会反应。
例子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div >
<a href="app://www.aaa.com/list">打开app</a>
</div>
</body>
</html>
注:
1.这种的缺点是只能用qq浏览器打开
2.浏览器打开如下html代码,即可启动App
<a href="myscheme://">打开app</a>
浏览器打开App时,如何获取网页带过来的数据(用原生代码获取)
Html
<a href="myscheme://?arg0=0&arg1=1">打开app</a>
Java
(1).假如你是通过浏览器打开这个网页的,那么获取数据的方式为:
Uri uri = getIntent().getData();
String test1= uri.getQueryParameter("arg0");
String test2= uri.getQueryParameter("arg1");
(2)如果使用webview访问该网页,获取数据的操作为:
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Uri uri=Uri.parse(url);
if(uri.getScheme().equals("myscheme")){
String arg0=uri.getQueryParameter("arg0");
String arg1=uri.getQueryParameter("arg1");
}else{
view.loadUrl(url);
}
return true;
}
});
、
android调用
Java
Intent action = new Intent(Intent.ACTION_VIEW);
StringBuilder builder = new StringBuilder();
builder.append("caishilive://caishi:8080/loadtooldetail?tool_id=100");
action.setData(Uri.parse(builder.toString()));
startActivity(action);
或
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
startActivity(intent);
ios调用
Java
NSString *url = @"opengs://";
// NSString *url = @"opengs://com.opengs.www";
if ([[UIApplication sharedApplication]
canOpenURL:[NSURL URLWithString:url]])
{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}
else
{
NSLog(@"can not open URL scheme opengs");
}
跳转前要判断一下该URL Scheme是否有效
Html
private boolean schemeValid() {
PackageManager manager = mContext.getPackageManager();
Intent action = new Intent(Intent.ACTION_VIEW);
action.setData(Uri.parse("caishilive://caishi:8080/loadtooldetail?tool_id=100"));
List list = manager.queryIntentActivities(action, PackageManager.GET_RESOLVED_FILTER);
return list != null && list.size() > 0;
}
react-native获取url 见下节 http://t.csdn.cn/h40sw
名称 | URL Scheme | 对应的普通链接 |
---|---|---|
witter发消息 | Twitter://messages/compose?text=[yourText] | https://twitter.com/messages/compose?text=[yourText] |
Twitter发动态 | twitter://intent/tweet?text=[yourText] | https://twitter.com/intent/tweet?text=[yourText] |
打开Email | mailto:?body=[yourText] | |
给某人发Email | mailto:[emailAddress]?body=[yourText] | |
发短信SMS | sms:body=hello(AOS)sms:&body=hello(IOS) | |
whatsapp发消息 | whatsapp://send?text=[yourText] | |
fbmessenger发消息(分享链接) | fb-messenger://share/?link=[yourShareURL] | https://www.facebook.com/dialog/send?display=popup&app_id=[yourAppID]&link=[yourShareURL]&redirect_uri=[yourShareURL] |
fbmessenger发消息(指定对象) | fb-messenger://m.me/[yourPageID](通用) fb-messenger-public://user-thread/[yourPageID](IOS) | https://www.messenger.com/t/[yourPageID] / https://m.me/[yourPageID] |
fb打开相关主页 | fb://page/[yourPageID] | https://www.facebook.com/[yourPageID] |
Amazon打开产品详情页 | com.amazon.mobile.shopping://www.amazon.com/dp/[yourAsin] | https://www.amazon.com/dp/[yourAsin] |
打开App Store中应用详情页 | itms-apps://itunes.apple.com/cn/app/[yourAppID] | https://itunes.apple.com/cn/app/[yourAppID] |
打电话 | tel:[telephoneNumber] |
名称 | URL Scheme | Bundle Identifier |
---|---|---|
Safari | http:// | |
maps | http://maps.google.com | |
Phone | tel:// | |
SMS | sms:// | |
mailto:// | ||
iBooks | ibooks:// | |
App Store | itms-apps://itunes.apple.com | |
Music | music:// | |
Videos | videos:// | |
3、常用第三方软件 |
名称 | URL Scheme | Bundle Identifier |
---|---|---|
mqq:// | ||
微信 | weixin:// | |
腾讯微博 | TencentWeibo:// | |
淘宝 | taobao:// | |
支付宝 | alipay:// | |
微博 | sinaweibo:// | |
weico微博 | weico:// | |
QQ浏览器 | mqqbrowser:// | com.tencent.mttlite |
uc浏览器 | dolphin:// | com.dolphin.browser.iphone.chinese |
欧朋浏览器 | ohttp:// | com.oupeng.mini |
搜狗浏览器 | SogouMSE:// | com.sogou.SogouExplorerMobile |
百度地图 | baidumap:// | com.baidu.map |
Chrome | googlechrome:// | |
优酷 | youku:// | |
京东 | openapp.jdmoble:// | |
人人 | renren:// | |
美团 | imeituan:// | |
1号店 | wccbyihaodian:// | |
我查查 | wcc:// | |
有道词典 | yddictproapp:// | |
知乎 | zhihu:// | |
点评 | dianping:// | |
微盘 | sinavdisk:// | |
豆瓣fm | doubanradio:// | |
网易公开课 | ntesopen:// | |
名片全能王 | camcard:// | |
QQ音乐 | qqmusic:// | |
腾讯视频 | tenvideo:// | |
豆瓣电影 | doubanmovie:// | |
网易云音乐 | orpheus:// | |
网易新闻 | newsapp:// | |
网易应用 | apper:// | |
网易彩票 | ntescaipiao:// | |
有道云笔记 | youdaonote:// | |
多看 | duokan-reader:// | |
全国空气质量指数 | dirtybeijing:// | |
百度音乐 | baidumusic:// | |
下厨房 | xcfapp:// |
原文链接:https://blog.csdn.NET/weixin_42895400/article/details/87799262
https://blog.csdn.net/wangkeke1860/article/details/49850997