Commit 9d7787f2 by macmini

1.0.3

parent 8ae78a13
No preview for this file type
...@@ -61,6 +61,9 @@ ...@@ -61,6 +61,9 @@
9994FDD02C7727D100D70B4E /* earth_HomeViewController+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9994FDCF2C7727D100D70B4E /* earth_HomeViewController+.swift */; }; 9994FDD02C7727D100D70B4E /* earth_HomeViewController+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9994FDCF2C7727D100D70B4E /* earth_HomeViewController+.swift */; };
9994FDD22C772E1400D70B4E /* earth_ShotScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9994FDD12C772E1400D70B4E /* earth_ShotScreenView.swift */; }; 9994FDD22C772E1400D70B4E /* earth_ShotScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9994FDD12C772E1400D70B4E /* earth_ShotScreenView.swift */; };
99A486E82C78201400B5960C /* earth_SearchTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99A486E72C78201400B5960C /* earth_SearchTableViewCell.swift */; }; 99A486E82C78201400B5960C /* earth_SearchTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99A486E72C78201400B5960C /* earth_SearchTableViewCell.swift */; };
99A810202EBAF76600B357DD /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99A8101F2EBAF76000B357DD /* Config.swift */; };
99AB0BE42EBA073000396950 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 99AB0BE32EBA073000396950 /* SnapKit */; };
99AB0BE62EBA08F500396950 /* earth_RateAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99AB0BE52EBA08F500396950 /* earth_RateAlertView.swift */; };
99AEA86D2C7D6BFC00746AC6 /* CATSecurity.m in Sources */ = {isa = PBXBuildFile; fileRef = 99AEA86C2C7D6BFC00746AC6 /* CATSecurity.m */; }; 99AEA86D2C7D6BFC00746AC6 /* CATSecurity.m in Sources */ = {isa = PBXBuildFile; fileRef = 99AEA86C2C7D6BFC00746AC6 /* CATSecurity.m */; };
99B340772C785F1E008B2CF5 /* earth_LoginRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99B340762C785F1E008B2CF5 /* earth_LoginRequest.swift */; }; 99B340772C785F1E008B2CF5 /* earth_LoginRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99B340762C785F1E008B2CF5 /* earth_LoginRequest.swift */; };
99B340792C785FCC008B2CF5 /* earth_UserDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99B340782C785FCC008B2CF5 /* earth_UserDataModel.swift */; }; 99B340792C785FCC008B2CF5 /* earth_UserDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99B340782C785FCC008B2CF5 /* earth_UserDataModel.swift */; };
...@@ -76,6 +79,7 @@ ...@@ -76,6 +79,7 @@
99B8956D2BEDEF0A00039F68 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 99B8956C2BEDEF0600039F68 /* libz.tbd */; }; 99B8956D2BEDEF0A00039F68 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 99B8956C2BEDEF0600039F68 /* libz.tbd */; };
99B8956F2BEDEF1800039F68 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 99B8956E2BEDEF1400039F68 /* libxml2.tbd */; }; 99B8956F2BEDEF1800039F68 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 99B8956E2BEDEF1400039F68 /* libxml2.tbd */; };
99BF66062C7DDB01000C044C /* launch.png in Resources */ = {isa = PBXBuildFile; fileRef = 99BF66052C7DDB01000C044C /* launch.png */; }; 99BF66062C7DDB01000C044C /* launch.png in Resources */ = {isa = PBXBuildFile; fileRef = 99BF66052C7DDB01000C044C /* launch.png */; };
99D2640F2CD314D3000959DE /* earth_APi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99D2640E2CD314C2000959DE /* earth_APi.swift */; };
99DF0DBE2C7EC64400576E52 /* AppDelegate+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99DF0DBD2C7EC64400576E52 /* AppDelegate+.swift */; }; 99DF0DBE2C7EC64400576E52 /* AppDelegate+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99DF0DBD2C7EC64400576E52 /* AppDelegate+.swift */; };
99E2796B2C82CCD6003F65A6 /* earth_TransparentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99E2796A2C82CCD6003F65A6 /* earth_TransparentView.swift */; }; 99E2796B2C82CCD6003F65A6 /* earth_TransparentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99E2796A2C82CCD6003F65A6 /* earth_TransparentView.swift */; };
99E8A9872C758A4F00EA7C64 /* earth_TabButtonsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99E8A9862C758A4F00EA7C64 /* earth_TabButtonsView.swift */; }; 99E8A9872C758A4F00EA7C64 /* earth_TabButtonsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99E8A9862C758A4F00EA7C64 /* earth_TabButtonsView.swift */; };
...@@ -182,6 +186,8 @@ ...@@ -182,6 +186,8 @@
9994FDCF2C7727D100D70B4E /* earth_HomeViewController+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "earth_HomeViewController+.swift"; sourceTree = "<group>"; }; 9994FDCF2C7727D100D70B4E /* earth_HomeViewController+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "earth_HomeViewController+.swift"; sourceTree = "<group>"; };
9994FDD12C772E1400D70B4E /* earth_ShotScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earth_ShotScreenView.swift; sourceTree = "<group>"; }; 9994FDD12C772E1400D70B4E /* earth_ShotScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earth_ShotScreenView.swift; sourceTree = "<group>"; };
99A486E72C78201400B5960C /* earth_SearchTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earth_SearchTableViewCell.swift; sourceTree = "<group>"; }; 99A486E72C78201400B5960C /* earth_SearchTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earth_SearchTableViewCell.swift; sourceTree = "<group>"; };
99A8101F2EBAF76000B357DD /* Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = "<group>"; };
99AB0BE52EBA08F500396950 /* earth_RateAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earth_RateAlertView.swift; sourceTree = "<group>"; };
99AEA86B2C7D6BFC00746AC6 /* CATSecurity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CATSecurity.h; sourceTree = "<group>"; }; 99AEA86B2C7D6BFC00746AC6 /* CATSecurity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CATSecurity.h; sourceTree = "<group>"; };
99AEA86C2C7D6BFC00746AC6 /* CATSecurity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CATSecurity.m; sourceTree = "<group>"; }; 99AEA86C2C7D6BFC00746AC6 /* CATSecurity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CATSecurity.m; sourceTree = "<group>"; };
99B340762C785F1E008B2CF5 /* earth_LoginRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earth_LoginRequest.swift; sourceTree = "<group>"; }; 99B340762C785F1E008B2CF5 /* earth_LoginRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earth_LoginRequest.swift; sourceTree = "<group>"; };
...@@ -198,6 +204,7 @@ ...@@ -198,6 +204,7 @@
99B8956C2BEDEF0600039F68 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; 99B8956C2BEDEF0600039F68 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
99B8956E2BEDEF1400039F68 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = usr/lib/libxml2.tbd; sourceTree = SDKROOT; }; 99B8956E2BEDEF1400039F68 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = usr/lib/libxml2.tbd; sourceTree = SDKROOT; };
99BF66052C7DDB01000C044C /* launch.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = launch.png; sourceTree = "<group>"; }; 99BF66052C7DDB01000C044C /* launch.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = launch.png; sourceTree = "<group>"; };
99D2640E2CD314C2000959DE /* earth_APi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earth_APi.swift; sourceTree = "<group>"; };
99DF0DBD2C7EC64400576E52 /* AppDelegate+.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AppDelegate+.swift"; sourceTree = "<group>"; }; 99DF0DBD2C7EC64400576E52 /* AppDelegate+.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AppDelegate+.swift"; sourceTree = "<group>"; };
99E2796A2C82CCD6003F65A6 /* earth_TransparentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earth_TransparentView.swift; sourceTree = "<group>"; }; 99E2796A2C82CCD6003F65A6 /* earth_TransparentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earth_TransparentView.swift; sourceTree = "<group>"; };
99E8A9862C758A4F00EA7C64 /* earth_TabButtonsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earth_TabButtonsView.swift; sourceTree = "<group>"; }; 99E8A9862C758A4F00EA7C64 /* earth_TabButtonsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = earth_TabButtonsView.swift; sourceTree = "<group>"; };
...@@ -223,6 +230,7 @@ ...@@ -223,6 +230,7 @@
99016F192BEDC3E7005E3EF3 /* libc++.1.tbd in Frameworks */, 99016F192BEDC3E7005E3EF3 /* libc++.1.tbd in Frameworks */,
99B8956D2BEDEF0A00039F68 /* libz.tbd in Frameworks */, 99B8956D2BEDEF0A00039F68 /* libz.tbd in Frameworks */,
E1F1B4DD83381EFCEF75B83F /* Pods_3DEarth.framework in Frameworks */, E1F1B4DD83381EFCEF75B83F /* Pods_3DEarth.framework in Frameworks */,
99AB0BE42EBA073000396950 /* SnapKit in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
...@@ -277,6 +285,7 @@ ...@@ -277,6 +285,7 @@
99016EDA2BEDC2A0005E3EF3 /* 3DEarth */ = { 99016EDA2BEDC2A0005E3EF3 /* 3DEarth */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
99A8101E2EBAF75400B357DD /* Model */,
993B32792C78644200F48062 /* 3DEarth.entitlements */, 993B32792C78644200F48062 /* 3DEarth.entitlements */,
994D94732C74868C001DC921 /* request */, 994D94732C74868C001DC921 /* request */,
994D94592C747BCE001DC921 /* tools */, 994D94592C747BCE001DC921 /* tools */,
...@@ -431,6 +440,7 @@ ...@@ -431,6 +440,7 @@
994D945C2C747C5A001DC921 /* Const.swift */, 994D945C2C747C5A001DC921 /* Const.swift */,
994D945D2C747C5A001DC921 /* DeviceInfo.swift */, 994D945D2C747C5A001DC921 /* DeviceInfo.swift */,
994D945A2C747C5A001DC921 /* vpn_AlertManager.swift */, 994D945A2C747C5A001DC921 /* vpn_AlertManager.swift */,
99AB0BE52EBA08F500396950 /* earth_RateAlertView.swift */,
992FE7B22C7C87E900534040 /* earth_CancelAlertView.swift */, 992FE7B22C7C87E900534040 /* earth_CancelAlertView.swift */,
998916122C7D75190014A78F /* earth_IndicatorView.swift */, 998916122C7D75190014A78F /* earth_IndicatorView.swift */,
994D945B2C747C5A001DC921 /* earth_UserBehaviourManager.swift */, 994D945B2C747C5A001DC921 /* earth_UserBehaviourManager.swift */,
...@@ -459,6 +469,7 @@ ...@@ -459,6 +469,7 @@
994D946C2C7485AE001DC921 /* network */ = { 994D946C2C7485AE001DC921 /* network */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
99D2640E2CD314C2000959DE /* earth_APi.swift */,
994D946D2C7485AE001DC921 /* HTTPRequest.swift */, 994D946D2C7485AE001DC921 /* HTTPRequest.swift */,
994D946E2C7485AE001DC921 /* HTTPClient.swift */, 994D946E2C7485AE001DC921 /* HTTPClient.swift */,
994D946F2C7485AE001DC921 /* HTTPParsable.swift */, 994D946F2C7485AE001DC921 /* HTTPParsable.swift */,
...@@ -469,16 +480,23 @@ ...@@ -469,16 +480,23 @@
994D94732C74868C001DC921 /* request */ = { 994D94732C74868C001DC921 /* request */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
99D264112CD31A33000959DE /* UserBehaviour */,
99D264102CD31A1A000959DE /* BaseModel */,
993B327D2C786F8500F48062 /* collectionrequest */, 993B327D2C786F8500F48062 /* collectionrequest */,
993B327A2C786E3100F48062 /* signrequest */, 993B327A2C786E3100F48062 /* signrequest */,
99B340752C785EE5008B2CF5 /* loginrequest */, 99B340752C785EE5008B2CF5 /* loginrequest */,
994D94762C748803001DC921 /* UserBehaviourModel.swift */,
994D94742C74871D001DC921 /* UserBehaviourRequest.swift */,
993B32802C7870A400F48062 /* BaseModel.swift */,
); );
path = request; path = request;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
99A8101E2EBAF75400B357DD /* Model */ = {
isa = PBXGroup;
children = (
99A8101F2EBAF76000B357DD /* Config.swift */,
);
path = Model;
sourceTree = "<group>";
};
99AEA86A2C7D6BFC00746AC6 /* CATSecurity */ = { 99AEA86A2C7D6BFC00746AC6 /* CATSecurity */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
...@@ -525,6 +543,23 @@ ...@@ -525,6 +543,23 @@
path = signList; path = signList;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
99D264102CD31A1A000959DE /* BaseModel */ = {
isa = PBXGroup;
children = (
993B32802C7870A400F48062 /* BaseModel.swift */,
);
path = BaseModel;
sourceTree = "<group>";
};
99D264112CD31A33000959DE /* UserBehaviour */ = {
isa = PBXGroup;
children = (
994D94762C748803001DC921 /* UserBehaviourModel.swift */,
994D94742C74871D001DC921 /* UserBehaviourRequest.swift */,
);
path = UserBehaviour;
sourceTree = "<group>";
};
99E8A9882C758F3F00EA7C64 /* footmark */ = { 99E8A9882C758F3F00EA7C64 /* footmark */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
...@@ -610,7 +645,7 @@ ...@@ -610,7 +645,7 @@
attributes = { attributes = {
BuildIndependentTargetsInParallel = 1; BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1520; LastSwiftUpdateCheck = 1520;
LastUpgradeCheck = 1520; LastUpgradeCheck = 1600;
TargetAttributes = { TargetAttributes = {
99016ED72BEDC2A0005E3EF3 = { 99016ED72BEDC2A0005E3EF3 = {
CreatedOnToolsVersion = 15.2; CreatedOnToolsVersion = 15.2;
...@@ -635,6 +670,9 @@ ...@@ -635,6 +670,9 @@
"zh-Hans", "zh-Hans",
); );
mainGroup = 99016ECF2BEDC2A0005E3EF3; mainGroup = 99016ECF2BEDC2A0005E3EF3;
packageReferences = (
99AB0BE22EBA073000396950 /* XCRemoteSwiftPackageReference "SnapKit" */,
);
productRefGroup = 99016ED92BEDC2A0005E3EF3 /* Products */; productRefGroup = 99016ED92BEDC2A0005E3EF3 /* Products */;
projectDirPath = ""; projectDirPath = "";
projectRoot = ""; projectRoot = "";
...@@ -724,6 +762,8 @@ ...@@ -724,6 +762,8 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
99B58E682C75C16E00542649 /* earth_LayerViewController.swift in Sources */, 99B58E682C75C16E00542649 /* earth_LayerViewController.swift in Sources */,
99D2640F2CD314D3000959DE /* earth_APi.swift in Sources */,
99AB0BE62EBA08F500396950 /* earth_RateAlertView.swift in Sources */,
992FE7A72C7C4B7800534040 /* earth_SignListModel.swift in Sources */, 992FE7A72C7C4B7800534040 /* earth_SignListModel.swift in Sources */,
99B58E6A2C75C3AD00542649 /* earth_LayerCollectionViewCell.swift in Sources */, 99B58E6A2C75C3AD00542649 /* earth_LayerCollectionViewCell.swift in Sources */,
994D94522C747B70001DC921 /* String+Extension.swift in Sources */, 994D94522C747B70001DC921 /* String+Extension.swift in Sources */,
...@@ -764,6 +804,7 @@ ...@@ -764,6 +804,7 @@
99E2796B2C82CCD6003F65A6 /* earth_TransparentView.swift in Sources */, 99E2796B2C82CCD6003F65A6 /* earth_TransparentView.swift in Sources */,
99016EDC2BEDC2A0005E3EF3 /* AppDelegate.swift in Sources */, 99016EDC2BEDC2A0005E3EF3 /* AppDelegate.swift in Sources */,
99E8A9912C75AFCF00EA7C64 /* earth_MineTableViewCell.swift in Sources */, 99E8A9912C75AFCF00EA7C64 /* earth_MineTableViewCell.swift in Sources */,
99A810202EBAF76600B357DD /* Config.swift in Sources */,
993B32812C7870A400F48062 /* BaseModel.swift in Sources */, 993B32812C7870A400F48062 /* BaseModel.swift in Sources */,
994D943F2C745DBC001DC921 /* BaseViewController.swift in Sources */, 994D943F2C745DBC001DC921 /* BaseViewController.swift in Sources */,
9994FDCE2C77120700D70B4E /* earth_AltitudeView.swift in Sources */, 9994FDCE2C77120700D70B4E /* earth_AltitudeView.swift in Sources */,
...@@ -985,7 +1026,7 @@ ...@@ -985,7 +1026,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = 3DEarth/3DEarth.entitlements; CODE_SIGN_ENTITLEMENTS = 3DEarth/3DEarth.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1.1; CURRENT_PROJECT_VERSION = 1.0;
DEVELOPMENT_TEAM = VJ9R5T686C; DEVELOPMENT_TEAM = VJ9R5T686C;
ENABLE_USER_SCRIPT_SANDBOXING = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO;
EXCLUDED_ARCHS = ""; EXCLUDED_ARCHS = "";
...@@ -1012,7 +1053,7 @@ ...@@ -1012,7 +1053,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.1; MARKETING_VERSION = 1.0.3;
PRODUCT_BUNDLE_IDENTIFIER = com.yhgc.3DEarth; PRODUCT_BUNDLE_IDENTIFIER = com.yhgc.3DEarth;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
...@@ -1034,7 +1075,7 @@ ...@@ -1034,7 +1075,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = 3DEarth/3DEarth.entitlements; CODE_SIGN_ENTITLEMENTS = 3DEarth/3DEarth.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1.1; CURRENT_PROJECT_VERSION = 1.0;
DEVELOPMENT_TEAM = VJ9R5T686C; DEVELOPMENT_TEAM = VJ9R5T686C;
ENABLE_USER_SCRIPT_SANDBOXING = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO;
EXCLUDED_ARCHS = ""; EXCLUDED_ARCHS = "";
...@@ -1061,7 +1102,7 @@ ...@@ -1061,7 +1102,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.1; MARKETING_VERSION = 1.0.3;
PRODUCT_BUNDLE_IDENTIFIER = com.yhgc.3DEarth; PRODUCT_BUNDLE_IDENTIFIER = com.yhgc.3DEarth;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
...@@ -1078,7 +1119,6 @@ ...@@ -1078,7 +1119,6 @@
99016F062BEDC2A3005E3EF3 /* Debug */ = { 99016F062BEDC2A3005E3EF3 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
...@@ -1098,7 +1138,6 @@ ...@@ -1098,7 +1138,6 @@
99016F072BEDC2A3005E3EF3 /* Release */ = { 99016F072BEDC2A3005E3EF3 /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
...@@ -1118,7 +1157,6 @@ ...@@ -1118,7 +1157,6 @@
99016F092BEDC2A3005E3EF3 /* Debug */ = { 99016F092BEDC2A3005E3EF3 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = VJ9R5T686C; DEVELOPMENT_TEAM = VJ9R5T686C;
...@@ -1136,7 +1174,6 @@ ...@@ -1136,7 +1174,6 @@
99016F0A2BEDC2A3005E3EF3 /* Release */ = { 99016F0A2BEDC2A3005E3EF3 /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = VJ9R5T686C; DEVELOPMENT_TEAM = VJ9R5T686C;
...@@ -1191,6 +1228,25 @@ ...@@ -1191,6 +1228,25 @@
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
/* End XCConfigurationList section */ /* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
99AB0BE22EBA073000396950 /* XCRemoteSwiftPackageReference "SnapKit" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/SnapKit/SnapKit.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 5.7.1;
};
};
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
99AB0BE32EBA073000396950 /* SnapKit */ = {
isa = XCSwiftPackageProductDependency;
package = 99AB0BE22EBA073000396950 /* XCRemoteSwiftPackageReference "SnapKit" */;
productName = SnapKit;
};
/* End XCSwiftPackageProductDependency section */
}; };
rootObject = 99016ED02BEDC2A0005E3EF3 /* Project object */; rootObject = 99016ED02BEDC2A0005E3EF3 /* Project object */;
} }
{
"originHash" : "dd27728c8848101841bd8d45243ef43144e233aa3767c82656934b73447347b8",
"pins" : [
{
"identity" : "snapkit",
"kind" : "remoteSourceControl",
"location" : "https://github.com/SnapKit/SnapKit.git",
"state" : {
"revision" : "2842e6e84e82eb9a8dac0100ca90d9444b0307f4",
"version" : "5.7.1"
}
}
],
"version" : 3
}
...@@ -16,5 +16,21 @@ ...@@ -16,5 +16,21 @@
stopOnStyle = "0"> stopOnStyle = "0">
</BreakpointContent> </BreakpointContent>
</BreakpointProxy> </BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "ECC5E2A4-0867-4161-9695-9E1FB8B75F23"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "3DEarth/Controllers/home/earth_HomeViewController+.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "45"
endingLineNumber = "45"
landmarkName = "collection()"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
</Breakpoints> </Breakpoints>
</Bucket> </Bucket>
...@@ -15,7 +15,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -15,7 +15,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow? var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let geocoder = Geocoder(accessToken: "pk.eyJ1IjoibnpoeTI1MTMiLCJhIjoiY20wZW12bHFmMG90ZzJyc2QzejF1d3N0eCJ9.oomjYAEM21EJuZj0Kh1xZw") _ = Geocoder(accessToken: "pk.eyJ1IjoibnpoeTI1MTMiLCJhIjoiY20wZW12bHFmMG90ZzJyc2QzejF1d3N0eCJ9.oomjYAEM21EJuZj0Kh1xZw")
earth_UserBehaviourManager.shared.setUp() earth_UserBehaviourManager.shared.setUp()
let vc = earth_HomeViewController() let vc = earth_HomeViewController()
......
{
"images" : [
{
"filename" : "biaoqing.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "biaoqing@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "biaoqing@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
...@@ -8,33 +8,42 @@ ...@@ -8,33 +8,42 @@
import UIKit import UIKit
import Alamofire import Alamofire
typealias NetAction = () -> () //typealias NetAction = () -> ()
class BaseViewController: UIViewController { class BaseViewController: UIViewController {
var action : NetAction! // var action : NetAction!
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
view.backgroundColor = .white view.backgroundColor = .white
self.navigationItem.backButtonTitle = "" self.navigationItem.backButtonTitle = ""
check()
} }
//检查网络 //检查网络
func check(){ func check(complation: @escaping (Bool) -> ()){
NetworkReachabilityManager.default?.startListening(onUpdatePerforming: { [self] status in NetworkReachabilityManager.default?.startListening(onUpdatePerforming: { [self] status in
if status == .reachable(.cellular) || status == .reachable(.ethernetOrWiFi){ if status == .reachable(.cellular) || status == .reachable(.ethernetOrWiFi){
if action != nil { complation(true)
action()
}
} }
else { else {
self.check() complation(false)
} }
}) })
} }
func fetchConfig(complation: @escaping (Bool) -> ()){
let client = AlamofireClient()
client.config { config in
if let appconfig = config , appconfig.isSuccess {
// 检查pub数组中是否有event为"app_evaluate"且chance为"1"的项
let hasEvaluate = appconfig.pub.contains { item in
item.event == "app_evaluate" && item.chance == "1"
}
complation(hasEvaluate)
}
}
}
} }
...@@ -9,6 +9,7 @@ import UIKit ...@@ -9,6 +9,7 @@ import UIKit
class earth_CancelViewController: BaseViewController { class earth_CancelViewController: BaseViewController {
//MARK: - 生命周期
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
view.addSubview(noticeLabel) view.addSubview(noticeLabel)
...@@ -45,6 +46,7 @@ class earth_CancelViewController: BaseViewController { ...@@ -45,6 +46,7 @@ class earth_CancelViewController: BaseViewController {
} }
//MARK: - 懒加载
let noticeLabel: UILabel = { let noticeLabel: UILabel = {
let noticeLabel = UILabel() let noticeLabel = UILabel()
noticeLabel.text = "注销须知:\n帐号注销不可逆,一旦注销将不可恢复,请谨慎操作!" noticeLabel.text = "注销须知:\n帐号注销不可逆,一旦注销将不可恢复,请谨慎操作!"
...@@ -64,9 +66,9 @@ class earth_CancelViewController: BaseViewController { ...@@ -64,9 +66,9 @@ class earth_CancelViewController: BaseViewController {
return deleteButton return deleteButton
}() }()
//MARK: - 方法
@objc private func buttonClicked(sender:UIButton) { @objc private func buttonClicked(sender:UIButton) {
vpn_AlertManager.shared.showCancelView(title: localstring("注销后所有数据将清空\n是否继续?")) { s, earth_CancelAlertView in vpn_AlertManager.shared.showCancelView(title: localstring("注销后所有数据将清空\n是否继续?")) { s, earth_CancelAlertView in
} }
} }
......
//
// earth_LayerCollectionViewCell.swift
// 3DEarth
//
// Created by 研发2组 on 2024/8/21.
//
import UIKit import UIKit
...@@ -12,6 +6,8 @@ class earth_LayerCollectionViewCell: UICollectionViewCell { ...@@ -12,6 +6,8 @@ class earth_LayerCollectionViewCell: UICollectionViewCell {
private var sel : UIImageView = UIImageView(image: UIImage(named: "choose")) private var sel : UIImageView = UIImageView(image: UIImage(named: "choose"))
private var titleLb: UILabel = UILabel() private var titleLb: UILabel = UILabel()
//MARK: - 初始化
override init(frame: CGRect) { override init(frame: CGRect) {
super.init(frame: frame) super.init(frame: frame)
creatUI() creatUI()
......
// /*
// earth_LayerViewController.swift * 图层
// 3DEarth */
//
// Created by 研发2组 on 2024/8/21.
//
import UIKit import UIKit
class earth_LayerViewController: BaseViewController ,UICollectionViewDelegate ,UICollectionViewDataSource{ class earth_LayerViewController: BaseViewController ,UICollectionViewDelegate ,UICollectionViewDataSource{
var data = [["title":"标准地图","img":"map_nor","sel":ismorenmap()],["title":"卫星地图","img":"map_weixing","sel":!ismorenmap()]] var data = [["title":"标准地图","img":"map_nor","sel":ismorenmap()],["title":"卫星地图","img":"map_weixing","sel":!ismorenmap()]]
//MARK: - 生命周期
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
view.addSubview(collectionView) view.addSubview(collectionView)
...@@ -36,30 +33,22 @@ class earth_LayerViewController: BaseViewController ,UICollectionViewDelegate ,U ...@@ -36,30 +33,22 @@ class earth_LayerViewController: BaseViewController ,UICollectionViewDelegate ,U
}() }()
} }
/*
* 代理
*/
extension earth_LayerViewController{ extension earth_LayerViewController{
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return data.count return data.count
} }
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! earth_LayerCollectionViewCell let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! earth_LayerCollectionViewCell
cell.setData(data[indexPath.item]) cell.setData(data[indexPath.item])
return cell return cell
} }
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
UserDefaults.standard.setValue((indexPath.item == 0) ? true : false, forKey: "morenmap")
if indexPath.item == 0 {
UserDefaults.standard.setValue(true, forKey: "morenmap")
}
if indexPath.item == 1 {
UserDefaults.standard.setValue(false, forKey: "morenmap")
}
data = [["title":"标准地图","img":"map_nor","sel":ismorenmap()],["title":"卫星地图","img":"map_weixing","sel":!ismorenmap()]] data = [["title":"标准地图","img":"map_nor","sel":ismorenmap()],["title":"卫星地图","img":"map_weixing","sel":!ismorenmap()]]
collectionView.reloadData() collectionView.reloadData()
......
// /*
// earth_FootmarkButtonViewController.swift * 足迹页面
// 3DEarth */
//
// Created by 研发2组 on 2024/8/21.
//
import UIKit import UIKit
import MapboxMaps import MapboxMaps
import MapboxGeocoder.Swift import MapboxGeocoder.Swift
...@@ -87,6 +83,7 @@ class earth_FootmarkButtonViewController: BaseViewController,CLLocationManagerDe ...@@ -87,6 +83,7 @@ class earth_FootmarkButtonViewController: BaseViewController,CLLocationManagerDe
self.navigationController?.isNavigationBarHidden = false self.navigationController?.isNavigationBarHidden = false
} }
//MARK: - 懒加载
let backButton: UIButton = { let backButton: UIButton = {
let btn = UIButton() let btn = UIButton()
btn.setImage(UIImage(named: "sign_back"), for: .normal) btn.setImage(UIImage(named: "sign_back"), for: .normal)
...@@ -130,25 +127,32 @@ class earth_FootmarkButtonViewController: BaseViewController,CLLocationManagerDe ...@@ -130,25 +127,32 @@ class earth_FootmarkButtonViewController: BaseViewController,CLLocationManagerDe
return btn return btn
}() }()
@objc private func recordClicked(sender:UIButton) { }
let vc = earth_SignListViewController.init()
vc.title = localstring("签到记录")
vc.data = self.list
self.navigationController?.pushViewController(vc, animated: true)
}
@objc private func backClicked(sender:UIButton) {
self.navigationController?.popToRootViewController(animated: true)
}
@objc private func layerClicked(sender:UIButton) { /*
let vc = earth_LayerViewController.init() * 网络接口逻辑
vc.title = localstring("图层") */
self.navigationController?.pushViewController(vc, animated: true) extension earth_FootmarkButtonViewController {
func getList(){
clearAnnotationsAndPolylines(mapView: mapView)
if (checkIsLogin()){
let client = AlamofireClient()
let token = usertoken()
let chk = String.getChkStringWithToken( token,"")!
let urlRequest = earth_SignListRequest(parameters: ["ddIdentityTokenParam": token,"ddPackageNameParam":bundleID,"chk":chk])
client.send(urlRequest) { [self]
data, error in
if error != nil {return}
self.list = data?.data
if self.list.count > 0 {
addAnnotationsAndPolyline()
}
}
}
} }
@objc private func signButtonClicked(sender:UIButton) { @objc func signButtonClicked(sender:UIButton) {
if address == "" { if address == "" {
print("地址不能为空") print("地址不能为空")
return return
...@@ -167,6 +171,7 @@ class earth_FootmarkButtonViewController: BaseViewController,CLLocationManagerDe ...@@ -167,6 +171,7 @@ class earth_FootmarkButtonViewController: BaseViewController,CLLocationManagerDe
print("签到成功") print("签到成功")
if user?.code == 1 { if user?.code == 1 {
vpn_AlertManager.shared.showTip(tipString: localstring("签到成功")) vpn_AlertManager.shared.showTip(tipString: localstring("签到成功"))
getList()
} }
} }
...@@ -175,8 +180,71 @@ class earth_FootmarkButtonViewController: BaseViewController,CLLocationManagerDe ...@@ -175,8 +180,71 @@ class earth_FootmarkButtonViewController: BaseViewController,CLLocationManagerDe
} }
} }
}
/*
* 代理
*/
extension earth_FootmarkButtonViewController {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
let userCoordinate = location.coordinate
print("用户当前位置:纬度 \(userCoordinate.latitude),经度 \(userCoordinate.longitude)")
let options = ReverseGeocodeOptions(coordinate: userCoordinate)
options.focalLocation = CLLocation(latitude: userCoordinate.latitude, longitude: userCoordinate.longitude)
let task = geocoder.geocode(options) { [self] (placemarks, attribution, error) in
guard let placemark = placemarks?.first else {
return
}
print(placemark.qualifiedName)
address = placemark.qualifiedName!
}
userLoc(locationManager: locationManager)
locationManager.stopUpdatingLocation()
}
@objc private func locationClicked(sender:UIButton) { func appleLocationProvider(_ locationProvider: MapboxMaps.AppleLocationProvider, didFailWithError error: Error) {
}
func appleLocationProviderShouldDisplayHeadingCalibration(_ locationProvider: MapboxMaps.AppleLocationProvider) -> Bool {
return true
}
func appleLocationProvider(_ locationProvider: MapboxMaps.AppleLocationProvider, didChangeAccuracyAuthorization accuracyAuthorization: CLAccuracyAuthorization) {
}
}
extension earth_FootmarkButtonViewController{
func setupLocationManager() {
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
}
@objc func recordClicked(sender:UIButton) {
let vc = earth_SignListViewController.init()
vc.title = localstring("签到记录")
vc.data = self.list
self.navigationController?.pushViewController(vc, animated: true)
}
@objc func backClicked(sender:UIButton) {
self.navigationController?.popToRootViewController(animated: true)
}
@objc func layerClicked(sender:UIButton) {
let vc = earth_LayerViewController.init()
vc.title = localstring("图层")
self.navigationController?.pushViewController(vc, animated: true)
}
@objc func locationClicked(sender:UIButton) {
locationManager.startUpdatingLocation() locationManager.startUpdatingLocation()
} }
...@@ -189,23 +257,6 @@ class earth_FootmarkButtonViewController: BaseViewController,CLLocationManagerDe ...@@ -189,23 +257,6 @@ class earth_FootmarkButtonViewController: BaseViewController,CLLocationManagerDe
} }
} }
func getList(){
if (checkIsLogin()){
let client = AlamofireClient()
let token = usertoken()
let chk = String.getChkStringWithToken( token,"")!
let urlRequest = earth_SignListRequest(parameters: ["ddIdentityTokenParam": token,"ddPackageNameParam":bundleID,"chk":chk])
client.send(urlRequest) { [self]
data, error in
if error != nil {return}
self.list = data?.data
if self.list.count > 0 {
addAnnotationsAndPolyline()
}
}
}
}
func userLoc(locationManager:CLLocationManager){ func userLoc(locationManager:CLLocationManager){
guard let location = locationManager.location else { guard let location = locationManager.location else {
print("用户位置或朝向不可用") print("用户位置或朝向不可用")
...@@ -251,43 +302,20 @@ class earth_FootmarkButtonViewController: BaseViewController,CLLocationManagerDe ...@@ -251,43 +302,20 @@ class earth_FootmarkButtonViewController: BaseViewController,CLLocationManagerDe
polylineAnnotationManager.annotations = [polylineAnnotation] polylineAnnotationManager.annotations = [polylineAnnotation]
} }
} }
}
extension earth_FootmarkButtonViewController { func clearAnnotationsAndPolylines(mapView: MapView) {
func setupLocationManager() { // 获取所有的 PointAnnotationManager,并清空它们的标记点
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
let userCoordinate = location.coordinate
print("用户当前位置:纬度 \(userCoordinate.latitude),经度 \(userCoordinate.longitude)")
let options = ReverseGeocodeOptions(coordinate: userCoordinate)
options.focalLocation = CLLocation(latitude: userCoordinate.latitude, longitude: userCoordinate.longitude)
let task = geocoder.geocode(options) { [self] (placemarks, attribution, error) in
guard let placemark = placemarks?.first else {
return
}
print(placemark.qualifiedName)
address = placemark.qualifiedName! // 获取 PointAnnotationManager
} let annotationManager = mapView.annotations.makePointAnnotationManager()
userLoc(locationManager: locationManager) // 清除所有标记点
locationManager.stopUpdatingLocation() annotationManager.annotations = []
} // 获取 PolylineAnnotationManager
let polylineAnnotationManager = mapView.annotations.makePolylineAnnotationManager()
// 清除所有折线
func appleLocationProvider(_ locationProvider: MapboxMaps.AppleLocationProvider, didFailWithError error: Error) { polylineAnnotationManager.annotations = []
// 重新加载地图视图以确保更改生效
mapView.reloadInputViews()
}
func appleLocationProviderShouldDisplayHeadingCalibration(_ locationProvider: MapboxMaps.AppleLocationProvider) -> Bool {
return true
} }
func appleLocationProvider(_ locationProvider: MapboxMaps.AppleLocationProvider, didChangeAccuracyAuthorization accuracyAuthorization: CLAccuracyAuthorization) {
}
} }
...@@ -123,6 +123,7 @@ class earth_EarthView: UIView ,AppleLocationProviderDelegate{ ...@@ -123,6 +123,7 @@ class earth_EarthView: UIView ,AppleLocationProviderDelegate{
let task = geocoder.geocode(options) { [self] (placemarks, attribution, error) in let task = geocoder.geocode(options) { [self] (placemarks, attribution, error) in
guard let placemark = placemarks?.first else { guard let placemark = placemarks?.first else {
completion("",String((centerCoordinate.latitude)),String((centerCoordinate.longitude)))
return return
} }
print(placemark.qualifiedName) print(placemark.qualifiedName)
......
...@@ -35,9 +35,9 @@ extension earth_HomeViewController{ ...@@ -35,9 +35,9 @@ extension earth_HomeViewController{
let chk = String.getChkStringWithToken( token,"\(longitude)\(latitude)\(address)")! let chk = String.getChkStringWithToken( token,"\(longitude)\(latitude)\(address)")!
let urlRequest = earth_CollectionRequest(parameters: ["ddIdentityTokenParam": token,"ddPackageNameParam":bundleID,"ddLongitudeParam":longitude,"ddLatitudeParam":latitude,"ddAddressParam":address,"chk":chk]) let urlRequest = earth_CollectionRequest(parameters: ["ddIdentityTokenParam": token,"ddPackageNameParam":bundleID,"ddLongitudeParam":longitude,"ddLatitudeParam":latitude,"ddAddressParam":address,"chk":chk])
client.send(urlRequest) { client.send(urlRequest) {
user, error in res, error in
if error != nil {return} if error != nil {return}
if user?.code == 1 { if res?.code == 1 {
vpn_AlertManager.shared.showTip(tipString: localstring("收藏成功")) vpn_AlertManager.shared.showTip(tipString: localstring("收藏成功"))
} }
} }
...@@ -71,9 +71,7 @@ extension earth_HomeViewController{ ...@@ -71,9 +71,7 @@ extension earth_HomeViewController{
return screenshot return screenshot
} }
@objc func locationClicked(sender:UIButton) { @objc func locationClicked(sender:UIButton) {
earthView.userLoc(locationManager: locationManager,isfirst: false) earthView.userLoc(locationManager: locationManager,isfirst: false)
} }
...@@ -89,34 +87,6 @@ extension earth_HomeViewController{ ...@@ -89,34 +87,6 @@ extension earth_HomeViewController{
} }
} }
func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
let heading = newHeading.trueHeading > 0 ? newHeading.trueHeading : newHeading.magneticHeading
let angle = CGFloat(heading) * .pi / 180.0
UIView.animate(withDuration: 0.5) {
self.compass.transform = CGAffineTransform(rotationAngle: -angle)
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.last {
let altitude = location.altitude
altitudeView.numlabel.text = String(Int(altitude)) + localstring("米")
locationManager.stopUpdatingLocation()
earthView.userLoc(locationManager: locationManager)
}
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedWhenInUse || status == .authorizedAlways {
locationManager.startUpdatingLocation()
locationManager.startUpdatingHeading()
} else {
print("用户未授权位置访问")
}
}
// 保存结果处理方法 // 保存结果处理方法
@objc func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) { @objc func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
if let error = error { if let error = error {
...@@ -153,3 +123,37 @@ extension earth_HomeViewController{ ...@@ -153,3 +123,37 @@ extension earth_HomeViewController{
self.present(activityViewController, animated: true, completion: nil) self.present(activityViewController, animated: true, completion: nil)
} }
} }
/*
* 代理
*/
extension earth_HomeViewController{
func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
let heading = newHeading.trueHeading > 0 ? newHeading.trueHeading : newHeading.magneticHeading
let angle = CGFloat(heading) * .pi / 180.0
UIView.animate(withDuration: 0.5) {
self.compass.transform = CGAffineTransform(rotationAngle: -angle)
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.last {
let altitude = location.altitude
altitudeView.numlabel.text = String(Int(altitude)) + localstring("米")
locationManager.stopUpdatingLocation()
earthView.userLoc(locationManager: locationManager)
}
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedWhenInUse || status == .authorizedAlways {
locationManager.startUpdatingLocation()
locationManager.startUpdatingHeading()
} else {
print("用户未授权位置访问")
}
}
}
// /*
// earth_HomeViewController.swift * 首页
// 3DEarth */
//
// Created by 研发2组 on 2024/8/20.
//
import UIKit import UIKit
import CoreLocation import CoreLocation
import StoreKit
class earth_HomeViewController: BaseViewController ,CLLocationManagerDelegate{ class earth_HomeViewController: BaseViewController ,CLLocationManagerDelegate{
let locationManager = CLLocationManager() let locationManager = CLLocationManager()
var viewsAreHidden = false var viewsAreHidden = false
//MARK: - 生命周期
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
view.addSubview(earthView) view.addSubview(earthView)
earthView.frame = self.view.bounds earthView.frame = self.view.bounds
...@@ -63,14 +60,14 @@ class earth_HomeViewController: BaseViewController ,CLLocationManagerDelegate{ ...@@ -63,14 +60,14 @@ class earth_HomeViewController: BaseViewController ,CLLocationManagerDelegate{
vpn_AlertManager.shared.showShotScreen(image: screenshot) { [self] s in vpn_AlertManager.shared.showShotScreen(image: screenshot) { [self] s in
if s == 1 { if s == 1 {
//保存图片
UIImageWriteToSavedPhotosAlbum(screenshot, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil) UIImageWriteToSavedPhotosAlbum(screenshot, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
} }
if s == 2 { if s == 2 {
//分享
shareContent(screenshot:screenshot) shareContent(screenshot:screenshot)
} }
} }
} }
} }
...@@ -85,10 +82,12 @@ class earth_HomeViewController: BaseViewController ,CLLocationManagerDelegate{ ...@@ -85,10 +82,12 @@ class earth_HomeViewController: BaseViewController ,CLLocationManagerDelegate{
tabView.y = view.height - tabView.height - 80 tabView.y = view.height - tabView.height - 80
tabView.tabClickAction = { [self] (index) ->() in tabView.tabClickAction = { [self] (index) ->() in
if index == 1 { if index == 1 {
//足迹
let vc = earth_FootmarkButtonViewController.init() let vc = earth_FootmarkButtonViewController.init()
self.navigationController?.pushViewController(vc, animated: true) self.navigationController?.pushViewController(vc, animated: true)
} }
if index == 2 { if index == 2 {
//我的
let vc = earth_MineViewController.init() let vc = earth_MineViewController.init()
self.navigationController?.pushViewController(vc, animated: true) self.navigationController?.pushViewController(vc, animated: true)
vc.collectionsaction = { m in vc.collectionsaction = { m in
...@@ -101,8 +100,6 @@ class earth_HomeViewController: BaseViewController ,CLLocationManagerDelegate{ ...@@ -101,8 +100,6 @@ class earth_HomeViewController: BaseViewController ,CLLocationManagerDelegate{
searchButton.addTarget(self, action: #selector(searchClicked), for: .touchUpInside) searchButton.addTarget(self, action: #selector(searchClicked), for: .touchUpInside)
locationButton.addTarget(self, action: #selector(locationClicked), for: .touchUpInside) locationButton.addTarget(self, action: #selector(locationClicked), for: .touchUpInside)
earthView.action = { [self] in earthView.action = { [self] in
viewsAreHidden = !viewsAreHidden viewsAreHidden = !viewsAreHidden
...@@ -128,8 +125,19 @@ class earth_HomeViewController: BaseViewController ,CLLocationManagerDelegate{ ...@@ -128,8 +125,19 @@ class earth_HomeViewController: BaseViewController ,CLLocationManagerDelegate{
self.tabView.y = self.view.height - self.tabView.height - 80 self.tabView.y = self.view.height - self.tabView.height - 80
} }
} }
}
self.check { isSuccess in
self.fetchConfig { success in
if success {
// 显示评价弹窗前的判断
self.showRateAlert()
}
}
} }
} }
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {
...@@ -143,6 +151,7 @@ class earth_HomeViewController: BaseViewController ,CLLocationManagerDelegate{ ...@@ -143,6 +151,7 @@ class earth_HomeViewController: BaseViewController ,CLLocationManagerDelegate{
super.viewWillDisappear(animated) super.viewWillDisappear(animated)
self.navigationController?.isNavigationBarHidden = false self.navigationController?.isNavigationBarHidden = false
} }
//MARK: - 懒加载 //MARK: - 懒加载
let earthView: earth_EarthView = { let earthView: earth_EarthView = {
let earthView = earth_EarthView.init() let earthView = earth_EarthView.init()
...@@ -201,4 +210,56 @@ class earth_HomeViewController: BaseViewController ,CLLocationManagerDelegate{ ...@@ -201,4 +210,56 @@ class earth_HomeViewController: BaseViewController ,CLLocationManagerDelegate{
return transparentView return transparentView
}() }()
}
extension earth_HomeViewController{
// MARK: - 评价弹窗相关方法
/// 显示评价弹窗(带判断逻辑)
private func showRateAlert() {
// 检查是否已经显示过评价弹窗
if UserDefaults.standard.bool(forKey: "eva_isshowed") {
return
}
executeMethodOnSecondDay()
}
/// 执行第二天的方法(显示评价弹窗)
private func executeMethodOnSecondDay() {
// 显示评价弹窗
vpn_AlertManager.shared.showRateAlert { [weak self] tag, alertView in
guard let self = self else { return }
if tag == 1 {
// 用户点击了"拒绝评价"
print("拒绝评价")
// 标记已显示过,避免再次显示
UserDefaults.standard.set(true, forKey: "eva_isshowed")
UserDefaults.standard.synchronize()
} else if tag == 2 {
// 用户点击了"马上评价"
print("马上评价")
// 标记已显示过,避免再次显示
UserDefaults.standard.set(true, forKey: "eva_isshowed")
UserDefaults.standard.synchronize()
// 可以在这里跳转到App Store评价页面
self.openAppStoreForRating()
}
}
}
/// 显示系统原生评价弹窗
private func openAppStoreForRating() {
// 检查 SKStoreReviewController 是否可用(iOS 10.3+)
if #available(iOS 10.3, *) {
// 收起键盘
UIApplication.shared.keyWindow?.endEditing(true)
// 显示系统原生评价弹窗
SKStoreReviewController.requestReview()
}
}
} }
//
// earth_AppleLoginTool.swift /*
// 3DEarth * 登录管理
// */
// Created by 研发2组 on 2024/8/23.
//
import Foundation import Foundation
import AuthenticationServices import AuthenticationServices
......
...@@ -5,10 +5,15 @@ ...@@ -5,10 +5,15 @@
// Created by 研发2组 on 2024/8/20. // Created by 研发2组 on 2024/8/20.
// //
/*
* 登录页面
*/
import UIKit import UIKit
class earth_LoginViewController: BaseViewController { class earth_LoginViewController: BaseViewController {
// MARK: - 生命周期
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
...@@ -23,8 +28,6 @@ class earth_LoginViewController: BaseViewController { ...@@ -23,8 +28,6 @@ class earth_LoginViewController: BaseViewController {
loginButton.y = view.height - loginButton.height - 150 loginButton.y = view.height - loginButton.height - 150
loginButton.viewRadius(loginButton.height*0.5) loginButton.viewRadius(loginButton.height*0.5)
view.addSubview(tips) view.addSubview(tips)
let attrString = NSMutableAttributedString(string: "登录即代表同意 使用条款 与 隐私政策") let attrString = NSMutableAttributedString(string: "登录即代表同意 使用条款 与 隐私政策")
...@@ -74,6 +77,8 @@ class earth_LoginViewController: BaseViewController { ...@@ -74,6 +77,8 @@ class earth_LoginViewController: BaseViewController {
loginButton.addTarget(self, action: #selector(login), for: .touchUpInside) loginButton.addTarget(self, action: #selector(login), for: .touchUpInside)
} }
// MARK: - 懒加载UI
let topImageView: UIImageView = { let topImageView: UIImageView = {
let topImageView = UIImageView(image: UIImage(named: "login_center")) let topImageView = UIImageView(image: UIImage(named: "login_center"))
return topImageView return topImageView
...@@ -96,6 +101,7 @@ class earth_LoginViewController: BaseViewController { ...@@ -96,6 +101,7 @@ class earth_LoginViewController: BaseViewController {
return lab return lab
}() }()
// MARK: - 方法
@objc func handleTapOnLabel(_ gesture: UITapGestureRecognizer) { @objc func handleTapOnLabel(_ gesture: UITapGestureRecognizer) {
guard let text = tips.attributedText?.string else { return } guard let text = tips.attributedText?.string else { return }
...@@ -119,6 +125,9 @@ class earth_LoginViewController: BaseViewController { ...@@ -119,6 +125,9 @@ class earth_LoginViewController: BaseViewController {
self.dismiss(animated: true) self.dismiss(animated: true)
} }
/*
* 苹果登录
*/
@objc func login() { @objc func login() {
earth_AppleLoginTool.instence.show(success: { (user, token,authorizationCode,jsonStr) in earth_AppleLoginTool.instence.show(success: { (user, token,authorizationCode,jsonStr) in
...@@ -134,13 +143,9 @@ class earth_LoginViewController: BaseViewController { ...@@ -134,13 +143,9 @@ class earth_LoginViewController: BaseViewController {
user, error in user, error in
if error != nil {return} if error != nil {return}
UserDefaults.standard.setValue(token, forKey: "token") UserDefaults.standard.setValue(token, forKey: "token")
self.dismiss(animated: true) self.dismiss(animated: true)
} }
}) })
} }
} }
//
// earth_MineTableViewCell.swift
// 3DEarth
//
// Created by 研发2组 on 2024/8/21.
//
import UIKit import UIKit
class earth_MineTableViewCell: UITableViewCell { class earth_MineTableViewCell: UITableViewCell {
...@@ -30,7 +23,6 @@ class earth_MineTableViewCell: UITableViewCell { ...@@ -30,7 +23,6 @@ class earth_MineTableViewCell: UITableViewCell {
self.backgroundColor = .clear self.backgroundColor = .clear
self.selectionStyle = .none self.selectionStyle = .none
backView.backgroundColor = UIColor(hexString: "#F6F6F6") backView.backgroundColor = UIColor(hexString: "#F6F6F6")
self.contentView.addSubview(backView) self.contentView.addSubview(backView)
......
// /*
// earth_MineViewController+.swift * 我的extension
// 3DEarth */
//
// Created by 研发2组 on 2024/8/21.
//
import UIKit import UIKit
/*
* tableview 代理
*/
extension earth_MineViewController{ extension earth_MineViewController{
func numberOfSections(in tableView: UITableView) -> Int { func numberOfSections(in tableView: UITableView) -> Int {
return self.data.count return self.data.count
} }
...@@ -61,14 +59,10 @@ extension earth_MineViewController{ ...@@ -61,14 +59,10 @@ extension earth_MineViewController{
break break
case 1: case 1:
if indexPath.row == 0 { if indexPath.row == 0 {
UIApplication.shared.open(URL(string: yhtk)!, options: [:]) UIApplication.shared.open(URL(string: yhtk)!, options: [:])
} }
if indexPath.row == 1 { if indexPath.row == 1 {
UIApplication.shared.open(URL(string: ysxy)!, options: [:]) UIApplication.shared.open(URL(string: ysxy)!, options: [:])
} }
break break
...@@ -84,7 +78,12 @@ extension earth_MineViewController{ ...@@ -84,7 +78,12 @@ extension earth_MineViewController{
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
return UIView() return UIView()
} }
}
/*
* 网络逻辑方法
*/
extension earth_MineViewController{
func reloadUserdata(){ func reloadUserdata(){
logoutButton.isHidden = true logoutButton.isHidden = true
if (checkIsLogin()){ if (checkIsLogin()){
...@@ -105,6 +104,30 @@ extension earth_MineViewController{ ...@@ -105,6 +104,30 @@ extension earth_MineViewController{
loginButton.setTitleColor(blacktextcolor, for: .normal) loginButton.setTitleColor(blacktextcolor, for: .normal)
zhuxiaoButton.isHidden = (checkIsLogin() == false) ? true : false zhuxiaoButton.isHidden = (checkIsLogin() == false) ? true : false
} }
}
}
/*
* 逻辑方法
*/
extension earth_MineViewController{
//MARK: - 事件处理
@objc func buttonClicked(sender:UIButton) {
if (checkIsLogin() == false){
showLoginVC(svc: self)
}
}
@objc func logoutClicked(sender:UIButton) {
UserDefaults.standard.removeObject(forKey: "token")
reloadUserdata()
}
@objc func zhuxiaoClicked(sender:UIButton) {
if (checkIsLogin() == true){
let vc = earth_CancelViewController.init()
vc.title = localstring("注销账号")
self.navigationController?.pushViewController(vc, animated: true)
}
} }
} }
// /*
// earth_MineViewController.swift * 我的页面
// 3DEarth */
//
// Created by 研发2组 on 2024/8/21.
//
import UIKit import UIKit
...@@ -93,29 +90,4 @@ class earth_MineViewController: BaseViewController ,UITableViewDelegate,UITableV ...@@ -93,29 +90,4 @@ class earth_MineViewController: BaseViewController ,UITableViewDelegate,UITableV
btn.contentHorizontalAlignment = .left btn.contentHorizontalAlignment = .left
return btn return btn
}() }()
//MARK: - 事件处理
@objc private func buttonClicked(sender:UIButton) {
if (checkIsLogin() == false){
showLoginVC(svc: self)
}
}
@objc private func logoutClicked(sender:UIButton) {
UserDefaults.standard.removeObject(forKey: "token")
reloadUserdata()
}
@objc private func zhuxiaoClicked(sender:UIButton) {
if (checkIsLogin() == true){
let vc = earth_CancelViewController.init()
vc.title = localstring("注销账号")
self.navigationController?.pushViewController(vc, animated: true)
}
}
} }
...@@ -13,6 +13,7 @@ class earth_CollectionsTableViewCell: UITableViewCell { ...@@ -13,6 +13,7 @@ class earth_CollectionsTableViewCell: UITableViewCell {
private var icon : UIImageView = UIImageView(image: UIImage(named: "location")) private var icon : UIImageView = UIImageView(image: UIImage(named: "location"))
private var desLb: UILabel = UILabel() private var desLb: UILabel = UILabel()
private var line : UIView = UIView() private var line : UIView = UIView()
//MARK: - 初始化 //MARK: - 初始化
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier) super.init(style: style, reuseIdentifier: reuseIdentifier)
......
// /*
// earth_CollectionsViewController.swift * 收藏
// 3DEarth */
//
// Created by 研发2组 on 2024/8/21.
//
import UIKit import UIKit
...@@ -12,6 +9,7 @@ class earth_CollectionsViewController: BaseViewController ,UITableViewDelegate,U ...@@ -12,6 +9,7 @@ class earth_CollectionsViewController: BaseViewController ,UITableViewDelegate,U
var collectionsaction : CollectionsAction! var collectionsaction : CollectionsAction!
var data : [earth_SignListModel] = [] var data : [earth_SignListModel] = []
//MARK: - 生命周期
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) super.viewWillAppear(animated)
getList() getList()
...@@ -26,6 +24,7 @@ class earth_CollectionsViewController: BaseViewController ,UITableViewDelegate,U ...@@ -26,6 +24,7 @@ class earth_CollectionsViewController: BaseViewController ,UITableViewDelegate,U
tableView.dataSource = self tableView.dataSource = self
} }
//MARK: - 懒加载
let tableView : UITableView = { let tableView : UITableView = {
let tableView = UITableView(frame: .zero, style: .plain) let tableView = UITableView(frame: .zero, style: .plain)
tableView.separatorStyle = .none tableView.separatorStyle = .none
...@@ -37,6 +36,41 @@ class earth_CollectionsViewController: BaseViewController ,UITableViewDelegate,U ...@@ -37,6 +36,41 @@ class earth_CollectionsViewController: BaseViewController ,UITableViewDelegate,U
} }
//MARK: - table代理
extension earth_CollectionsViewController{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.data.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let str = "minecell\(indexPath.section)\(indexPath.row)"
tableView.register(earth_CollectionsTableViewCell.self, forCellReuseIdentifier: str)
let cell = tableView.dequeueReusableCell(withIdentifier: str, for: indexPath) as! earth_CollectionsTableViewCell
cell.setModel(model:self.data[indexPath.row])
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.navigationController?.popToRootViewController(animated: true)
if collectionsaction != nil {
collectionsaction(self.data[indexPath.row])
}
}
func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
return localstring("删除")
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let itme : earth_SignListModel = self.data[indexPath.row]
deleteCollection(model: itme)
}
}
}
//MARK: - 网络逻辑
extension earth_CollectionsViewController{ extension earth_CollectionsViewController{
func getList(){ func getList(){
...@@ -71,35 +105,4 @@ extension earth_CollectionsViewController{ ...@@ -71,35 +105,4 @@ extension earth_CollectionsViewController{
} }
} }
} }
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.data.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let str = "minecell\(indexPath.section)\(indexPath.row)"
tableView.register(earth_CollectionsTableViewCell.self, forCellReuseIdentifier: str)
let cell = tableView.dequeueReusableCell(withIdentifier: str, for: indexPath) as! earth_CollectionsTableViewCell
cell.setModel(model:self.data[indexPath.row])
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.navigationController?.popToRootViewController(animated: true)
if collectionsaction != nil {
collectionsaction(self.data[indexPath.row])
}
}
func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
return localstring("删除")
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let itme : earth_SignListModel = self.data[indexPath.row]
deleteCollection(model: itme)
}
}
} }
//
// earth_SearchTableViewCell.swift
// 3DEarth
//
// Created by 研发2组 on 2024/8/23.
//
import UIKit import UIKit
import MapboxGeocoder.Swift import MapboxGeocoder.Swift
......
//
// earth_SearthViewController.swift
// 3DEarth /*
// * 搜索页面
// Created by 研发2组 on 2024/8/22. */
//
import UIKit import UIKit
import MapboxGeocoder.Swift import MapboxGeocoder.Swift
...@@ -130,6 +129,11 @@ extension earth_SearthViewController { ...@@ -130,6 +129,11 @@ extension earth_SearthViewController {
self.navigationController?.popToRootViewController(animated: true) self.navigationController?.popToRootViewController(animated: true)
} }
}
//MARK: - 方法逻辑
extension earth_SearthViewController{
@objc func textFieldDidChange(_ textField: UITextField) { @objc func textFieldDidChange(_ textField: UITextField) {
guard let searchText = textField.text else { return } guard let searchText = textField.text else { return }
......
// /*
// earth_SignListViewController.swift * 签到
// 3DEarth */
//
// Created by 研发2组 on 2024/8/21.
//
import UIKit import UIKit
class earth_SignListViewController: BaseViewController ,UITableViewDelegate,UITableViewDataSource{ class earth_SignListViewController: BaseViewController ,UITableViewDelegate,UITableViewDataSource{
var data: [earth_SignListModel]! var data: [earth_SignListModel]!
//MARK: - 生命周期
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
...@@ -18,6 +17,7 @@ class earth_SignListViewController: BaseViewController ,UITableViewDelegate,UITa ...@@ -18,6 +17,7 @@ class earth_SignListViewController: BaseViewController ,UITableViewDelegate,UITa
tableView.dataSource = self tableView.dataSource = self
} }
//MARK: - 懒加载table
let tableView : UITableView = { let tableView : UITableView = {
let tableView = UITableView(frame: .zero, style: .plain) let tableView = UITableView(frame: .zero, style: .plain)
tableView.separatorStyle = .none tableView.separatorStyle = .none
...@@ -29,6 +29,7 @@ class earth_SignListViewController: BaseViewController ,UITableViewDelegate,UITa ...@@ -29,6 +29,7 @@ class earth_SignListViewController: BaseViewController ,UITableViewDelegate,UITa
} }
//MARK: - table代理
extension earth_SignListViewController{ extension earth_SignListViewController{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.data == nil ? 0 : self.data.count return self.data == nil ? 0 : self.data.count
......
//
// Config.swift
// 3DEarth
//
// Created by 研发2组 on 2025/11/5.
//
import Foundation
import ObjectMapper
/// Pub配置项
struct PubItem {
var event: String = ""
var chance: String = ""
}
extension PubItem: Mappable {
init?(map: Map) {
}
mutating func mapping(map: Map) {
event <- map["event"]
chance <- map["chance"]
}
}
/// 配置模型
struct Config {
var code: Int = 0
var msg: String = ""
var pub: [PubItem] = []
var isSuccess:Bool{
code == 1
}
}
extension Config: Mappable {
init?(map: Map) {
}
mutating func mapping(map: Map) {
code <- map["code"]
msg <- map["msg"]
pub <- map["pub"]
}
}
extension Config: Parsable {
static func parse(json: [String: Any]) -> Config? {
return Mapper<Config>().map(JSON: json)
}
}
...@@ -29,9 +29,10 @@ func ==(lhs: CommonModel, rhs: CommonModel) -> Bool { ...@@ -29,9 +29,10 @@ func ==(lhs: CommonModel, rhs: CommonModel) -> Bool {
return lhs.hashValue == rhs.hashValue return lhs.hashValue == rhs.hashValue
} }
extension CommonModel: Hashable { extension CommonModel: Hashable {
var hashValue: Int { func hash(into hasher: inout Hasher) {
return 0 hasher.combine(hashValue)
} }
} }
......
...@@ -21,15 +21,6 @@ extension UserBehaviourModel: Mappable { ...@@ -21,15 +21,6 @@ extension UserBehaviourModel: Mappable {
} }
} }
func ==(lhs: UserBehaviourModel, rhs: UserBehaviourModel) -> Bool {
return lhs.hashValue == rhs.hashValue
}
extension UserBehaviourModel: Hashable {
var hashValue: Int {
return 0
}
}
extension UserBehaviourModel: Parsable { extension UserBehaviourModel: Parsable {
static func parse(json: [String: Any]) -> UserBehaviourModel? { static func parse(json: [String: Any]) -> UserBehaviourModel? {
......
...@@ -12,7 +12,7 @@ import ObjectMapper ...@@ -12,7 +12,7 @@ import ObjectMapper
struct UserBehaviourRequest : Request { struct UserBehaviourRequest : Request {
var path: String { var path: String {
return "NodeDtoBehaviorLog.php" return userbehavior_log_api
} }
let method: HTTPMethod = .post let method: HTTPMethod = .post
var parameters: [String: Any] = [:] var parameters: [String: Any] = [:]
......
...@@ -12,7 +12,7 @@ import ObjectMapper ...@@ -12,7 +12,7 @@ import ObjectMapper
struct earth_CollectionRequest : Request { struct earth_CollectionRequest : Request {
var path: String { var path: String {
return "EarthDtoCollect.php" return "EarthDtoCollect"
} }
let method: HTTPMethod = .post let method: HTTPMethod = .post
var parameters: [String: Any] = [:] var parameters: [String: Any] = [:]
...@@ -24,7 +24,7 @@ struct earth_CollectionRequest : Request { ...@@ -24,7 +24,7 @@ struct earth_CollectionRequest : Request {
struct earth_CollectionListRequest : Request { struct earth_CollectionListRequest : Request {
var path: String { var path: String {
return "EarthDtoCollectList.php" return collectionlist_api
} }
let method: HTTPMethod = .post let method: HTTPMethod = .post
var parameters: [String: Any] = [:] var parameters: [String: Any] = [:]
...@@ -36,7 +36,7 @@ struct earth_CollectionListRequest : Request { ...@@ -36,7 +36,7 @@ struct earth_CollectionListRequest : Request {
struct earth_CollectionDelRequest : Request { struct earth_CollectionDelRequest : Request {
var path: String { var path: String {
return "EarthDtoDoCollect.php" return collection_api
} }
let method: HTTPMethod = .post let method: HTTPMethod = .post
var parameters: [String: Any] = [:] var parameters: [String: Any] = [:]
......
...@@ -12,7 +12,7 @@ import ObjectMapper ...@@ -12,7 +12,7 @@ import ObjectMapper
struct earth_LoginRequest : Request { struct earth_LoginRequest : Request {
var path: String { var path: String {
return "EarthDtoAppleLogin.php" return apple_login_api
} }
let method: HTTPMethod = .post let method: HTTPMethod = .post
...@@ -24,7 +24,7 @@ struct earth_LoginRequest : Request { ...@@ -24,7 +24,7 @@ struct earth_LoginRequest : Request {
struct earth_UserRequest : Request { struct earth_UserRequest : Request {
var path: String { var path: String {
return "EarthDtoUserInfo.php" return userinfo_api
} }
let method: HTTPMethod = .post let method: HTTPMethod = .post
......
...@@ -26,8 +26,8 @@ func ==(lhs: earth_LoginUserModel, rhs: earth_LoginUserModel) -> Bool { ...@@ -26,8 +26,8 @@ func ==(lhs: earth_LoginUserModel, rhs: earth_LoginUserModel) -> Bool {
} }
extension earth_LoginUserModel: Hashable { extension earth_LoginUserModel: Hashable {
var hashValue: Int { func hash(into hasher: inout Hasher) {
return name.description.hashValue hasher.combine(name.hashValue.description)
} }
} }
......
...@@ -32,9 +32,10 @@ func ==(lhs: earth_UserDataModel, rhs: earth_UserDataModel) -> Bool { ...@@ -32,9 +32,10 @@ func ==(lhs: earth_UserDataModel, rhs: earth_UserDataModel) -> Bool {
return lhs.hashValue == rhs.hashValue return lhs.hashValue == rhs.hashValue
} }
extension earth_UserDataModel: Hashable { extension earth_UserDataModel: Hashable {
var hashValue: Int { func hash(into hasher: inout Hasher) {
return data.hashValue.description.hashValue hasher.combine(data.hashValue.description)
} }
} }
...@@ -73,8 +74,8 @@ func ==(lhs: earth_UserDataModel, rhs: BaseModel) -> Bool { ...@@ -73,8 +74,8 @@ func ==(lhs: earth_UserDataModel, rhs: BaseModel) -> Bool {
} }
extension BaseModel: Hashable { extension BaseModel: Hashable {
var hashValue: Int { func hash(into hasher: inout Hasher) {
return code.hashValue.description.hashValue hasher.combine(code.hashValue.description)
} }
} }
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
import Foundation import Foundation
import ObjectMapper import ObjectMapper
struct earth_SignDataModel { struct earth_SignDataModel {
var code: Int! var code: Int!
var msg: String = "" var msg: String = ""
...@@ -33,8 +32,8 @@ func ==(lhs: earth_SignDataModel, rhs: earth_SignDataModel) -> Bool { ...@@ -33,8 +32,8 @@ func ==(lhs: earth_SignDataModel, rhs: earth_SignDataModel) -> Bool {
} }
extension earth_SignDataModel: Hashable { extension earth_SignDataModel: Hashable {
var hashValue: Int { func hash(into hasher: inout Hasher) {
return data.hashValue.description.hashValue hasher.combine(data.description)
} }
} }
......
...@@ -14,7 +14,6 @@ struct earth_SignListModel{ ...@@ -14,7 +14,6 @@ struct earth_SignListModel{
var latitude : String! var latitude : String!
var address : String! var address : String!
var ctime : String! var ctime : String!
} }
extension earth_SignListModel: Mappable { extension earth_SignListModel: Mappable {
...@@ -35,8 +34,8 @@ func ==(lhs: earth_SignListModel, rhs: earth_SignListModel) -> Bool { ...@@ -35,8 +34,8 @@ func ==(lhs: earth_SignListModel, rhs: earth_SignListModel) -> Bool {
} }
extension earth_SignListModel: Hashable { extension earth_SignListModel: Hashable {
var hashValue: Int { func hash(into hasher: inout Hasher) {
return sign_id.description.hashValue hasher.combine(sign_id.description)
} }
} }
......
...@@ -12,7 +12,7 @@ import ObjectMapper ...@@ -12,7 +12,7 @@ import ObjectMapper
struct earth_SignRequest : Request { struct earth_SignRequest : Request {
var path: String { var path: String {
return "EarthDtoSign.php" return sign_api
} }
let method: HTTPMethod = .post let method: HTTPMethod = .post
var parameters: [String: Any] = [:] var parameters: [String: Any] = [:]
...@@ -24,7 +24,7 @@ struct earth_SignRequest : Request { ...@@ -24,7 +24,7 @@ struct earth_SignRequest : Request {
struct earth_SignListRequest : Request { struct earth_SignListRequest : Request {
var path: String { var path: String {
return "EarthDtoSignList.php" return signlist_api
} }
let method: HTTPMethod = .post let method: HTTPMethod = .post
var parameters: [String: Any] = [:] var parameters: [String: Any] = [:]
......
...@@ -7,7 +7,7 @@ public class GBig { ...@@ -7,7 +7,7 @@ public class GBig {
"万与丑专业丛东丝丢两严丧个丬丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵亸亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬俣俦俨俩俪俭债倾偬偻偾偿傥傧储傩儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击凼凿刍划刘则刚创删别刬刭刽刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勐勚匀匦匮区医华协单卖卢卤卧卫却卺厂厅历厉压厌厍厕厢厣厦厨厩厮县参叆叇双发变叙叠叶号叹叽吁后吓吕吗吣吨听启吴呒呓呕呖呗员呙呛呜咏咔咙咛咝咤咴咸哌响哑哒哓哔哕哗哙哜哝哟唛唝唠唡唢唣唤唿啧啬啭啮啰啴啸喷喽喾嗫呵嗳嘘嘤嘱噜噼嚣嚯团园囱围囵国图圆圣圹场坂坏块坚坛坜坝坞坟坠垄垅垆垒垦垧垩垫垭垯垱垲垴埘埙埚埝埯堑堕塆墙壮声壳壶壸处备复够头夸夹夺奁奂奋奖奥妆妇妈妩妪妫姗姜娄娅娆娇娈娱娲娴婳婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层屃屉届属屡屦屿岁岂岖岗岘岙岚岛岭岳岽岿峃峄峡峣峤峥峦崂崃崄崭嵘嵚嵛嵝嵴巅巩巯币帅师帏帐帘帜带帧帮帱帻帼幂幞干并广庄庆庐庑库应庙庞废庼廪开异弃张弥弪弯弹强归当录彟彦彻径徕御忆忏忧忾怀态怂怃怄怅怆怜总怼怿恋恳恶恸恹恺恻恼恽悦悫悬悭悯惊惧惨惩惫惬惭惮惯愍愠愤愦愿慑慭憷懑懒懔戆戋戏戗战戬户扎扑扦执扩扪扫扬扰抚抛抟抠抡抢护报担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捞损捡换捣据捻掳掴掷掸掺掼揸揽揿搀搁搂搅携摄摅摆摇摈摊撄撑撵撷撸撺擞攒敌敛数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权条来杨杩杰极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桊桠桡桢档桤桥桦桧桨桩梦梼梾检棂椁椟椠椤椭楼榄榇榈榉槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴毁毂毕毙毡毵氇气氢氩氲汇汉污汤汹沓沟没沣沤沥沦沧沨沩沪沵泞泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪漤潆潇潋潍潜潴澜濑濒灏灭灯灵灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烦烧烨烩烫烬热焕焖焘煅煳熘爱爷牍牦牵牺犊犟状犷犸犹狈狍狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珉珏珐珑珰珲琎琏琐琼瑶瑷璇璎瓒瓮瓯电画畅畲畴疖疗疟疠疡疬疮疯疱疴痈痉痒痖痨痪痫痴瘅瘆瘗瘘瘪瘫瘾瘿癞癣癫癯皑皱皲盏盐监盖盗盘眍眦眬着睁睐睑瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硷碍碛碜碱碹磙礼祎祢祯祷祸禀禄禅离秃秆种积称秽秾稆税稣稳穑穷窃窍窑窜窝窥窦窭竖竞笃笋笔笕笺笼笾筑筚筛筜筝筹签简箓箦箧箨箩箪箫篑篓篮篱簖籁籴类籼粜粝粤粪粮糁糇紧絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡翘翙翚耢耧耸耻聂聋职聍联聩聪肃肠肤肷肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑臜舆舣舰舱舻艰艳艹艺节芈芗芜芦苁苇苈苋苌苍苎苏苘苹茎茏茑茔茕茧荆荐荙荚荛荜荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莜莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒇蒉蒋蒌蓝蓟蓠蓣蓥蓦蔷蔹蔺蔼蕲蕴薮藁藓虏虑虚虫虬虮虽虾虿蚀蚁蚂蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衔补衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襁襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯詟誉誊讠计订讣认讥讦讧讨让讪讫训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郄郏郐郑郓郦郧郸酝酦酱酽酾酿释里鉅鉴銮錾钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铍铎铏铐铑铒铕铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗错锚锜锞锟锠锡锢锣锤锥锦锨锩锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镆镇镈镉镊镌镍镎镏镐镑镒镕镖镗镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镶长门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陧陨险随隐隶隽难雏雠雳雾霁霉霭靓静靥鞑鞒鞯鞴韦韧韨韩韪韫韬韵页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓魇魉鱼鱽鱾鱿鲀鲁鲂鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹯鹰鹱鹲鹳鹴鹾麦麸黄黉黡黩黪黾鼋鼌鼍鼗鼹齄齐齑齿龀龁龂龃龄龅龆龇龈龉龊龋龌龙龚龛龟志制咨只里系范松没尝尝闹面准钟别闲干尽脏拼" "万与丑专业丛东丝丢两严丧个丬丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵亸亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬俣俦俨俩俪俭债倾偬偻偾偿傥傧储傩儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击凼凿刍划刘则刚创删别刬刭刽刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勐勚匀匦匮区医华协单卖卢卤卧卫却卺厂厅历厉压厌厍厕厢厣厦厨厩厮县参叆叇双发变叙叠叶号叹叽吁后吓吕吗吣吨听启吴呒呓呕呖呗员呙呛呜咏咔咙咛咝咤咴咸哌响哑哒哓哔哕哗哙哜哝哟唛唝唠唡唢唣唤唿啧啬啭啮啰啴啸喷喽喾嗫呵嗳嘘嘤嘱噜噼嚣嚯团园囱围囵国图圆圣圹场坂坏块坚坛坜坝坞坟坠垄垅垆垒垦垧垩垫垭垯垱垲垴埘埙埚埝埯堑堕塆墙壮声壳壶壸处备复够头夸夹夺奁奂奋奖奥妆妇妈妩妪妫姗姜娄娅娆娇娈娱娲娴婳婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层屃屉届属屡屦屿岁岂岖岗岘岙岚岛岭岳岽岿峃峄峡峣峤峥峦崂崃崄崭嵘嵚嵛嵝嵴巅巩巯币帅师帏帐帘帜带帧帮帱帻帼幂幞干并广庄庆庐庑库应庙庞废庼廪开异弃张弥弪弯弹强归当录彟彦彻径徕御忆忏忧忾怀态怂怃怄怅怆怜总怼怿恋恳恶恸恹恺恻恼恽悦悫悬悭悯惊惧惨惩惫惬惭惮惯愍愠愤愦愿慑慭憷懑懒懔戆戋戏戗战戬户扎扑扦执扩扪扫扬扰抚抛抟抠抡抢护报担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捞损捡换捣据捻掳掴掷掸掺掼揸揽揿搀搁搂搅携摄摅摆摇摈摊撄撑撵撷撸撺擞攒敌敛数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权条来杨杩杰极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桊桠桡桢档桤桥桦桧桨桩梦梼梾检棂椁椟椠椤椭楼榄榇榈榉槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴毁毂毕毙毡毵氇气氢氩氲汇汉污汤汹沓沟没沣沤沥沦沧沨沩沪沵泞泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪漤潆潇潋潍潜潴澜濑濒灏灭灯灵灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烦烧烨烩烫烬热焕焖焘煅煳熘爱爷牍牦牵牺犊犟状犷犸犹狈狍狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珉珏珐珑珰珲琎琏琐琼瑶瑷璇璎瓒瓮瓯电画畅畲畴疖疗疟疠疡疬疮疯疱疴痈痉痒痖痨痪痫痴瘅瘆瘗瘘瘪瘫瘾瘿癞癣癫癯皑皱皲盏盐监盖盗盘眍眦眬着睁睐睑瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硷碍碛碜碱碹磙礼祎祢祯祷祸禀禄禅离秃秆种积称秽秾稆税稣稳穑穷窃窍窑窜窝窥窦窭竖竞笃笋笔笕笺笼笾筑筚筛筜筝筹签简箓箦箧箨箩箪箫篑篓篮篱簖籁籴类籼粜粝粤粪粮糁糇紧絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡翘翙翚耢耧耸耻聂聋职聍联聩聪肃肠肤肷肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑臜舆舣舰舱舻艰艳艹艺节芈芗芜芦苁苇苈苋苌苍苎苏苘苹茎茏茑茔茕茧荆荐荙荚荛荜荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莜莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒇蒉蒋蒌蓝蓟蓠蓣蓥蓦蔷蔹蔺蔼蕲蕴薮藁藓虏虑虚虫虬虮虽虾虿蚀蚁蚂蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衔补衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襁襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯詟誉誊讠计订讣认讥讦讧讨让讪讫训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郄郏郐郑郓郦郧郸酝酦酱酽酾酿释里鉅鉴銮錾钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铍铎铏铐铑铒铕铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗错锚锜锞锟锠锡锢锣锤锥锦锨锩锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镆镇镈镉镊镌镍镎镏镐镑镒镕镖镗镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镶长门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陧陨险随隐隶隽难雏雠雳雾霁霉霭靓静靥鞑鞒鞯鞴韦韧韨韩韪韫韬韵页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓魇魉鱼鱽鱾鱿鲀鲁鲂鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹯鹰鹱鹲鹳鹴鹾麦麸黄黉黡黩黪黾鼋鼌鼍鼗鼹齄齐齑齿龀龁龂龃龄龅龆龇龈龉龊龋龌龙龚龛龟志制咨只里系范松没尝尝闹面准钟别闲干尽脏拼"
public static func simplify(_ ch: String) -> String { public static func simplify(_ ch: String) -> String {
return String(ch.map { c in return String(ch.map { c in
if let i = big5.index(of: c) { if let i = big5.firstIndex(of: c) {
return gb[i] return gb[i]
} else { } else {
return c return c
...@@ -16,7 +16,7 @@ public class GBig { ...@@ -16,7 +16,7 @@ public class GBig {
} }
public static func traditionalize(_ ch: String) -> String { public static func traditionalize(_ ch: String) -> String {
return String(ch.map { c in return String(ch.map { c in
if let i = gb.index(of: c) { if let i = gb.firstIndex(of: c) {
return big5[i] return big5[i]
} else { } else {
return c return c
...@@ -25,7 +25,8 @@ public class GBig { ...@@ -25,7 +25,8 @@ public class GBig {
} }
} }
public extension String {
extension String {
public var big5: String { public var big5: String {
return GBig.traditionalize(self) return GBig.traditionalize(self)
} }
......
//
// earth_IndicatorView.swift
// 3DEarth
//
// Created by 研发2组 on 2024/8/27.
//
import UIKit import UIKit
class earth_IndicatorView: UIView { class earth_IndicatorView: UIView {
......
//
// earth_LocationPermissionManager.swift
// 3DEarth
//
// Created by 研发2组 on 2024/8/27.
//
import UIKit import UIKit
import CoreLocation import CoreLocation
......
//
// earth_RateAlertView.swift
// 3DEarth
//
// Created by AI Assistant
//
import UIKit
import SnapKit
typealias RateAlertViewClickAction = (Int, earth_RateAlertView) -> ()
/// 评价弹窗视图
class earth_RateAlertView: UIView {
// MARK: - Properties
var rateAlertViewClickAction: RateAlertViewClickAction?
weak var delegate: AlertViewDelegate?
// MARK: - UI Components (懒加载)
/// 主容器视图
private lazy var alertContainerView: UIView = {
let view = UIView()
view.backgroundColor = .white
view.layer.cornerRadius = 10
view.clipsToBounds = true
return view
}()
/// 表情图片
private lazy var emojiImageView: UIImageView = {
let imageView = UIImageView()
imageView.image = UIImage(named: "biaoqing")
imageView.contentMode = .scaleAspectFit
return imageView
}()
/// 标题标签
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.text = localstring("欢迎给我们评价")
label.textAlignment = .center
label.font = UIFont.boldSystemFont(ofSize: 18.0)
label.textColor = blacktextcolor
label.numberOfLines = 0
return label
}()
/// 消息标签
private lazy var messageLabel: UILabel = {
let label = UILabel()
label.text = localstring("您的鼓励就是我们最大的动力~")
label.textAlignment = .center
label.font = UIFont.systemFont(ofSize: 15.0)
label.textColor = blacktextcolor
label.numberOfLines = 0
return label
}()
/// 水平分割线
private lazy var horizontalLineView: UIView = {
let view = UIView()
view.backgroundColor = linecolor
return view
}()
/// 垂直分割线
private lazy var verticalLineView: UIView = {
let view = UIView()
view.backgroundColor = linecolor
return view
}()
/// 拒绝评价按钮
private lazy var declineButton: UIButton = {
let button = UIButton(type: .custom)
button.setTitle(localstring("拒绝评价"), for: .normal)
button.setTitleColor(textcolor, for: .normal)
button.titleLabel?.font = UIFont.systemFont(ofSize: 16.0)
button.backgroundColor = .clear
button.tag = 1
button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)
return button
}()
/// 马上评价按钮
private lazy var rateButton: UIButton = {
let button = UIButton(type: .custom)
button.setTitle(localstring("马上评价"), for: .normal)
button.setTitleColor(.systemBlue, for: .normal)
button.titleLabel?.font = UIFont.systemFont(ofSize: 16.0)
button.backgroundColor = .clear
button.tag = 2
button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)
return button
}()
// MARK: - Initialization
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Setup UI
private func setupUI() {
// 设置背景色(半透明黑色)
backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.3)
// 添加子视图
addSubview(alertContainerView)
// 表情图片添加到主视图,而不是容器视图,以便超出容器显示
addSubview(emojiImageView)
alertContainerView.addSubview(titleLabel)
alertContainerView.addSubview(messageLabel)
alertContainerView.addSubview(horizontalLineView)
alertContainerView.addSubview(verticalLineView)
alertContainerView.addSubview(declineButton)
alertContainerView.addSubview(rateButton)
// 使用SnapKit布局
setupConstraints()
// 添加点击手势,点击背景关闭
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(backgroundTapped))
tapGesture.delegate = self
addGestureRecognizer(tapGesture)
}
// MARK: - Layout Constraints
private func setupConstraints() {
// 主容器视图居中,设置固定宽度
alertContainerView.snp.makeConstraints { make in
make.center.equalToSuperview()
make.width.equalTo(260)
}
// 表情图片 - 顶部略微超出容器,相对于容器顶部偏移
emojiImageView.snp.makeConstraints { make in
make.centerY.equalTo(alertContainerView.snp.top)
make.centerX.equalTo(alertContainerView)
make.width.height.equalTo(100)
}
// 标题标签 - 在表情图片下方
titleLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(50) // 为表情图片留出空间
make.leading.trailing.equalToSuperview().inset(20)
make.centerX.equalToSuperview()
}
// 消息标签 - 在标题下方
messageLabel.snp.makeConstraints { make in
make.top.equalTo(titleLabel.snp.bottom).offset(10)
make.leading.trailing.equalToSuperview().inset(20)
make.centerX.equalToSuperview()
}
// 水平分割线 - 在消息下方,按钮上方
horizontalLineView.snp.makeConstraints { make in
make.top.equalTo(messageLabel.snp.bottom).offset(20)
make.leading.trailing.equalToSuperview()
make.height.equalTo(1)
}
// 拒绝评价按钮 - 左侧
declineButton.snp.makeConstraints { make in
make.top.equalTo(horizontalLineView.snp.bottom)
make.leading.bottom.equalToSuperview()
make.width.equalTo(alertContainerView.snp.width).dividedBy(2).offset(-0.5)
make.height.equalTo(64)
}
// 垂直分割线 - 两个按钮之间
verticalLineView.snp.makeConstraints { make in
make.top.equalTo(horizontalLineView.snp.bottom)
make.bottom.equalToSuperview()
make.centerX.equalToSuperview()
make.width.equalTo(1)
}
// 马上评价按钮 - 右侧
rateButton.snp.makeConstraints { make in
make.top.equalTo(horizontalLineView.snp.bottom)
make.trailing.bottom.equalToSuperview()
make.width.equalTo(alertContainerView.snp.width).dividedBy(2).offset(-0.5)
make.height.equalTo(64)
}
// 更新容器高度约束(根据内容自适应)
alertContainerView.snp.makeConstraints { make in
make.bottom.equalTo(rateButton.snp.bottom)
}
}
// MARK: - Actions
@objc private func buttonTapped(_ sender: UIButton) {
if let action = rateAlertViewClickAction {
action(sender.tag, self)
}
dismiss()
}
@objc private func backgroundTapped() {
// 点击背景不关闭,必须点击按钮
}
// MARK: - Public Methods
/// 显示弹窗(内部调用,外部通过AlertManager调用)
func show() {
self.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
createShowAnimation()
}
/// 关闭弹窗
private func dismiss() {
removeFromSuperview()
callBackDelegateCozRemove()
}
/// 创建显示动画
private func createShowAnimation() {
alertContainerView.transform = CGAffineTransform(scaleX: 0.90, y: 0.90)
UIView.animate(withDuration: 0.25, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 1, options: .curveLinear) {
self.alertContainerView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
}
}
// MARK: - Delegate Callback
private func callBackDelegateCozRemove() {
delegate?.alertViewRemoved()
}
deinit {
callBackDelegateCozRemove()
}
}
// MARK: - UIGestureRecognizerDelegate
extension earth_RateAlertView: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
// 只有点击背景区域才响应,点击alert容器不响应
return touch.view == self
}
}
import Foundation import Foundation
import UMCommon import UMCommon
import Bugly import Bugly
...@@ -47,9 +45,7 @@ class earth_UserBehaviourManager { ...@@ -47,9 +45,7 @@ class earth_UserBehaviourManager {
user, error in user, error in
completion() completion()
if error != nil { if error != nil {
return return
} }
} }
// } // }
......
...@@ -15,25 +15,24 @@ protocol Client { ...@@ -15,25 +15,24 @@ protocol Client {
var host: String { get } var host: String { get }
func send<T: Request>(_ r: T, handler: @escaping (T.Response?, _ error :AlamofireError?) -> ()) func send<T: Request>(_ r: T, handler: @escaping (T.Response?, _ error :AlamofireError?) -> ())
func config(handler: @escaping (Config?) -> ())
} }
struct AlamofireClient: Client { struct AlamofireClient: Client {
// let host = "https://earth-api.7.ln.cn/data/v1/"
let host = "http://earth-api.7.ln.cn/data/v1/" let host = "http://earth-api.7.ln.cn/data/v1/"
let key = "Q8bkWigT" let key = "Q8bkWigT"
func send<T : Request>(_ r: T, handler: @escaping (T.Response?, _ error :AlamofireError?) -> ()) { func send<T : Request>(_ r: T, handler: @escaping (T.Response?, _ error :AlamofireError?) -> ()) {
let urlString = host.appending(r.path) let urlString = host.appending(r.path).appending(".php")
let url = URL(string: urlString)! let url = URL(string: urlString)!
print("\n----------request----------\nrequestUrl = \(urlString)\n----------method----------\nmethod = \(r.method.rawValue)\nparameters = \(r.parameters)") print("\n----------request----------\nrequestUrl = \(urlString)\n----------method----------\nmethod = \(r.method.rawValue)\nparameters = \(r.parameters)")
let headers:HTTPHeaders = ["Content-type":"application/x-www-form-urlencoded", let headers:HTTPHeaders = ["Content-type":"application/x-www-form-urlencoded",
"Accept":"application/json", "Accept":"application/json"]
]
AF.request(url, method: r.method, parameters: r.parameters, headers: headers ) AF.request(url, method: r.method, parameters: r.parameters, headers: headers )
...@@ -106,7 +105,59 @@ struct AlamofireClient: Client { ...@@ -106,7 +105,59 @@ struct AlamofireClient: Client {
} }
func config(handler: @escaping (Config?) -> ()) {
let urlString = "https://common.7.ln.cn/pubv3/cSearchConfig.php"
let url = URL(string: urlString)!
let headers:HTTPHeaders = ["Content-type":"application/x-www-form-urlencoded",
"Accept":"application/json"]
AF.request(url, method: .post, parameters: ["user_pkname":"com.yhgc.3DEarth"], headers: headers )
.responseString { (response) in
if response.value == nil{
return
}
let decryptedData = CATSecurity.aes256Decrypt(with: CATSecurity.data(withBase64EncodedString: response.value)!, key: key)
if decryptedData == nil{
return
}
let jsonString = String(data: decryptedData!, encoding: .utf8)
switch response.result {
case .success:
if jsonString == nil {
handler(nil)
return
}
if let jsonData = jsonString!.data(using: .utf8) {
do {
if let dictionary = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] {
print("\n---------config dictionary---------\n\(dictionary)")
// 使用Config的parse方法解析
if let config = Config.parse(json: dictionary) {
handler(config)
} else {
handler(nil)
}
} else {
handler(nil)
}
} catch {
print("解析错误:", error)
Bugly.reportError(error)
handler(nil)
}
} else {
handler(nil)
}
case .failure:
handler(nil)
}
}
}
func userDong(msg:String){ func userDong(msg:String){
......
//MARK: - 收藏列表
let collectionlist_api = "EarthDtoCollectList"
//MARK: - 收藏
let collection_api = "EarthDtoDoCollect"
//MARK: - 签到
let sign_api = "EarthDtoSign"
//MARK: - 签到列表
let signlist_api = "EarthDtoSignList"
//MARK: - 苹果登录
let apple_login_api = "EarthDtoAppleLogin"
//MARK: - 用户信息
let userinfo_api = "EarthDtoUserInfo"
//MARK: - 用户行为
let userbehavior_log_api = "NodeDtoBehaviorLog"
//MARK: - 基础配置
let appconfig_api = "cSearchConfig"
//https://common.7.ln.cn/pubv3/cSearchConfig.php
...@@ -19,7 +19,7 @@ class vpn_AlertManager { ...@@ -19,7 +19,7 @@ class vpn_AlertManager {
func existAlertNow() -> Bool { func existAlertNow() -> Bool {
for subView in alertWindow.subviews { for subView in alertWindow.subviews {
if subView is earth_ShotScreenView || subView is earth_CancelAlertView || subView is earth_IndicatorView{ if subView is earth_ShotScreenView || subView is earth_CancelAlertView || subView is earth_IndicatorView || subView is earth_RateAlertView{
return true return true
} }
...@@ -61,6 +61,17 @@ class vpn_AlertManager { ...@@ -61,6 +61,17 @@ class vpn_AlertManager {
hideAlertWindow(false) hideAlertWindow(false)
} }
/// 显示评价弹窗
/// - Parameter handle: 按钮点击回调,tag: 1=拒绝评价, 2=马上评价
func showRateAlert(handle: @escaping RateAlertViewClickAction) {
let alert = earth_RateAlertView(frame: alertWindow.bounds)
alert.rateAlertViewClickAction = handle
alert.delegate = self
alertWindow.addSubview(alert)
alert.show()
hideAlertWindow(false)
}
} }
extension vpn_AlertManager: AlertViewDelegate { extension vpn_AlertManager: AlertViewDelegate {
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1500" LastUpgradeVersion = "1600"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论