Unity登录注册时限制发送验证码次数功能的解决方法

作者:寻漠潇雨 时间:2021-12-28 00:27:12 

当我们需要在Unity客户端做一个限制功能,比如按钮 (最好是发送验证码按钮)要求每天只能点击三次,等到第二天又有三次机会,这个过程不涉及到服务端消息,只涉及到本地存储,以下是我的解决方案:

直接上代码:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UniRx;
using System;
using System.IO;
using System.Text;
using System.Globalization;
public class RegisterPanel : MonoBehaviour
 {
   private LoginUIPanel mLoginUIPanel;
   StreamWriter writer;
   StreamReader reader;
//本地存储手机号
   private string set_phonenum;
//同一个手机号码使用次数
   private int useNum=1;
   FileInfo file;
   private Button btn_GetMsgCode;
/**倒计时 */
   private Text txt_CountDownTimer;

}
private void Awake()
 {
  //获取验证码按钮
     btn_GetMsgCode = input_MsgCode.transform.Find("Btn_GetVerficationCode").GetComponent<Button>();
btn_GetMsgCode.onClick.AddListener(OnGetMsgCodeClick);
txt_CountDownTimer = btn_GetMsgCode.transform.Find("Text").GetComponent<Text>();

}
private void OnEnable()
   {

ResetGetMsgCode();
}
/**
    * 获取验证码
    */
   private void OnGetMsgCodeClick()
   {

if (!mLoginUIPanel.CheckGetMsgCode(input_Account.text))
     {
       Debug.Log("没有输入");
       return;
     }

set_phonenum = input_Account.text.ToString();

if (Limit())
     {
       Debug.Log("返回true");
       return;
     }
     else
     {
       int timer = 60;
       intervalStream = Observable.Interval(TimeSpan.FromSeconds(1))
         .Where(value => { return timer > 1; })
         .SubscribeToText(txt_CountDownTimer, value =>
         {

btn_GetMsgCode.interactable = false;

return (timer--).ToString() + "秒";
         });
       //.AddTo(this);  //绑定生命周期

timeStream = Observable.Timer(TimeSpan.FromSeconds(60))
          .SubscribeToText(txt_CountDownTimer, _ =>
          {
            btn_GetMsgCode.interactable = true;
            return "获取验证码";
          });
       //.AddTo(this);
     }

}
private bool Limit()
   {
     if (PlayerPrefs.HasKey(set_phonenum))
     {
       mLoginUIPanel.ShowToast("号码已经被注册过!");
       return true;
     }
     PlayerPrefs.SetString(set_phonenum, set_phonenum);
     //Application.streamingAssetsPath

//获取当前时间天数
     DateTime now = DateTime.Now;
     DateTimeOffset nowtimesss = DateTimeOffset.Now;
     string nowtime = now.Day.ToString();
     string filenames = Application.dataPath+"/num.txt";

//写入当前次数
     //第一次创建文件
     FileInfo file = new FileInfo(filenames);
     if (!file.Exists)
     {

file.CreateText().Close();
       file.CreationTimeUtc = nowtimesss.UtcDateTime;
       Debug.Log("第一次创建" + file.CreationTimeUtc);
       string bb = file.CreationTime.ToString();
       char[] ss = new char[] {'/'};
       string[] nnn = bb.Split(ss);
       Debug.Log(nnn[1]);
       PlayerPrefs.SetString("FileTime", nnn[1]);
       PlayerPrefs.SetInt("i", 0);
     }

if (Convert.ToInt32(nowtime)!=(Convert.ToInt32(PlayerPrefs.GetString("FileTime"))))
     {
       //刷新次数
       Debug.Log("刷新");
       FileStream stream = File.Open(filenames, FileMode.OpenOrCreate, FileAccess.Write);
       stream.Seek(0, SeekOrigin.Begin);
       stream.SetLength(0);
       stream.Close();
       //重置次数和时间
       PlayerPrefs.SetInt("i", 0);
       PlayerPrefs.SetString("FileTime", nowtime);
     }
     //再判断次数
     //如果是当天
     if ((Convert.ToInt32(PlayerPrefs.GetString("FileTime")))== Convert.ToInt32(nowtime))
     {
       Debug.Log("执行");

if (PlayerPrefs.GetInt("i") > 2)
       {
         Debug.Log("次数已达上限");
         mLoginUIPanel.ShowToast("次数已达上限,请明天再来!");

return true;
       }
       WriteIntoTxt(useNum, filenames, file);
       //读取本地数据
       ReadOutTxt(filenames);
       //排序
       Allmytxt.Sort();
       //对当前号码取最大值存入
       PlayerPrefs.SetInt("i", Allmytxt[Allmytxt.Count - 1]);
       useNum++;
       int a = 3 - Allmytxt[Allmytxt.Count - 1];
       mLoginUIPanel.ShowToast("今天还剩下"+ a+ "次注册机会");
       Debug.Log(PlayerPrefs.GetInt("i"));
       // Debug.Log("当前文件日期" + Convert.ToInt32(PlayerPrefs.GetString("FileTime")));
       //先判断时间
       return false;
     }

return false;
   }
/**
    * reset重置倒计时·
    */
   public void ResetGetMsgCode()
   {
     btn_GetMsgCode.interactable = true;
     txt_CountDownTimer.text = "获取验证码";
   }
//把所有的数据写入文本中
   public void WriteIntoTxt(int message,string filename,FileInfo file)
   {

// FileInfo file = new FileInfo(filename);

//最后一次修改日期并存储

if (!file.Exists)
     {
       writer = file.CreateText();
     }
     else
     {
       writer = file.AppendText();
     }
     writer.WriteLine(message);
     writer.Flush();
     writer.Dispose();
     writer.Close();

string bb = file.LastAccessTime.ToString();
     char[] ss = new char[] { '/' };
     string[] nnn = bb.Split(ss);

Debug.Log(nnn[1]);

PlayerPrefs.SetString("FileTime", nnn[1]);

}
   //读取次数 存储到列表中
   public void ReadOutTxt(string filename)
   {
     Allmytxt.Clear();
     reader = new StreamReader(filename, Encoding.UTF8);
     string text;
     int line = 0;
     while ((text = reader.ReadLine()) != null)
     {
       ++line;

// Allmytxt.Add(int.Parse(text));
     }
     //利用文本的行数来判断次数
     Allmytxt.Add(line);
     Debug.Log(line);
     reader.Dispose();
     reader.Close();
}

来源:https://blog.csdn.net/qq_36907428/article/details/97413556

标签:Unity,验证码
0
投稿

猜你喜欢

  • Java环境配置与编译运行详解

    2022-10-02 12:42:24
  • SpringMVC中Controller类数据响应的方法

    2021-10-07 21:00:08
  • DataBinding onClick的七种点击方式

    2021-12-08 01:23:22
  • java使用正则表达校验手机号码示例(手机号码正则)

    2022-04-07 20:37:04
  • springBoot加入thymeleaf模板的方式

    2023-11-25 14:31:23
  • Spring boot搭建邮件服务的完整步骤

    2023-07-20 06:58:34
  • Android提醒微技巧你真的了解Dialog、Toast和Snackbar吗

    2023-03-08 14:15:44
  • Ubuntu中为Android实现Application Frameworks层增加硬件访问服务

    2021-05-28 14:20:02
  • C#中神器类BlockingCollection的实现详解

    2022-10-13 07:41:02
  • AOP从静态代理到动态代理(Emit实现)详解

    2023-11-27 14:49:56
  • C#集合之不变集合的用法

    2023-06-15 14:03:31
  • java 学习笔记(入门篇)_多选择结构switch语句

    2023-02-04 11:35:59
  • Java DWR内存泄漏问题解决方案

    2022-02-28 02:35:07
  • Mybatis源码解析之事务管理

    2023-01-14 10:59:34
  • java 深拷贝与浅拷贝机制详解

    2023-02-18 19:00:59
  • java实现猜拳游戏

    2023-08-04 04:23:52
  • java synchronized用法详解

    2022-06-22 00:38:03
  • Java如何将ResultSet结果集遍历到List中

    2022-07-01 06:30:46
  • Java File类提供的方法与操作

    2023-08-29 09:10:41
  • Java封装、继承、多态三大特征的理解

    2023-07-16 14:26:46
  • asp之家 软件编程 m.aspxhome.com