我在服务器上发现某些用户已被多次注册。我现在有3000多个安装,并且只有某些低端Android设备具有此行为。
在客户端(Unity 2018.2.9f1)上,检查如下所示:
if(!HasAccessToken())
Register(); // registers the user on a server, saves the access token in prefs
else
Login()
此检查是从Start()
方法中触发的,因此它没有被初始化或其他任何方式。
HasAccessToken()
方法是使用PlayerPrefs
的简单检查。这是AccessToken
访问者:
public string AccessToken {
get { return PlayerPrefs.GetString(PlayerData.ACCESS_TOKEN_KEY, ""); }
set { PlayerPrefs.SetString(PlayerData.ACCESS_TOKEN_KEY, value); }
}
这是HasAccessToken()
:
public static bool HasAccessToken(){
string accessToken = PlayerData.Instance.AccessToken;
return accessToken != null && !accessToken.Equals("") && accessToken != string.Empty;
}
有些设备多次调用寄存器,有时是1分钟后,有时是一周后,有时是每周5次,随机间隔。
仅当重新安装游戏(PlayerPrefs
丢失并且HasAccessToken()
返回false
)时才应该发生这种情况,这是已定义的行为,我们应该再次注册他。
但是这种情况不会重新安装!
我怎么知道?
几天前,我修改了注册请求,并发送了LevelNumber
属性,该属性也可以从PlayerPrefs
中读取。
我可以在服务器上清楚地看到,用户正在使用奇怪的LevelNumber值(例如15、30、50)甚至0登记到服务器,这是不可能的,因为LevelNumber看起来像这样:
public int LevelNumber {
get { return PlayerPrefs.GetInt(PlayerData.CURRENT_LEVEL_NUMBER, 1); }
private set { PlayerPrefs.SetInt(PlayerData.CURRENT_LEVEL_NUMBER, value); }
}
,唯一的写操作是:LevelNumber = LevelNumber + 1
。
这就是为什么我假设这是一些Unity或Android的错误行为。
在以前的任何游戏中,我从未使用过此功能,也因此没有任何麻烦。
这可能是问题吗?似乎没有,因为昨天我在某些位置(保存令牌后,完成关卡)发布了PlayerPrefs.Save()的更新,并且仍然有一些客户端进行了多次注册(使用新的更新的客户端)。