一 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>