add
This commit is contained in:
@@ -0,0 +1,519 @@
|
||||
-- 资源更新器
|
||||
--//TODO:1,可能考虑把共公部分路径抽取出来,以减少配置文件的容量;2,语言文件考虑增量更新的方式,避免改一点点更新整个文件(语言文件还是挺大的)
|
||||
-- 服务器
|
||||
local csSelf = CLVerManager.self
|
||||
local baseUrl = CLVerManager.self.baseUrl --"http://gamesres.ultralisk.cn/cdn/test";
|
||||
local platform = ""
|
||||
local newestVerPath = "newestVers"
|
||||
local resVer = "resVer"
|
||||
local versPath = "VerCtl"
|
||||
local fverVer = "VerCtl.ver" --本地所有版本的版本信息
|
||||
---@type System.Collections.Hashtable
|
||||
local localverVer = Hashtable()
|
||||
---@type System.Collections.Hashtable
|
||||
local serververVer = Hashtable()
|
||||
--========================
|
||||
local verPriority = "priority.ver"
|
||||
---@type System.Collections.Hashtable
|
||||
local localPriorityVer = Hashtable() --本地优先更新资源
|
||||
---@type System.Collections.Hashtable
|
||||
local serverPriorityVer = Hashtable() --服务器优先更新资源
|
||||
|
||||
local verOthers = "other.ver"
|
||||
---@type System.Collections.Hashtable
|
||||
local otherResVerOld = Hashtable() --所有资源的版本管理
|
||||
---@type System.Collections.Hashtable
|
||||
local otherResVerNew = Hashtable() --所有资源的版本管理
|
||||
|
||||
local tmpUpgradePirorityPath = "tmpUpgrade4Pirority"
|
||||
local haveUpgrade = false
|
||||
local is2GNetUpgrade = CLVerManager.self.is2GNetUpgrade
|
||||
local is3GNetUpgrade = CLVerManager.self.is3GNetUpgrade
|
||||
local is4GNetUpgrade = CLVerManager.self.is4GNetUpgrade
|
||||
|
||||
local onFinishInit = nil
|
||||
local progressCallback = nil
|
||||
local mVerverPath = ""
|
||||
local mVerPrioriPath = ""
|
||||
local mVerOtherPath = ""
|
||||
|
||||
---@type System.Collections.Hashtable
|
||||
local needUpgradeVerver = Hashtable()
|
||||
local progress = 0
|
||||
|
||||
local isNeedUpgradePriority = false
|
||||
local needUpgradePrioritis = Queue()
|
||||
local isSucessUpgraded = false
|
||||
local verVerMD5 = ""
|
||||
|
||||
CLLVerManager = {}
|
||||
|
||||
-- 更新初始化
|
||||
--[[
|
||||
iprogressCallback: 进度回调,回调有两个参数
|
||||
ifinishCallback: 完成回调
|
||||
isdoUpgrade: 是否做更新处理
|
||||
--]]
|
||||
function CLLVerManager.init(iprogressCallback, ifinishCallback, isdoUpgrade, _verVerMD5)
|
||||
haveUpgrade = false
|
||||
verVerMD5 = _verVerMD5
|
||||
CLVerManager.self.haveUpgrade = false
|
||||
isNeedUpgradePriority = false
|
||||
localverVer:Clear()
|
||||
serververVer:Clear()
|
||||
localPriorityVer:Clear()
|
||||
serverPriorityVer:Clear()
|
||||
otherResVerOld:Clear()
|
||||
otherResVerNew:Clear()
|
||||
platform = CLPathCfg.self.platform
|
||||
CLVerManager.self.platform = platform
|
||||
|
||||
mVerverPath = PStr.begin():a(CLPathCfg.self.basePath):a("/"):a(resVer):a("/"):a(platform):a("/"):a(fverVer):e()
|
||||
mVerPrioriPath =
|
||||
PStr.begin():a(CLPathCfg.self.basePath):a("/"):a(resVer):a("/"):a(platform):a("/"):a(versPath):a("/"):a(
|
||||
verPriority
|
||||
):e()
|
||||
mVerOtherPath =
|
||||
PStr.begin():a(CLPathCfg.self.basePath):a("/"):a(resVer):a("/"):a(platform):a("/"):a(versPath):a("/"):a(
|
||||
verOthers
|
||||
):e()
|
||||
CLVerManager.self.mVerverPath = mVerverPath
|
||||
CLVerManager.self.mVerPrioriPath = mVerPrioriPath
|
||||
CLVerManager.self.mVerOtherPath = mVerOtherPath
|
||||
|
||||
progressCallback = iprogressCallback
|
||||
onFinishInit = ifinishCallback
|
||||
|
||||
if (not isdoUpgrade) then
|
||||
CLLVerManager.loadPriorityVer()
|
||||
-- 后面会调用onFinish的回调
|
||||
CLLVerManager.loadOtherResVer(true)
|
||||
return
|
||||
end
|
||||
--[[*
|
||||
/// None 无网络
|
||||
/// WiFi
|
||||
/// 2G
|
||||
/// 3G
|
||||
/// 4G
|
||||
/// Unknown
|
||||
*/
|
||||
--]]
|
||||
local netState = Utl.getNetState()
|
||||
local netActived = true
|
||||
if (netState == "None") then
|
||||
netActived = false
|
||||
elseif (netState == "2G") then
|
||||
if (not is2GNetUpgrade) then
|
||||
netActived = false
|
||||
end
|
||||
elseif (netState == "3G") then
|
||||
if (not is3GNetUpgrade) then
|
||||
netActived = false
|
||||
end
|
||||
elseif (netState == "4G") then
|
||||
if (not is4GNetUpgrade) then
|
||||
netActived = false
|
||||
end
|
||||
elseif (netState == "WiFi") then
|
||||
netActived = true
|
||||
elseif (netState == "Unknown") then
|
||||
netActived = true
|
||||
end
|
||||
|
||||
local canDoUpgrade = false
|
||||
if (platform == "Android") then
|
||||
if (not CLCfgBase.self.isEditMode and netActived) then
|
||||
canDoUpgrade = true
|
||||
end
|
||||
else
|
||||
if (not CLCfgBase.self.isEditMode and Utl.netIsActived()) then
|
||||
canDoUpgrade = true
|
||||
end
|
||||
end
|
||||
if (canDoUpgrade) then
|
||||
canDoUpgrade = CLLVerManager.checkChannel()
|
||||
if (canDoUpgrade) then
|
||||
CLLVerManager.netWorkActived()
|
||||
else
|
||||
CLLVerManager.loadPriorityVer()
|
||||
-- 后面会调用onFinish的回调
|
||||
CLLVerManager.loadOtherResVer(true)
|
||||
end
|
||||
else
|
||||
-- 说明是编辑器环境
|
||||
Utl.doCallback(onFinishInit, true)
|
||||
end
|
||||
end
|
||||
|
||||
-- 验证渠道是否需要更新
|
||||
function CLLVerManager.checkChannel()
|
||||
local defaultReuslt = false
|
||||
-- 先判断是否已经取得取渠道
|
||||
local fpath = "channels.json"
|
||||
|
||||
-- 得渠道控制醘数据
|
||||
local content = FileEx.readNewAllText(fpath)
|
||||
local channels = nil
|
||||
if (content ~= nil) then
|
||||
channels = JSON.DecodeMap(content)
|
||||
else
|
||||
return defaultReuslt
|
||||
end
|
||||
|
||||
-- 取得当前版本的渠道数据
|
||||
fpath = "chnCfg.json" -- 该文在打包时会自动放在streamingAssetsPath目录下,详细参见打包工具
|
||||
content = FileEx.readNewAllText(fpath)
|
||||
local chnCfg = nil
|
||||
if (content ~= nil) then
|
||||
chnCfg = JSON.DecodeMap(content)
|
||||
else
|
||||
return defaultReuslt
|
||||
end
|
||||
-- 取得当前包的渠道在渠道配置文件中是否有配置可更新
|
||||
if (MapEx.getBool(channels, MapEx.getString(chnCfg, "SubChannel"))) then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
|
||||
return defaultReuslt
|
||||
end
|
||||
|
||||
-- 验证网络是否可用
|
||||
function CLLVerManager.netWorkActived()
|
||||
local onCheckNetSateSuc = function(...)
|
||||
CLVerManager.self:StartCoroutine(FileEx.readNewAllBytesAsyn(mVerverPath, CLLVerManager.onGetlcalVerverMap))
|
||||
end
|
||||
|
||||
local onCheckNetSateFail = function(...)
|
||||
printw("Cannot connect Server or Net !!!")
|
||||
CLLVerManager.loadPriorityVer()
|
||||
-- 后面会调用onFinish的回调
|
||||
CLLVerManager.loadOtherResVer(false)
|
||||
end
|
||||
|
||||
local url = Utl.urlAddTimes(PStr.b():a(baseUrl):a("/netState.txt"):e())
|
||||
WWWEx.get(url, CLAssetType.text, onCheckNetSateSuc, onCheckNetSateFail, nil, true, 2)
|
||||
end
|
||||
|
||||
--[[
|
||||
/// <summary>
|
||||
/// Ons the get verver map.取得本地版本文件的版本信息
|
||||
/// </summary>
|
||||
/// <param name='buff'>
|
||||
/// Buff.
|
||||
/// </param>
|
||||
--]]
|
||||
function CLLVerManager.onGetlcalVerverMap(buff)
|
||||
if (buff ~= nil) then
|
||||
localverVer = CLVerManager.self:toMap(buff)
|
||||
else
|
||||
localverVer = Hashtable()
|
||||
end
|
||||
CLLVerManager.getServerVerverMap()
|
||||
end
|
||||
|
||||
--[[
|
||||
/// <summary>
|
||||
/// Gets the server verver map.取得服务器版本文件的版本信息
|
||||
/// </summary>
|
||||
--]]
|
||||
function CLLVerManager.getServerVerverMap(...)
|
||||
local url = ""
|
||||
if CLCfgBase.self.hotUpgrade4EachServer then
|
||||
-- 说明是每个服务器单独处理更新控制
|
||||
url = PStr.begin():a(baseUrl):a("/"):a(mVerverPath):a("."):a(verVerMD5):e()
|
||||
else
|
||||
url = PStr.begin():a(baseUrl):a("/"):a(mVerverPath):e()
|
||||
end
|
||||
|
||||
WWWEx.get(
|
||||
Utl.urlAddTimes(url),
|
||||
CLAssetType.bytes,
|
||||
CLLVerManager.onGetServerVerverBuff,
|
||||
CLLVerManager.onGetServerVerverBuff,
|
||||
nil,
|
||||
true,
|
||||
2
|
||||
)
|
||||
end
|
||||
|
||||
function CLLVerManager.onGetServerVerverBuff(content, orgs)
|
||||
if (content ~= nil) then
|
||||
serververVer = CLVerManager.self:toMap(content)
|
||||
else
|
||||
serververVer = Hashtable()
|
||||
end
|
||||
--判断哪些版本控制信息需要更新
|
||||
CLLVerManager.checkVervers()
|
||||
end
|
||||
|
||||
function CLLVerManager.checkVervers()
|
||||
progress = 0
|
||||
needUpgradeVerver:Clear()
|
||||
isNeedUpgradePriority = false
|
||||
local ver = nil
|
||||
local keysList = MapEx.keys2List(serververVer)
|
||||
local count = keysList.Count
|
||||
local key = ""
|
||||
for i = 0, count - 1 do
|
||||
key = keysList[i]
|
||||
ver = MapEx.getString(localverVer, key)
|
||||
if (ver == nil or ver ~= MapEx.getString(serververVer, key)) then
|
||||
MapEx.set(needUpgradeVerver, key, false)
|
||||
end
|
||||
end
|
||||
keysList:Clear()
|
||||
keysList = nil
|
||||
|
||||
if (needUpgradeVerver.Count > 0) then
|
||||
if (progressCallback ~= nil) then
|
||||
progressCallback(needUpgradeVerver.Count, 0)
|
||||
end
|
||||
|
||||
keysList = MapEx.keys2List(needUpgradeVerver)
|
||||
count = keysList.Count
|
||||
key = ""
|
||||
for i = 0, count - 1 do
|
||||
key = keysList[i]
|
||||
CLLVerManager.getVerinfor(key, MapEx.getString(serververVer, key))
|
||||
end
|
||||
keysList:Clear()
|
||||
keysList = nil
|
||||
else
|
||||
CLLVerManager.loadPriorityVer()
|
||||
CLLVerManager.loadOtherResVer(true)
|
||||
end
|
||||
end
|
||||
|
||||
-- 取得版本文件
|
||||
function CLLVerManager.getVerinfor(fPath, verVal)
|
||||
local url = PStr.b():a(baseUrl):a("/"):a(fPath):a("."):a(verVal):e() -- 注意是加了版本号的,可以使用cdn
|
||||
WWWEx.get(url, CLAssetType.bytes, CLLVerManager.onGetVerinfor, CLLVerManager.onGetVerinfor, fPath, true, 2)
|
||||
end
|
||||
|
||||
function CLLVerManager.onGetVerinfor(content, orgs)
|
||||
if (content ~= nil) then
|
||||
local fPath = orgs
|
||||
progress = progress + 1
|
||||
MapEx.set(localverVer, fPath, MapEx.getString(serververVer, fPath))
|
||||
|
||||
local fName = PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(newestVerPath):a("/"):a(fPath):e()
|
||||
if (Path.GetFileName(fName) == "priority.ver") then
|
||||
-- 优先更新需要把所有资源更新完后才记录
|
||||
isNeedUpgradePriority = true
|
||||
serverPriorityVer = CLVerManager.self:toMap(content)
|
||||
else
|
||||
FileEx.CreateDirectory(Path.GetDirectoryName(fName))
|
||||
File.WriteAllBytes(fName, content)
|
||||
end
|
||||
|
||||
MapEx.set(needUpgradeVerver, fPath, true)
|
||||
|
||||
if (progressCallback ~= nil) then
|
||||
progressCallback(needUpgradeVerver.Count, progress)
|
||||
end
|
||||
|
||||
-- if (isFinishAllGet ()) then
|
||||
if (needUpgradeVerver.Count == progress) then
|
||||
if (not isNeedUpgradePriority) then
|
||||
-- 说明没有优先资源需要更新,可以不做其它处理了
|
||||
--同步到本地
|
||||
local ms = MemoryStream()
|
||||
B2OutputStream.writeMap(ms, localverVer)
|
||||
local vpath = PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(mVerverPath):e()
|
||||
FileEx.CreateDirectory(Path.GetDirectoryName(vpath))
|
||||
File.WriteAllBytes(vpath, ms:ToArray())
|
||||
|
||||
CLLVerManager.loadPriorityVer()
|
||||
CLLVerManager.loadOtherResVer(true)
|
||||
else
|
||||
CLLVerManager.checkPriority() --处理优先资源更新
|
||||
end
|
||||
end
|
||||
else
|
||||
CLLVerManager.initFailed()
|
||||
end
|
||||
end
|
||||
|
||||
function CLLVerManager.checkPriority()
|
||||
--取得本地优先更新资源版本信息
|
||||
CLVerManager.self:StartCoroutine(FileEx.readNewAllBytesAsyn(mVerPrioriPath, CLLVerManager.onGetNewPriorityMap))
|
||||
end
|
||||
|
||||
function CLLVerManager.onGetNewPriorityMap(buff)
|
||||
if (buff ~= nil) then
|
||||
localPriorityVer = CLVerManager.self:toMap(buff)
|
||||
else
|
||||
localPriorityVer = Hashtable()
|
||||
end
|
||||
CLVerManager.self.localPriorityVer = localPriorityVer -- 同步到c#
|
||||
|
||||
progress = 0
|
||||
needUpgradeVerver:Clear()
|
||||
needUpgradePrioritis:Clear()
|
||||
local ver = nil
|
||||
local keysList = MapEx.keys2List(serverPriorityVer)
|
||||
local key = nil
|
||||
local count = keysList.Count
|
||||
for i = 0, count - 1 do
|
||||
key = keysList[i]
|
||||
ver = MapEx.getString(localPriorityVer, key)
|
||||
if (ver == nil or ver ~= MapEx.getString(serverPriorityVer, key)) then
|
||||
MapEx.set(needUpgradeVerver, key, false)
|
||||
needUpgradePrioritis:Enqueue(key)
|
||||
end
|
||||
end
|
||||
keysList:Clear()
|
||||
keysList = nil
|
||||
|
||||
if (needUpgradePrioritis.Count > 0) then
|
||||
haveUpgrade = true
|
||||
CLVerManager.self.haveUpgrade = true
|
||||
if (progressCallback ~= nil) then
|
||||
progressCallback(needUpgradeVerver.Count, 0)
|
||||
end
|
||||
CLLVerManager.getPriorityFiles(needUpgradePrioritis:Dequeue())
|
||||
else
|
||||
--同步总的版本管理文件到本地
|
||||
local ms = MemoryStream()
|
||||
B2OutputStream.writeMap(ms, localverVer)
|
||||
local vpath = PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(mVerverPath):e()
|
||||
FileEx.CreateDirectory(Path.GetDirectoryName(vpath))
|
||||
File.WriteAllBytes(vpath, ms:ToArray())
|
||||
|
||||
CLLVerManager.loadOtherResVer(true)
|
||||
end
|
||||
end
|
||||
|
||||
-- 取得优先更新的资源
|
||||
function CLLVerManager.getPriorityFiles(fPath)
|
||||
local Url = ""
|
||||
local verVal = MapEx.getString(serverPriorityVer, fPath)
|
||||
Url = PStr.begin():a(baseUrl):a("/"):a(fPath):a("."):a(verVal):e() -- 把版本号拼在后面
|
||||
-- print("Url==" .. Url);
|
||||
|
||||
WWWEx.get(Url, CLAssetType.bytes, CLLVerManager.onGetPriorityFiles, CLLVerManager.initFailed, fPath, true, 2)
|
||||
|
||||
if (progressCallback ~= nil) then
|
||||
progressCallback(needUpgradeVerver.Count, progress, WWWEx.getWwwByUrl(Url))
|
||||
end
|
||||
end
|
||||
|
||||
function CLLVerManager.onGetPriorityFiles(content, orgs)
|
||||
if (content == nil) then
|
||||
CLLVerManager.initFailed()
|
||||
return
|
||||
end
|
||||
|
||||
local fPath = orgs
|
||||
progress = progress + 1
|
||||
-- 先把文件放在tmp目录,等全部下载好后再移到正式目录
|
||||
local fName = PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(tmpUpgradePirorityPath):a("/"):a(fPath):e()
|
||||
FileEx.CreateDirectory(Path.GetDirectoryName(fName))
|
||||
File.WriteAllBytes(fName, content)
|
||||
|
||||
--同步到本地
|
||||
MapEx.set(localPriorityVer, fPath, MapEx.getString(serverPriorityVer, fPath))
|
||||
MapEx.set(needUpgradeVerver, fPath, true)
|
||||
CLVerManager.self.localPriorityVer = localPriorityVer
|
||||
|
||||
if (progressCallback ~= nil) then
|
||||
progressCallback(needUpgradeVerver.Count, progress)
|
||||
end
|
||||
|
||||
if (needUpgradePrioritis.Count > 0) then
|
||||
CLLVerManager.getPriorityFiles(needUpgradePrioritis:Dequeue())
|
||||
else
|
||||
--已经把所有资源取得完成
|
||||
-- 先把文件放在tmp目录,等全部下载好后再移到正式目录
|
||||
local keysList = MapEx.keys2List(needUpgradeVerver)
|
||||
local count = keysList.Count
|
||||
local key = nil
|
||||
local fromFile = ""
|
||||
local toFile = ""
|
||||
for i = 0, count - 1 do
|
||||
key = keysList[i]
|
||||
fromFile = PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(tmpUpgradePirorityPath):a("/"):a(key):e()
|
||||
toFile = PStr.begin():a(CLPathCfg.persistentDataPath):a("/"):a(key):e()
|
||||
FileEx.CreateDirectory(Path.GetDirectoryName(toFile))
|
||||
File.Copy(fromFile, toFile, true)
|
||||
end
|
||||
Directory.Delete(PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(tmpUpgradePirorityPath):e(), true)
|
||||
keysList:Clear()
|
||||
keysList = nil
|
||||
|
||||
--同步优先资源更新的版本管理文件到本地
|
||||
local ms = MemoryStream()
|
||||
B2OutputStream.writeMap(ms, localPriorityVer)
|
||||
local vpath = PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(mVerPrioriPath):e()
|
||||
FileEx.CreateDirectory(Path.GetDirectoryName(vpath))
|
||||
File.WriteAllBytes(vpath, ms:ToArray())
|
||||
|
||||
--同步总的版本管理文件到本地
|
||||
ms = MemoryStream()
|
||||
B2OutputStream.writeMap(ms, localverVer)
|
||||
vpath = PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(mVerverPath):e()
|
||||
FileEx.CreateDirectory(Path.GetDirectoryName(vpath))
|
||||
File.WriteAllBytes(vpath, ms:ToArray())
|
||||
|
||||
CLLVerManager.loadOtherResVer(true)
|
||||
end
|
||||
end
|
||||
|
||||
function CLLVerManager.loadPriorityVer()
|
||||
CLVerManager.self:StartCoroutine(FileEx.readNewAllBytesAsyn(mVerPrioriPath, CLLVerManager.onGetVerPriority))
|
||||
end
|
||||
|
||||
function CLLVerManager.onGetVerPriority(buff)
|
||||
if (buff ~= nil) then
|
||||
localPriorityVer = CLVerManager.self:toMap(buff)
|
||||
else
|
||||
localPriorityVer = Hashtable()
|
||||
end
|
||||
CLVerManager.self.localPriorityVer = localPriorityVer
|
||||
end
|
||||
|
||||
function CLLVerManager.loadOtherResVer(sucessProcUpgrade)
|
||||
isSucessUpgraded = sucessProcUpgrade
|
||||
CLVerManager.self:StartCoroutine(FileEx.readNewAllBytesAsyn(mVerOtherPath, CLLVerManager.onGetVerOther))
|
||||
end
|
||||
|
||||
function CLLVerManager.onGetVerOther(buff)
|
||||
if (buff ~= nil) then
|
||||
otherResVerOld = CLVerManager.self:toMap(buff)
|
||||
else
|
||||
otherResVerOld = Hashtable()
|
||||
end
|
||||
CLVerManager.self.otherResVerOld = otherResVerOld
|
||||
local path = PStr.b():a(newestVerPath):a("/"):a(mVerOtherPath):e()
|
||||
CLVerManager.self:StartCoroutine(FileEx.readNewAllBytesAsyn(path, CLLVerManager.onGetNewVerOthers))
|
||||
end
|
||||
|
||||
function CLLVerManager.onGetNewVerOthers(buff)
|
||||
if (buff ~= nil) then
|
||||
otherResVerNew = CLVerManager.self:toMap(buff)
|
||||
else
|
||||
otherResVerNew = Hashtable()
|
||||
end
|
||||
CLVerManager.self.otherResVerNew = otherResVerNew
|
||||
|
||||
progressCallback = nil
|
||||
Utl.doCallback(onFinishInit, isSucessUpgraded)
|
||||
end
|
||||
|
||||
function CLLVerManager.initFailed(...)
|
||||
if (progressCallback ~= nil) then
|
||||
progressCallback(needUpgradeVerver.Count, progress, nil)
|
||||
end
|
||||
CLLVerManager.loadPriorityVer()
|
||||
CLLVerManager.loadOtherResVer(false)
|
||||
printw("initFailed")
|
||||
end
|
||||
|
||||
function CLLVerManager.isHaveUpgrade(...)
|
||||
return haveUpgrade
|
||||
end
|
||||
|
||||
return CLLVerManager
|
||||
Reference in New Issue
Block a user