Android/ios 网页中跳转到 app

一 IOS跳转

cocos2dx新建一个空项目,能编译通过并运行



首先我们给app添加一个URL Types,用于给web打开的接口



这里的scheme为test

随便写个html文件放到外网,内网和本地也行,只能你能访问到文件

<iframe src="test://">aaaaaa</frame>



html文件中要做的事情是:加入一个iframe节点, iframe的src为test://就可以啦,在装有app的手机中打开浏览器,输入html文件所在地址,就能跳转到app了

IOS app中接收url页面传来的参数

虽然已经实现了从 网页 里面跳转到app,但功能还不理想:游戏中一人创建的一个房间,向微信好友分享一个url,好友点击这个url,跳转到app中,并且还要进入到这个房间,这时就需要在分享的时候传递一个参数roomId, html页面取到这个参数,传入到app中,app取得这个roomId后,直接加入到房间

其实iframe节点的src值就是app中能得到 的url参数

xcode工程中,找到AppController.mm文件,修改或添加这两个方法

//ios9.0以下的 URL Scheme 实现深度链接技术
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    if(!url){
        return NO;
    }
    NSString *urlString = [url absoluteString];
    NSLog(@"urlString:%@", urlString);
    return YES;
}
//ios9.0以上的
//-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id>*) options
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary*) options
{
    if(!url){
        return NO;
    }
    NSString *urlString = [url absoluteString];
    NSLog(@"urlString111:%@", urlString);
    return YES;
}

若能得到urlString,还怕取不到房间号吗


已经成功了,从中取得roomId并切换场景还不简单吗

二,Android跳转

ios app跳转成功,android跳转也是类型的

首先,也是要建一个cocos2dx项目的,我这儿就用以前用到过的一个项目,如果pc装的是mac OS系统,那就用上面个项目就可以了。



修改AndroidManifest.xml

        <activity android:name="org.cocos2dx.lua.AppActivity"
                  android:label="@string/app_name"
                  android:screenOrientation="landscape"
                  android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                  android:configChanges="orientation|keyboardHidden|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
			<!--Android 接收外部跳转过滤器-->
            <intent-filter>
                <!-- 协议部分配置 ,要在web配置相同的-->
                <data
                    android:host="splash"
                    android:scheme="test"/>

                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>

                <action android:name="android.intent.action.VIEW"/>
            </intent-filter>
        </activity>
data标签
<data android:host="string" 
      android:mimeType="string" 
      android:path="string" 
      android:pathPattern="string" 
      android:pathPrefix="string" 
      android:port="string" 
      android:scheme="string" />



html代码也是与ios跳转部分类似
<iframe src="test://splash">aaaaaa</frame>

app接收url参数
public class AppActivity extends Cocos2dxActivity{

	public AppActivity(){
		System.out.println("aaaaaaaaaaaaaaaaaaaaaa");
	}
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		Intent intent = getIntent();
		if(intent.getData() != null){
	        String url = intent.getData().toString();
	        Log.d("aaaa", "url="+url);
	        if(url != null){
		        int index = url.indexOf(':');
		        //协议scheme
		        String scheme = url.substring(0, index);
		        String leftString = url.substring(index);
		        leftString = leftString.replaceFirst("://", "").replaceFirst(":///", "");
		        int paramStartIndex = leftString.indexOf('?');
		        String hostBody = leftString;
		        String param = null;
		        if(paramStartIndex >= 0){
		        	hostBody = hostBody.substring(0, paramStartIndex);
		        	param = leftString.substring(paramStartIndex + 1);
		        }
		        int pathIndex = hostBody.indexOf('/');
		        if(pathIndex >= 0){
		        	
		        }
	        }
		}
        super.onCreate(savedInstanceState);
	}


最后再完善一下html文件
<!DOCTYPE html>  
<html>  
<body> 
	<a href="javascript: void(0);" id="openApp">打开</a> 
</body>
<script type="text/javascript"> 
//url参数
var paraObj = null;
//scheme与app的下载地址映射
var schemeAppMap = {};
//初始化schemeAppMap
function initSchemeAppMap(obj){
	obj['splash'] = "test_download_addr";
}
initSchemeAppMap(schemeAppMap);
//取得url参数
function getParamObj(){
	var ret = {};
	var parms= window.location.search;
	if(parms.indexOf("?") != -1){
		var params1 = parms.substr(1);  //去除"?"
		var strs = params1.split("&");
		for(var i=0; i<strs.length; i++){
			var vals = strs[i].split("=");
			if(vals.length == 2){
				ret['' + vals[0]] = '' + vals[1];
			}
		}
	}
	return ret;
}
//构建参数
function buildURL(paramObj,excludeArr){
	var i = 0;
	for(i = 0; i < excludeArr.length; i++){
		paramObj[excludeArr[i] + ''] = undefined;
	}
	var ret = '';
	var first = true;
	for(var key in paramObj){
		if(paramObj[key]){
			if(first){
				ret += key+ '=' + paramObj[key];
				first = false;
			}
			else{
				ret += '&' + key+ '=' + paramObj[key];
			}
		}
	}
	return ret;
	
}

//初始化跳转页面
function initJmpFrame(paramObj){
	document.getElementById('openApp').onclick = function(e){ 
	// 通过iframe的方式试图打开APP,如果能正常打开,会直接切换到APP,并自动阻止a标签的默认行为 
	// 否则打开a标签的href链接 
	var ifr = document.createElement('iframe'); 
	var scheme = paramObj['scheme'];
	var host = paramObj['host'];
	var port = paramObj['port'];
	var path = paramObj['path'];
	var ifrUrl = scheme + '://';
	if(host){
		ifrUrl += host;
	}
	if(host && port){
		ifrUrl += ':' + port;
	}
	else if(port){
		ifrUrl += '' + port;
	}
	if(path){
		ifrUrl += '/' + path;
	}
	//console.log(ifrUrl);
	var paramURL = buildURL(paramObj,['scheme', 'host', 'port', 'path']);
	ifrUrl += '?' + paramURL;
	//console.log(ifrUrl);
	ifr.src = ifrUrl; 
	ifr.style.display = 'none'; 
	document.body.appendChild(ifr); 
	window.setTimeout(function(){ 
		document.body.removeChild(ifr); 
	},500) }; 
}
paraObj = getParamObj();
initJmpFrame(paraObj);
</script>  
</html>






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值