前言
如题的需求应该经常在开发被提到,例如给客户体验3–5天的程序,到期后使其不可使用,或者几年的使用期限。这个功能常常需要使用到usb加密狗来限制,当然这也的话就需要一定的硬件投入。很多临时提供的版本基本是要求软件来实现这种时间的限制,那就可以使用调用某个网络时间的接口来进行验证体验时间是否过期的判断,如果过期了就进行强制退出。这个接口不一定需要联网,可以让做后端的提供一个服务器时间的接口来实现也是可以的。本文实现该功能是通过某宝的时间戳调用接口,这样的话,这个功能的要求就是需要联通互联网。如果你的需要不联网也可以用本机系统时间来判断:
DateTime da = DateTime.Now;
不过这样的话,修改本机的系统时间是可以绕过这个验证的。
实现
接口地址采用了某宝的时间戳获取接口:
http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp
无需任何传参,直接get请求即可。
返回结果为:
{"api":"mtop.common.getTimestamp","v":"*","ret":["SUCCESS::接口调用成功"],"data":{"t":"1692946147402"}}
其中data>t (1692946147402)就是时间戳,将其转换为时间后即可进行判断。
这里在打包前进行一定的配置,就是设定程序开始体验的时间,以及有效的时长(天数和小时数):
[Header("开始时间")]
public string StTimeStr ="2023/7/4 00:00:00" ;
[Header("有效期天数")]
public float ValDays;
[Header("有效期小时")]
public float ValHours;
DateTime StDt,EdDt;
// Start is called before the first frame update
void Start()
{
DateTime da = DateTime.Now;
StDt = DateTime.Parse(StTimeStr);
EdDt = StDt.AddDays(ValDays).AddDays(ValHours);
}
如下图的设置:
这里的开始时间就是2023年8月26日的00点00分00秒;然后有效的时间就是15天+ 12小时(这里也可以设天数为15.5,具体看方便设置)。
接口调用成功后,具体的时间判断如下:
try{
string str = Encoding.UTF8.GetString(bytes);
JsonData resp = JsonMapper.ToObject(str);
if (resp != null && resp.ContainsKey("data") && resp["data"].ContainsKey("t"))
{
DateTime nowdt = GetDateTimeMilliseconds(long.Parse(resp["data"]["t"].ToString()));
if (nowdt < EdDt)
isPassed= true;
}
else {
Debug.LogWarning("获取网络时间失败!:" + resp["message"]);
}
}
catch (Exception e)
{
Debug.LogWarning("获取网络时间异常:" + e);
}
finally
{
if (!isPassed)
{
Debug.LogWarning("程序体验时间过期,程序退出!");
Application.Quit();
}
//可间隔一定时间进行验证。
//else
// Invoke("PassCheck", 20f);
}
上面的检测仅在启动的时候判定一次,如果在程序运行中时过期,程序仍能正常运行。如果想要到期后程序也会退出,则需要一定时间间隔检查一次。