赞
踩
这个问题根据手机类型分两类分别来讨论:
1.android
要想读取unity本地文件,首先得知道他的位置。
因为安卓有android模拟器,再根据一些unity文档我们知道unity对安卓存储本地的文件名叫做
[包名].v2.playerprefs.xml
我们使用了夜神模拟器
根据图示打开安卓文件夹
点击 根目录,在根据目录一层层找下去,最终在包名下的shared_prefs目录下可以看到我们最终要解析的文件。
找到了文件,接下来就是看看cocos中如何去解析。还有一个需要了解的情况就是unity中本地文件加密行为,一般会使用到unity中的一个加密插件Anti-Cheat Toolkit,当然本篇文章无法教大家如何破解这个插件,但是如果我们已知加密key的情况下,事情还是能继续下去的。
- --首先在代码里找到这个文件
- local FU = cc.FileUtils:getInstance()
- local writablePath = FU:getWritablePath()
- local filePath = writablePath .. "../shared_prefs/[包名].v2.playerprefs.xml"
- --如果文件存在则继续往下走
- if FU:isFileExist(filePath) == true then
- --直接把加密key 和 加密key加密后的值 写出,通过 加密key加密后的值 在xml文件中搜索 value加密后的值,然后进行解码
- local accoundByID = "加密key" --加密key
- local accoundByID_encodeKey = "加密key加密后的值" --加密key加密后的值
- if device.platform == "android" then
- local ptrFile = FU:getStringFromFile(filePath)
- local xfile = xml.eval(ptrFile)
- for i = 1,#xfile do
- if type(xfile[i]) == 'table' and xfile[i][0] == "string" then
- local key = xfile[i].name
- local value = xfile[i][1] --value加密后的值
- if key == accoundByID_encodeKey then
- --解密
- local accountStr = decode_Unity_GetString(accoundByID, value)
- --TODO
-
- break
- end
- end
- end
- end
- end

这里还有一个解密的过程,看了一下c#的写法,在lua这边重新写一下,这里面有一些urlencode、urldecode还有base64的操作各个工程不同。如果能正确的完成这个过程会得到解码后的字符串。
这里面有一个lua和c++交互的坑。base64解码是调用的c++函数,但是解码后的字符串里可能会有‘\0’而这个字符在字符串传递的过程中可能会被截断!所以可以在base64解码后urlencode一下,到lua里decode就可以了。
- function decode_Unity_GetString(key, value)
- local urldecode_value = string.urldecode(value)
- local inputBytes = string.urldecode(Base64(urldecode_value))
- local bytab = {}
- local inputBytes_len = string.len(inputBytes)
- for i = 1, inputBytes_len do
- local s = string.sub(inputBytes, i, i)
- table.insert(bytab, string.byte(s))
- end
- local encryptedBytes = {}
- local encryptedBytes_len = inputBytes_len - 7 --在unity里有一套检测算法,这里直接走正确分支了
- for i = 1, encryptedBytes_len do
- encryptedBytes[i] = bytab[i]
- end
- local cryptoKey = key .. "e806f6"
- local encryptionKeyLength = string.len(cryptoKey)
- local cleanBytes = ""
- for i = 1, encryptedBytes_len do
- local cryptoKey_i = (i - 1) % encryptionKeyLength + 1 --c#中从0开始模,lua减1后再模,并加上1作为下标位置
- local cryptoKey_num = string.byte(string.sub(cryptoKey, cryptoKey_i, cryptoKey_i))
- encryptedBytes[i] = Sha256.bxor(encryptedBytes[i], cryptoKey_num)
- cleanBytes = cleanBytes .. string.char(encryptedBytes[i])
- end
-
- return cleanBytes
- end

2.Ios
ios和安卓还是有一些不同的,为了得到ios应用中的本地文件,可以使用xcode工具。
设备链接上电脑,点击windows -> Devices
选中具体的项目,点击设置 -> 下载包内容。
打开包内容就能看到
在ios中是一个【包名】.plist 文件。那么在cocos中应该如何读取plist文件呢?
其实cocos已经提供了一个方法了,只不过可惜的是没有写lua绑定,不过没关系,自己写一个就是了,还是很简单的。
读到了本地的plist文件,后续的步骤就和android一样,只需要把取到的加密串解密就行了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。