栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

cocos2dx

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

cocos2dx

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

1.android

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

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

因为安卓有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++函数,但是解码后的字符串里可能会有‘’而这个字符在字符串传递的过程中可能会被截断!所以可以在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一样,只需要把取到的加密串解密就行了。 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/906621.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号