@wangwangheng
2015-05-30T10:00:26.000000Z
字数 5060
阅读 3451
公司文档
版本 | 日期 | 作者 | 更新内容 |
---|---|---|---|
1.0 | 2015-05-25 | 王恒 | 初稿 |
<activity
android:name="com.hengeasy.guamu.droid.web.WebActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar" >
<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:scheme="guamu" android:host="guamu"/>
</intent-filter>
</activity>
参数名 | 参数值 | 其他说明 |
---|---|---|
type | 1表示IOS; 2表示Android |
和打开职位详情时传递的参数一致 |
share | 1表示是分享出去的链接,其他值表示不是分享出去的链接 | 在客户端内打开详情的时候不会添加这个参数 |
url | 服务端需要打开客户端的时候需要传递回来的参数 | 服务端打开客户端的时候,客户端加载这个链接并从这个链中获取必需的参数 需要对这个字符串做Base64加密 |
title | 网页显示的标题 | 客户端职位详情页顶部的标题文字; 需要对这个字段做一下基于UTF-8编码的URLEncoder |
url参数中应该包含网页的标题(职位的标题或者公司的标题)
特别注意:Base64编码或者解码的时候必须使用UTF-8编码并其使用Flag是Base64.NO_WRAP的那种方式(去除换行;Base64在进行转码的时候如果位数不是3的倍数会在字符串后面追加一个或者两个“=”)
例子:
http://www.baidu.com/page?type=2&share=1&url=aHR0cHM6Ly96eWJ1bHVvLmNvbS93YW5nd2FuZ2hlbmcvbm90ZS85NTg0MQAC
/**
*
* getShareURL:得到分享链接. <br/>
*
* @author wangheng
* @return
*/
private String getShareURL(){
String shareURL = mUrl;
if(StringUtils.isNullOrEmpty(shareURL)){
shareURL = mWebView.getUrl();
}
if(shareURL.contains("app_token=")){
shareURL = shareURL.substring(0,shareURL.indexOf("app_token="));
}
String url = new String(shareURL);
String title = mTopbarTitle.getText().toString();
try{
if(url.contains("?")){
if(url.endsWith("?")){
url = url + "title=" + URLEncoder.encode(title, "UTF-8");
}else{
if(url.endsWith("&")){
url = url + "title=" + URLEncoder.encode(title, "UTF-8");
}else{
url = url + "&title=" + URLEncoder.encode(title, "UTF-8");
}
}
}else{
url = url + "?title=" + URLEncoder.encode(title, "UTF-8");
}
url = Base64.encodeToString(url.getBytes("UTF-8"), Base64.URL_SAFE);
if(shareURL.contains("?")){
if(shareURL.endsWith("?")){
shareURL = shareURL + "type=2&share=1&title="
+ URLEncoder.encode(title, "UTF-8") + "&url=" + url;
}else{
if(shareURL.endsWith("&")){
shareURL = shareURL + "type=2&share=1&title="
+ URLEncoder.encode(title, "UTF-8") + "&url=" + url;
}else{
shareURL = shareURL + "&type=2&share=1&title="
+ URLEncoder.encode(title, "UTF-8") + "&url=" + url;
}
}
}else{
shareURL = shareURL + "?type=2&share=1&title="
+ URLEncoder.encode(title, "UTF-8") + "&url=" + url;
}
}catch(Exception e){
e.printStackTrace();
}
return shareURL;
}
可以从getIntent().getData()
拿到打开APP的完整的path,从这个Path中可以拿到我们需要的所有的参数
Uri uri = intent.getData();
if(uri == null){
finish();
return;
}
String schema = uri.getScheme();
if(StringUtils.isNullOrEmpty(schema)){
finish();
return;
}
if("guamu".equals(schema)){
mUrl = uri.getQueryParameter("url");
if(mUrl != null){
try {
mUrl = new String(Base64.decode(mUrl.getBytes("UTF-8"), Base64.URL_SAFE),"UTF-8");
title = URLDecoder.decode(Uri.parse(mUrl).getQueryParameter("title"),"UTF-8");
isFromShared = Integer.parseInt(Uri.parse(mUrl).getQueryParameter("share")) == 1;
} catch(Exception e) {
title = App.getInstance().getString(R.string.web_topbar_title_detail);
e.printStackTrace();
}
}
}
例子:
guamu://guamu?url=aHR0cHM6Ly96eWJ1bHVvLmNvbS93YW5nd2FuZ2hlbmcvbm90ZS85NTg0MQAC
服务端判断操作系统的逻辑请参考:http://www.cnblogs.com/duanguyuan/p/3534470.html
用户点击浏览器中的链接时,在动态创建一个不可见的iframe,并且让这个iframe去加载步骤1中的Schema,如下:
var ifr = document.createElement('iframe');
ifr.src="guamu://guamu?url=XXXXX"
如果在指定的时间内没有跳转成功,则当前页跳转到apk的下载地址(或下载页),如下:
window.location = download_url;
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<title>this's a demo</title>
<meta id="viewport" name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,minimal-ui">
</head>
<body>
<div>
<a id="J-call-app" href="javascript:;" class="label">立即打开>></a>
<input id="J-download-app" type="hidden" name="storeurl" value="http://m.chanyouji.cn/apk/chanyouji-2.2.0.apk">
</div>
<script>
(function(){
var ua = navigator.userAgent.toLowerCase();
var t;
var config = {
/*scheme:必须*/
scheme_IOS: 'guamu://',
scheme_Adroid: 'guamu://guamu?url=XXXX',
download_url: document.getElementById('J-download-app').value,
timeout: 600
};
function openclient() {
var startTime = Date.now();
var ifr = document.createElement('iframe');
ifr.src = ua.indexOf('os') > 0 ? config.scheme_IOS : config.scheme_Adroid;
ifr.style.display = 'none';
document.body.appendChild(ifr);
var t = setTimeout(function() {
var endTime = Date.now();
if (!startTime || endTime - startTime < config.timeout + 200) {
window.location = config.download_url;
} else {
}
}, config.timeout);
window.onblur = function() {
clearTimeout(t);
}
}
window.addEventListener("DOMContentLoaded", function(){
document.getElementById("J-call-app")
.addEventListener('click',openclient,false);
}, false);
})()
</script>
</body>
</html>