diff --git a/.gitignore b/.gitignore index 96a0611..2418bde 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ Pods/ Country.mmdb +geoip.dat +geosite.dat Carthage ClashX.a ClashX.h @@ -16,4 +18,6 @@ ClashX/goClash/goClash.h ClashX/goClash/goClash.a fastlane/report.xml ClashX/Resources/Country.mmdb.gz +ClashX/Resources/geoip.dat.gz +ClashX/Resources/geosite.dat.gz .bundle/config diff --git a/ClashX.xcodeproj/project.pbxproj b/ClashX.xcodeproj/project.pbxproj index 6a2d23a..d6c2988 100644 --- a/ClashX.xcodeproj/project.pbxproj +++ b/ClashX.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 01B009AE2854533300B93618 /* geoip.dat.gz in Resources */ = {isa = PBXBuildFile; fileRef = 01B009AC2854533200B93618 /* geoip.dat.gz */; }; + 01B009AF2854533300B93618 /* geosite.dat.gz in Resources */ = {isa = PBXBuildFile; fileRef = 01B009AD2854533300B93618 /* geosite.dat.gz */; }; 4913C82321157D0200F6B87C /* Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4913C82221157D0200F6B87C /* Notification.swift */; }; 491E6203258A424D00313AEF /* CommonUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 491E61FD258A424500313AEF /* CommonUtils.m */; }; 49228457270AADE20027A4B6 /* RemoteConfigUpdateIntervalSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49228456270AADE20027A4B6 /* RemoteConfigUpdateIntervalSettingView.swift */; }; @@ -126,6 +128,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 01B009AC2854533200B93618 /* geoip.dat.gz */ = {isa = PBXFileReference; lastKnownFileType = archive.gzip; path = geoip.dat.gz; sourceTree = ""; }; + 01B009AD2854533300B93618 /* geosite.dat.gz */ = {isa = PBXFileReference; lastKnownFileType = archive.gzip; path = geosite.dat.gz; sourceTree = ""; }; 4913C82221157D0200F6B87C /* Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notification.swift; sourceTree = ""; }; 491E61FC258A424500313AEF /* CommonUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonUtils.h; sourceTree = ""; }; 491E61FD258A424500313AEF /* CommonUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommonUtils.m; sourceTree = ""; }; @@ -375,6 +379,8 @@ isa = PBXGroup; children = ( 4929F676258CD89B00A435F6 /* Country.mmdb.gz */, + 01B009AC2854533200B93618 /* geoip.dat.gz */, + 01B009AD2854533300B93618 /* geosite.dat.gz */, 4929F60F258CD22E00A435F6 /* menu_icon@2x.png */, 49761DA621C9497000AE13EF /* dashboard */, 4989F98D20D0AE990001E564 /* sampleConfig.yaml */, @@ -605,12 +611,14 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 01B009AF2854533300B93618 /* geosite.dat.gz in Resources */, 49761DA721C9497000AE13EF /* dashboard in Resources */, 4929F677258CD89B00A435F6 /* Country.mmdb.gz in Resources */, 4981C88B216BAE4A008CC14A /* Localizable.strings in Resources */, 8A2BBEA727A03ACB0081EBEF /* ProxySetting.sdef in Resources */, F9FAB31E262BE04800DE02A6 /* Images.xcassets in Resources */, 495340B020DE5F7200B0D3FF /* StatusItemView.xib in Resources */, + 01B009AE2854533300B93618 /* geoip.dat.gz in Resources */, 49CF3B2820CD7465001EBF94 /* Main.storyboard in Resources */, 499A485A22ED781100F6C675 /* RemoteConfigAddView.xib in Resources */, 4929F610258CD22E00A435F6 /* menu_icon@2x.png in Resources */, diff --git a/ClashX/General/Managers/ClashResourceManager.swift b/ClashX/General/Managers/ClashResourceManager.swift index 6cb9c29..561b840 100644 --- a/ClashX/General/Managers/ClashResourceManager.swift +++ b/ClashX/General/Managers/ClashResourceManager.swift @@ -5,6 +5,12 @@ import Foundation import Gzip class ClashResourceManager { + enum RuleFiles: String { + case mmdb = "Country.mmdb" + case geosite = "geosite.dat" + case geoip = "geoip.dat" + } + static func check() -> Bool { checkConfigDir() checkMMDB() @@ -25,26 +31,39 @@ class ClashResourceManager { } static func checkMMDB() { + checkRule(.mmdb) + checkRule(.geoip) + checkRule(.geosite) + } + + static func checkRule(_ file: RuleFiles) { let fileManage = FileManager.default - let destMMDBPath = "\(kConfigFolderPath)/Country.mmdb" + let destPath = "\(kConfigFolderPath)/\(file.rawValue)" // Remove old mmdb file after version update. - if fileManage.fileExists(atPath: destMMDBPath) { - let vaild = verifyGEOIPDataBase().toBool() + if fileManage.fileExists(atPath: destPath) { let versionChange = AppVersionUtil.hasVersionChanged || AppVersionUtil.isFirstLaunch - let customMMDBSet = !Settings.mmdbDownloadUrl.isEmpty - if !vaild || (versionChange && customMMDBSet) { - try? fileManage.removeItem(atPath: destMMDBPath) + switch file { + case .mmdb: + let vaild = verifyGEOIPDataBase().toBool() + let customMMDBSet = !Settings.mmdbDownloadUrl.isEmpty + if !vaild || (versionChange && customMMDBSet) { + try? fileManage.removeItem(atPath: destPath) + } + case .geosite, .geoip: + if versionChange { + try? fileManage.removeItem(atPath: destPath) + } } } - if !fileManage.fileExists(atPath: destMMDBPath) { - if let mmdbUrl = Bundle.main.url(forResource: "Country.mmdb", withExtension: "gz") { + if !fileManage.fileExists(atPath: destPath) { + if let gzUrl = Bundle.main.url(forResource: file.rawValue, withExtension: "gz") { do { - let data = try Data(contentsOf: mmdbUrl).gunzipped() - try data.write(to: URL(fileURLWithPath: destMMDBPath)) + let data = try Data(contentsOf: gzUrl).gunzipped() + try data.write(to: URL(fileURLWithPath: destPath)) } catch let err { - Logger.log("add mmdb fail:\(err)", level: .error) + Logger.log("add \(file.rawValue) fail:\(err)", level: .error) } } } diff --git a/install_dependency.sh b/install_dependency.sh index a24d630..5a1e542 100755 --- a/install_dependency.sh +++ b/install_dependency.sh @@ -11,12 +11,22 @@ bundle install --jobs 4 bundle exec pod install echo "delete old files" rm -f ./ClashX/Resources/Country.mmdb +rm -f ./ClashX/Resources/geosite.dat +rm -f ./ClashX/Resources/geoip.dat rm -rf ./ClashX/Resources/dashboard rm -f GeoLite2-Country.* echo "install mmdb" curl -LO https://github.com/Dreamacro/maxmind-geoip/releases/latest/download/Country.mmdb gzip Country.mmdb mv Country.mmdb.gz ./ClashX/Resources/Country.mmdb.gz +echo "install geosite" +curl -LO https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat +gzip geosite.dat +mv geosite.dat.gz ./ClashX/Resources/geosite.dat.gz +echo "install geoip" +curl -LO https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat +gzip geoip.dat +mv geoip.dat.gz ./ClashX/Resources/geoip.dat.gz echo "install dashboard" cd ClashX/Resources git clone -b gh-pages https://github.com/MetaCubeX/yacd.git dashboard