前言
最近公司项目由于需要发布多个平台: Android,IOS,PC,WebGL,项目里面的第三方授权登录需要同时适配多个平台,
要为每一个平台都单独接入对应平台的SDK想想都脑壳疼。最后决定,所有平台都统一走网页授权登录。
提示:关于网页授权登录就不在这里说了,如果大家甘兴趣,我单独开一篇专门讲如何实现。
要实现网络授权,有一个步骤是必不可少的,就是当U3D打开浏览去访问授权地址的时候,如果授权成功或失败,手机的浏览器会打开应用并把数据授权的结果返回的,这时候就不得不使用到深度链接这个技术了
提示:以下是本篇文章正文内容,下面案例可供参考
一、深度链接是什么?
“深度链接”又名“Deeplink”,是一种能将用户直接从网页带到App指定页面的技术。
除了从网页跳到APP,还有从APP1跳到APP2
二、如何在Unity3D中使用
1.发起方
这里拿APP跳转APP为例子说明。既然是APP之间的跳转,那我们先创建两个U3D工程。
这里我们首先创建发起方,UI就创建一个Button就行,用于点击按钮触发跳转事件。
代码也非常简单,如下
public class DeepLinkOpen : MonoBehaviour
{
private const string url = "sukkScheme://open?name=sukk&age=99&msg=DeepLink!";
public void OpenApp()
{
Application.OpenURL(url);
}
}
把代码中的OpenApp 注册到按钮的点击事件即可,可以看到代码非常简单,重点关注URL字段的内容
这个URL实际分为3部分
1,sukkScheme
2, ://open
3. ?name=sukk&age=99&msg=DeepLink!
第一部分代表的是需要跳转到哪个APP(至于在哪里设置,之后会详细讲解)
第二部分代表的是需要执行什么操作,这里open的意思就是打开应用,这个操作不单单只有Open,还有其他
第三部分代表需要传输的数据,这个部分可以不填
2.接收方
接着我们来创建接收方,UI方面就创建一个Text,用来显示一下发起方传输过来的数据就行了
代码如下
public class ReceiveDeepLink : MonoBehaviour
{
private Text txt_msg;
private void Awake()
{
txt_msg = GameObject.Find("Canvas/Text (Legacy)").GetComponent<Text>();
Debug.Log($"是否接收到深度链接:"+Application.absoluteURL);
}
private void Start()
{
Application.deepLinkActivated += OnDeepLinkActivated;
//检测应用是否是通过深度链接启动
if (!string.IsNullOrEmpty(Application.absoluteURL))
{
OnDeepLinkActivated(Application.absoluteURL);
}
}
private void OnDeepLinkActivated(string deepLink)
{
Debug.Log("应用检测到深度链接"+deepLink);
// 解析URL参数
Uri uri = new Uri(deepLink);
string host = uri.Host;
string path = uri.AbsolutePath;
var queryParams = uri.Query;
Debug.Log($"host:{host},path:{path},queryParams:{queryParams}");
var query = uri.Query.TrimStart('?').Split('&');
for (int i = 0; i < query.Length; i++)
{
//解析数据,将数据显示在Text上
var curData = query[i].Split("=");
Debug.Log($"key:{Uri.UnescapeDataString(curData[0])},value:{Uri.UnescapeDataString(curData[1])}");
txt_msg.text += "\n" + $"key:{Uri.UnescapeDataString(curData[0])},value:{Uri.UnescapeDataString(curData[1])}";
}
}
}
将脚本挂载在对象上就行了,这里解析一下几个重点
1,上述代码中 Application.deepLinkActivated += OnDeepLinkActivated
这里面注册一个函数,这个函数的调用时机是,当有其他应用通过深沉链接去打开该应用时,这个函数就会触发
,这时候unity会给你返回深度链接,如上诉的发起方的"sukkScheme://open?name=sukk&age=99&msg=DeepLink!"
这个字符串
2,Application.absoluteURL,当如果该应用是通过深层链接唤起时,由于该程序之前没打开过,就不会注册1中的函数,所以要通过这个字段,来判断该程序第一次打开时,是否是通过深度链接唤起的
3,接收到深层链接之后,如果有数据,我们就可以解析发起方发送过来的数据了. 我这里定义的是?后面的就是数据,每一条数据由&号分割。 = 前面是数据的key,后面是数据的value
3.配置AndroidManifest
经过上面两个步骤,并不能进行跳转,因为没有给被跳转的应用定义一个标识,还记得 1.发起方 中的第一部分吗?sukkScheme
这里就是定义了深度链接的标识,这里明确告诉了系统,我需要打开标识为 sukkScheme的程序,那这个在U3D的哪里定义呢。android和ios是不一样的,这里拿Android 为例子。打开U3D中的AndroidManifest
在其中添加
<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="sukkScheme" />
</intent-filter>
其中 “data android:scheme=“sukkScheme” 就定义了 这个应用的深沉链接的标识是sukkScheme
好了,到这里就可以分别在两个项目打包apk测试了:
总结
由上图可以看出,接收方成功被打开,而且接收参数成功了,关于深度链接还有很多别的应用,这里只是在做项目的过程中遇到了,刚好记录一下,欢迎各位大佬留言补充