当前位置:   article > 正文

cocos2dx_lua读取unity手机游戏本地文件_cocos2dxprefsfile

cocos2dxprefsfile

这个问题根据手机类型分两类分别来讨论:

1.android

要想读取unity本地文件,首先得知道他的位置。

a.获取文件位置的方法:

因为安卓有android模拟器,再根据一些unity文档我们知道unity对安卓存储本地的文件名叫做

[包名].v2.playerprefs.xml

我们使用了夜神模拟器

根据图示打开安卓文件夹

点击 根目录,在根据目录一层层找下去,最终在包名下的shared_prefs目录下可以看到我们最终要解析的文件。

找到了文件,接下来就是看看cocos中如何去解析。还有一个需要了解的情况就是unity中本地文件加密行为,一般会使用到unity中的一个加密插件Anti-Cheat Toolkit,当然本篇文章无法教大家如何破解这个插件,但是如果我们已知加密key的情况下,事情还是能继续下去的。

  1. --首先在代码里找到这个文件
  2. local FU = cc.FileUtils:getInstance()
  3. local writablePath = FU:getWritablePath()
  4. local filePath = writablePath .. "../shared_prefs/[包名].v2.playerprefs.xml"
  5. --如果文件存在则继续往下走
  6. if FU:isFileExist(filePath) == true then
  7. --直接把加密key 和 加密key加密后的值 写出,通过 加密key加密后的值 在xml文件中搜索 value加密后的值,然后进行解码
  8. local accoundByID = "加密key" --加密key
  9. local accoundByID_encodeKey = "加密key加密后的值" --加密key加密后的值
  10. if device.platform == "android" then
  11. local ptrFile = FU:getStringFromFile(filePath)
  12. local xfile = xml.eval(ptrFile)
  13. for i = 1,#xfile do
  14. if type(xfile[i]) == 'table' and xfile[i][0] == "string" then
  15. local key = xfile[i].name
  16. local value = xfile[i][1] --value加密后的值
  17. if key == accoundByID_encodeKey then
  18. --解密
  19. local accountStr = decode_Unity_GetString(accoundByID, value)
  20. --TODO
  21. break
  22. end
  23. end
  24. end
  25. end
  26. end

 这里还有一个解密的过程,看了一下c#的写法,在lua这边重新写一下,这里面有一些urlencode、urldecode还有base64的操作各个工程不同。如果能正确的完成这个过程会得到解码后的字符串。

这里面有一个lua和c++交互的坑。base64解码是调用的c++函数,但是解码后的字符串里可能会有‘\0’而这个字符在字符串传递的过程中可能会被截断!所以可以在base64解码后urlencode一下,到lua里decode就可以了。

  1. function decode_Unity_GetString(key, value)
  2. local urldecode_value = string.urldecode(value)
  3. local inputBytes = string.urldecode(Base64(urldecode_value))
  4. local bytab = {}
  5. local inputBytes_len = string.len(inputBytes)
  6. for i = 1, inputBytes_len do
  7. local s = string.sub(inputBytes, i, i)
  8. table.insert(bytab, string.byte(s))
  9. end
  10. local encryptedBytes = {}
  11. local encryptedBytes_len = inputBytes_len - 7 --在unity里有一套检测算法,这里直接走正确分支了
  12. for i = 1, encryptedBytes_len do
  13. encryptedBytes[i] = bytab[i]
  14. end
  15. local cryptoKey = key .. "e806f6"
  16. local encryptionKeyLength = string.len(cryptoKey)
  17. local cleanBytes = ""
  18. for i = 1, encryptedBytes_len do
  19. local cryptoKey_i = (i - 1) % encryptionKeyLength + 1 --c#中从0开始模,lua减1后再模,并加上1作为下标位置
  20. local cryptoKey_num = string.byte(string.sub(cryptoKey, cryptoKey_i, cryptoKey_i))
  21. encryptedBytes[i] = Sha256.bxor(encryptedBytes[i], cryptoKey_num)
  22. cleanBytes = cleanBytes .. string.char(encryptedBytes[i])
  23. end
  24. return cleanBytes
  25. end

2.Ios

ios和安卓还是有一些不同的,为了得到ios应用中的本地文件,可以使用xcode工具。

设备链接上电脑,点击windows -> Devices

选中具体的项目,点击设置 -> 下载包内容。

打开包内容就能看到

 

在ios中是一个【包名】.plist 文件。那么在cocos中应该如何读取plist文件呢?

 

其实cocos已经提供了一个方法了,只不过可惜的是没有写lua绑定,不过没关系,自己写一个就是了,还是很简单的。

读到了本地的plist文件,后续的步骤就和android一样,只需要把取到的加密串解密就行了。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/95809
推荐阅读
相关标签
  

闽ICP备14008679号