在游戏中,往往有这样的需求:给你一个网页,让你从这个网页跳转到游戏中,并且进入指定的游戏房间。
那么通俗的讲就是:HTML唤起应用,打开并携带数据,若未唤醒成功,则开始应用的下载。
方案思路:html使用scheme协议调起App,再交由app对url的携带数据进行处理。
关于scheme
关于scheme url,网上有很多解释,这里就不再复述了。
总结就是:浏览器端或App端点开url的一瞬间,若协议符合app设置好的scheme规则,则会被app捕获并拉起。
例如:我们平常所浏览的网页,是以http://或https://为开头。这个时候,浏览器会判定这是一个网页,从而下载网页内容并打开。而如果是简书这样的app则会以jianshu://为开头,浏览器不知道你的协议,就会去判断你本地是不是安装了这个程序,如果安装了,则调动app。
实现方式
安卓:
首先在你需要跳转的Activity添加scheme规则,方式便是在manifest清单文件中加入下面的代码。
<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="jianshu" android:host="index" android:pathPrefix="/openwith"/>
</intent-filter>
那么url的拼接就是jianshu://index/openwith?userId=xxxx
其中,openwith后就是熟悉的html明文传输数据了。ok,到这里已经能够跳转了,那么我们在安卓中要如何获取携带数据呢?
其实,在Activity生命周期中,有两个方法,一个是onCreate,另一个是onNewIntent。onCreate能够实现app从未打开的方式获取携带的数据;而onNewIntent则是实现当app已经打开并且该activity已经在顶栈运行无法再走onCreate生命周期时获取跳转时携带的数据。那么这两个生命周期都需要用到,那么可以写一个方法来进行获取
private void initJumpData(Intent intent) {
Uri uri = intent.getData();
if (uri != null) {
userId = uri.getQueryParameter("userId");
intent.setData(null);
}
}
这个时候只要在onCreate和onNewIntent中调用即可
onNewIntent中:initJumpData(intent)
onCreate中:initJumpData(getIntent())
IOS
ios的scheme设置就比较简单了,在info.plist找到URL Types然后点击+号新增一个scheme协议即可,其他参数都不用填
image这个时候就能够跳转了,而他的url拼接为jianshu://userId=xxxx(可以看到//后面直接就是携带参数了)
那么在IOS中要如何获取携带数据呢?
这里我写得比较复杂,应该是有其他方式的。
在AppController中找到如下两个方法
-
(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
-
(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
如果没有,可以创建
这里的url就是url拼接的全部内容jianshu://userId=xxxx
但是我需要把它转为一个字典类型,这里我提供一个自己的思路:
首先将jianshu://这个前缀去掉,只取后面的数据
NSString *reqer = [url.resourceSpecifier substringFromIndex:2];
拿到之后将其变成json可以解析的字符串
NSArray *arr = [reqer componentsSeparatedByString:@"&"];
NSMutableString *jsonStr = [[NSMutableString alloc]initWithString:@"{"];
for (int i = 0; i < arr.count; i++) {
NSString *subStr = arr[i];
NSArray *subArr = [subStr componentsSeparatedByString:@"="];
if (i == arr.count-1) {
[jsonStr appendFormat:@"\"%@\":\"%@\"}",subArr.firstObject, subArr.lastObject];
}else {
[jsonStr appendFormat:@"\"%@\":\"%@\",",subArr.firstObject, subArr.lastObject];
}
}
其中,jsonStr就是json格式的字符串了{"userId":1234},下面你们应该知道怎么做了
HTML
html就比较简单了,你们可以直接跳转到我的网页,按F12审查元素即可。
青田放冲麻将,等你来战!<-点它点它
网友评论