新增高德
authorliangzhenying <867174124@qq.com>
Thu, 22 Jan 2026 08:12:57 +0000 (16:12 +0800)
committerliangzhenying <867174124@qq.com>
Thu, 22 Jan 2026 08:12:57 +0000 (16:12 +0800)
40 files changed:
ShenYin/Podfile.lock
ShenYin/ShenYin.xcodeproj/project.pbxproj
ShenYin/ShenYin/Assets.xcassets/sport/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/ready_go.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/ready_go.imageset/Slice 145@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/ready_go.imageset/Slice 145@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/ready_route.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/ready_route.imageset/Slice 147@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/ready_route.imageset/Slice 147@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/ready_target.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/ready_target.imageset/Slice 146@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/ready_target.imageset/Slice 146@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Slice 131.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Slice 131@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Slice 131@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Slice 130.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Slice 130@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Slice 130@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Contents.json [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Slice 132.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Slice 132@2x.png [new file with mode: 0644]
ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Slice 132@3x.png [new file with mode: 0644]
ShenYin/ShenYin/Launch/SceneDelegate.swift
ShenYin/ShenYin/UI/Sport/Sport/Ready/CountdownView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/Ready/CustomMapView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/Ready/FooterView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/Ready/ReadyVC.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/SportRootView.swift [deleted file]
ShenYin/ShenYin/UI/Sport/Sport/SportTypeView.swift [deleted file]
ShenYin/ShenYin/UI/Sport/Sport/Tools/MapManager.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/root/DataView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/root/GroupView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/root/PlanView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/root/RouteView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/root/SportRootView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/Sport/root/SportTypeView.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Sport/SportHomeVC.swift
ShenYin/podfile

index 91f2524..871b96f 100644 (file)
@@ -1,4 +1,11 @@
 PODS:
+  - AMap3DMap-NO-IDFA (10.0.700):
+    - AMapFoundation-NO-IDFA (>= 1.8.0)
+  - AMapFoundation-NO-IDFA (1.8.2)
+  - AMapLocation-NO-IDFA (2.10.0):
+    - AMapFoundation-NO-IDFA (>= 1.8.0)
+  - AMapSearch-NO-IDFA (9.7.0):
+    - AMapFoundation-NO-IDFA (>= 1.8.0)
   - CryptoSwift (1.8.4)
   - DeviceKit (5.4.0)
   - DGActivityIndicatorView (2.1.1)
@@ -70,6 +77,9 @@ PODS:
   - ZipArchive (1.4.0)
 
 DEPENDENCIES:
+  - AMap3DMap-NO-IDFA (= 10.0.700)
+  - AMapLocation-NO-IDFA
+  - AMapSearch-NO-IDFA (= 9.7.0)
   - CryptoSwift
   - DeviceKit (~> 5.4.0)
   - DGActivityIndicatorView
@@ -97,6 +107,10 @@ DEPENDENCIES:
 
 SPEC REPOS:
   https://gitee.com/mirrors/CocoaPods-Specs.git:
+    - AMap3DMap-NO-IDFA
+    - AMapFoundation-NO-IDFA
+    - AMapLocation-NO-IDFA
+    - AMapSearch-NO-IDFA
     - CryptoSwift
     - DeviceKit
     - DGActivityIndicatorView
@@ -130,6 +144,10 @@ SPEC REPOS:
     - ZipArchive
 
 SPEC CHECKSUMS:
+  AMap3DMap-NO-IDFA: e029d65ea35d3e4c0a948e1dab9e77109bf0e86a
+  AMapFoundation-NO-IDFA: 6ce0ef596d4eb8d934ff498e56747b6de1247b05
+  AMapLocation-NO-IDFA: 735791aeb1ba52dff666e4158b86caf4b68b5be7
+  AMapSearch-NO-IDFA: 749f73d5a773758f01a24eb8872f8798c8b47cb4
   CryptoSwift: e64e11850ede528a02a0f3e768cec8e9d92ecb90
   DeviceKit: bd34bb1766d926c3cc5a5f6e3e9a6dd10148b805
   DGActivityIndicatorView: ff2c76073d79692f724863c8dd38685866a03cb6
@@ -162,6 +180,6 @@ SPEC CHECKSUMS:
   YYText: 5c461d709e24d55a182d1441c41dc639a18a4849
   ZipArchive: e25a4373192673e3229ac8d6e9f64a3e5713c966
 
-PODFILE CHECKSUM: 0164676b37eb80faebf2999f878a492c1d277ddd
+PODFILE CHECKSUM: 72f4eaacbe6e66655fb7c7aef1807fd74a1fd9b2
 
 COCOAPODS: 1.16.2
index 0176d73..2abcf03 100644 (file)
                                3F887B9A2E38D8DC00C98658 /* Resources */,
                                5A934A35F54A5620CFD3C08A /* [CP] Embed Pods Frameworks */,
                                3FEFE9092F1B252000D82F17 /* Embed Frameworks */,
+                               C952A11BAF04A31F5BE85A2D /* [CP] Copy Pods Resources */,
                        );
                        buildRules = (
                        );
                        shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ShenYin/Pods-ShenYin-frameworks.sh\"\n";
                        showEnvVarsInLog = 0;
                };
+               C952A11BAF04A31F5BE85A2D /* [CP] Copy Pods Resources */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputFileListPaths = (
+                               "${PODS_ROOT}/Target Support Files/Pods-ShenYin/Pods-ShenYin-resources-${CONFIGURATION}-input-files.xcfilelist",
+                       );
+                       inputPaths = (
+                       );
+                       name = "[CP] Copy Pods Resources";
+                       outputFileListPaths = (
+                               "${PODS_ROOT}/Target Support Files/Pods-ShenYin/Pods-ShenYin-resources-${CONFIGURATION}-output-files.xcfilelist",
+                       );
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ShenYin/Pods-ShenYin-resources.sh\"\n";
+                       showEnvVarsInLog = 0;
+               };
                FEE3A20D8A2FA81E622C488B /* [CP] Check Pods Manifest.lock */ = {
                        isa = PBXShellScriptBuildPhase;
                        buildActionMask = 2147483647;
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/Contents.json b/ShenYin/ShenYin/Assets.xcassets/sport/Contents.json
new file mode 100644 (file)
index 0000000..73c0059
--- /dev/null
@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/ready_go.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/sport/ready_go.imageset/Contents.json
new file mode 100644 (file)
index 0000000..34a7e3b
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Slice 145@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Slice 145@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/ready_go.imageset/Slice 145@2x.png b/ShenYin/ShenYin/Assets.xcassets/sport/ready_go.imageset/Slice 145@2x.png
new file mode 100644 (file)
index 0000000..71fc937
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/ready_go.imageset/Slice 145@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/ready_go.imageset/Slice 145@3x.png b/ShenYin/ShenYin/Assets.xcassets/sport/ready_go.imageset/Slice 145@3x.png
new file mode 100644 (file)
index 0000000..5981ed5
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/ready_go.imageset/Slice 145@3x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/ready_route.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/sport/ready_route.imageset/Contents.json
new file mode 100644 (file)
index 0000000..919644d
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Slice 147@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Slice 147@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/ready_route.imageset/Slice 147@2x.png b/ShenYin/ShenYin/Assets.xcassets/sport/ready_route.imageset/Slice 147@2x.png
new file mode 100644 (file)
index 0000000..f2c453c
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/ready_route.imageset/Slice 147@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/ready_route.imageset/Slice 147@3x.png b/ShenYin/ShenYin/Assets.xcassets/sport/ready_route.imageset/Slice 147@3x.png
new file mode 100644 (file)
index 0000000..a3e58cc
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/ready_route.imageset/Slice 147@3x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/ready_target.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/sport/ready_target.imageset/Contents.json
new file mode 100644 (file)
index 0000000..f26f980
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Slice 146@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Slice 146@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/ready_target.imageset/Slice 146@2x.png b/ShenYin/ShenYin/Assets.xcassets/sport/ready_target.imageset/Slice 146@2x.png
new file mode 100644 (file)
index 0000000..5a1244b
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/ready_target.imageset/Slice 146@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/ready_target.imageset/Slice 146@3x.png b/ShenYin/ShenYin/Assets.xcassets/sport/ready_target.imageset/Slice 146@3x.png
new file mode 100644 (file)
index 0000000..dc6ca22
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/ready_target.imageset/Slice 146@3x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Contents.json
new file mode 100644 (file)
index 0000000..713044b
--- /dev/null
@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "Slice 131.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Slice 131@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Slice 131@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Slice 131.png b/ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Slice 131.png
new file mode 100644 (file)
index 0000000..191cae3
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Slice 131.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Slice 131@2x.png b/ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Slice 131@2x.png
new file mode 100644 (file)
index 0000000..c662441
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Slice 131@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Slice 131@3x.png b/ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Slice 131@3x.png
new file mode 100644 (file)
index 0000000..b667807
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/sport_ride.imageset/Slice 131@3x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Contents.json
new file mode 100644 (file)
index 0000000..bc5702f
--- /dev/null
@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "Slice 130.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Slice 130@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Slice 130@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Slice 130.png b/ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Slice 130.png
new file mode 100644 (file)
index 0000000..b41533a
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Slice 130.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Slice 130@2x.png b/ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Slice 130@2x.png
new file mode 100644 (file)
index 0000000..711ac41
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Slice 130@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Slice 130@3x.png b/ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Slice 130@3x.png
new file mode 100644 (file)
index 0000000..84b7f7c
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/sport_run.imageset/Slice 130@3x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Contents.json b/ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Contents.json
new file mode 100644 (file)
index 0000000..f540b05
--- /dev/null
@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "Slice 132.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Slice 132@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Slice 132@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Slice 132.png b/ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Slice 132.png
new file mode 100644 (file)
index 0000000..6488744
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Slice 132.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Slice 132@2x.png b/ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Slice 132@2x.png
new file mode 100644 (file)
index 0000000..67d9151
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Slice 132@2x.png differ
diff --git a/ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Slice 132@3x.png b/ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Slice 132@3x.png
new file mode 100644 (file)
index 0000000..3355aed
Binary files /dev/null and b/ShenYin/ShenYin/Assets.xcassets/sport/sport_walk.imageset/Slice 132@3x.png differ
index 3abffac..f166788 100644 (file)
@@ -18,8 +18,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
         
         App.shared.window = window
 //        window?.rootViewController = BaseTC()
-//        window?.rootViewController = UINavigationController(rootViewController: SportHomeVC())
-        AppLaunch.start()
+        MapManager.shared.setupSdk()
+        window?.rootViewController = UINavigationController(rootViewController: ReadyVC())
+//        AppLaunch.start()
     }
 
     func sceneDidDisconnect(_ scene: UIScene) {
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/Ready/CountdownView.swift b/ShenYin/ShenYin/UI/Sport/Sport/Ready/CountdownView.swift
new file mode 100644 (file)
index 0000000..655cd2f
--- /dev/null
@@ -0,0 +1,76 @@
+//
+//  Untitled.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/1/21.
+//
+
+extension ReadyVC{
+    class CountdownView: BaseView {
+        let label = UILabel()
+        let skip = UILabel()
+        var timer:Timer!
+        var count = 3
+        
+        override func setupViews() {
+            addSubviews([label,skip])
+            label.do { v in
+                v.textColor = .color(.first)
+                v.font = .bold(210)
+                v.textAlignment = .center
+                v.text = "\(count)"
+            }
+            skip.do { v in
+                v.textColor = .color(.first)
+                v.font = .regular(14)
+                v.textAlignment = .center
+                v.text = "直接开始".l10n
+                v.yc.addTap(target: self, action: #selector(skipAction))
+
+                let line = UIView()
+                line.backgroundColor = .color(.first)
+                v.addSubview(line)
+                line.snp.makeConstraints { make in
+                    make.height.equalTo(1)
+                    make.left.right.equalToSuperview()
+                    make.bottom.equalToSuperview().offset(4)
+                }
+            }
+            backgroundColor = .white
+        }
+        
+        override func setupLayout() {
+            label.snp.makeConstraints { make in
+                make.center.equalToSuperview()
+            }
+            skip.snp.makeConstraints { make in
+                make.bottom.equalToSuperview().inset(100)
+                make.centerX.equalToSuperview()
+            }
+        }
+        override func setupData() {
+            timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
+        }
+        @objc func timerAction(){
+            count -= 1
+            label.text = "\(count)"
+            print(count)
+            if count == 0 {
+                skipAction()
+            }
+        }
+        static func show(in view:UIView){
+            let countView = CountdownView()
+            view.addSubview(countView)
+            countView.snp.makeConstraints { make in
+                make.edges.equalToSuperview()
+            }
+        }
+        @objc func skipAction(){
+            timer.invalidate()
+            App.shared.goToPage(BaseVC())
+            removeFromSuperview()
+        }
+    }
+    
+}
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/Ready/CustomMapView.swift b/ShenYin/ShenYin/UI/Sport/Sport/Ready/CustomMapView.swift
new file mode 100644 (file)
index 0000000..fbc7567
--- /dev/null
@@ -0,0 +1,12 @@
+//
+//  Untitled.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/1/21.
+//
+
+class CustomMapView: BaseView {
+    
+    
+    
+}
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/Ready/FooterView.swift b/ShenYin/ShenYin/UI/Sport/Sport/Ready/FooterView.swift
new file mode 100644 (file)
index 0000000..e6847f0
--- /dev/null
@@ -0,0 +1,96 @@
+//
+//  FooterView.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/1/21.
+//
+
+extension ReadyVC{
+    class FooterView: BaseView {
+        let targetBtn = ButtonItem()
+        let routeBtn = ButtonItem()
+        let goBtn = UIImageView()
+        
+        override func setupViews() {
+            addSubviews([targetBtn,goBtn,routeBtn])
+            targetBtn.do { v in
+                v.titleLabel.text = "目标".l10n
+                v.icon.image = UIImage(named: "ready_target")
+                v.yc.setCornerRadius(18)
+                v.yc.addTap(target: self, action: #selector(targetAction))
+            }
+            goBtn.do { v in
+                v.image = UIImage(named: "ready_go")
+                v.yc.addTap(target: self, action: #selector(goAction))
+            }
+            routeBtn.do { v in
+                v.yc.setCornerRadius(18)
+                v.titleLabel.text = "路线".l10n
+                v.icon.image = UIImage(named: "ready_route")
+                v.yc.addTap(target: self, action: #selector(routeAction))
+            }
+        }
+        
+        override func setupLayout() {
+            goBtn.snp.makeConstraints { make in
+                make.size.equalTo(90)
+                make.centerY.equalToSuperview()
+                make.centerX.equalTo(kScreenWid/2)
+            }
+            
+            targetBtn.snp.makeConstraints { make in
+                make.width.equalTo(90)
+                make.height.equalTo(36)
+                make.centerY.equalToSuperview()
+                make.right.equalTo(goBtn.snp.left).offset(-27)
+            }
+            routeBtn.snp.makeConstraints { make in
+                make.width.equalTo(90)
+                make.height.equalTo(36)
+                make.centerY.equalToSuperview()
+                make.left.equalTo(goBtn.snp.right).offset(27)
+            }
+
+        }
+        
+        @objc func targetAction(){
+            
+        }
+        @objc func goAction(){
+            CountdownView.show(in: App.shared.window!)
+        }
+        @objc func routeAction(){
+            
+        }
+        
+        class ButtonItem: BaseView {
+            let icon = UIImageView()
+            let titleLabel = UILabel()
+
+            override func setupViews() {
+                addSubviews([titleLabel,icon])
+                icon.do { v in
+                }
+                titleLabel.do { v in
+                    v.textColor = .color(.first)
+                    v.font = .regular(14)
+                }
+                backgroundColor = .white
+            }
+            
+            override func setupLayout() {
+                icon.snp.makeConstraints { make in
+                    make.size.equalTo(24)
+                    make.centerY.equalToSuperview()
+                    make.left.equalToSuperview().inset(16)
+                }
+                titleLabel.snp.makeConstraints { make in
+                    make.centerY.equalToSuperview()
+                    make.left.equalTo(43)
+                }
+            }
+        }
+
+    }
+    
+}
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/Ready/ReadyVC.swift b/ShenYin/ShenYin/UI/Sport/Sport/Ready/ReadyVC.swift
new file mode 100644 (file)
index 0000000..1eab05b
--- /dev/null
@@ -0,0 +1,61 @@
+//
+//  Untitled.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/1/21.
+//
+import MAMapKit
+
+class ReadyVC: BaseVC {
+    let headerView = UIView()
+    var mapView:MAMapView!
+    let footerView = FooterView()
+    
+    override func setupViews() {
+        mapView = MAMapView(frame: .zero)
+        mapView.delegate = self
+        mapView.showsUserLocation = true
+        mapView.zoomLevel = 16
+        mapView.userTrackingMode = .followWithHeading
+        
+        view.addSubviews([headerView,mapView,footerView])
+        headerView.do { v in
+            v.backgroundColor = .white
+        }
+        mapView.do { v in
+            v.backgroundColor = .green
+            
+        }
+        footerView.do { v in
+//            v.backgroundColor = .blue
+        }
+    }
+    override func setupLayout() {
+        headerView.snp.makeConstraints { make in
+            make.left.right.equalToSuperview()
+            make.top.equalToSuperview().inset(kNavBtm + 20)
+            make.height.equalTo(100)
+        }
+        footerView.snp.makeConstraints { make in
+            make.left.right.equalToSuperview()
+            make.bottom.equalToSuperview()
+            make.height.equalTo(200)
+        }
+        mapView.snp.makeConstraints { make in
+            make.left.right.equalToSuperview()
+            make.top.equalTo(headerView.snp.bottom)
+            make.bottom.equalTo(footerView.snp.top)
+        }
+
+    }
+    override func setupData() {
+        
+    }
+    
+}
+
+extension ReadyVC:MAMapViewDelegate{
+    func mapViewRequireLocationAuth(_ locationManager: CLLocationManager!) {
+//        locationManager.requestAlwaysAuthorization()
+    }
+}
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/SportRootView.swift b/ShenYin/ShenYin/UI/Sport/Sport/SportRootView.swift
deleted file mode 100644 (file)
index 515dbe7..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-//  SportVC.swift
-//  ShenYin
-//
-//  Created by liangshi on 2026/1/20.
-//
-
-import UIKit
-import JXSegmentedView
-
-class SportRootView: BaseView{
-    override func setupViews() {
-        backgroundColor = UIColor.random()
-    }
-}
-
-extension SportRootView: JXSegmentedListContainerViewListDelegate {
-    func listView() -> UIView {
-        return self
-    }
-}
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/SportTypeView.swift b/ShenYin/ShenYin/UI/Sport/Sport/SportTypeView.swift
deleted file mode 100644 (file)
index 77b6797..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-//
-//  SportTypeView.swift
-//  ShenYin
-//
-//  Created by liangshi on 2026/1/20.
-//
-import UIKit
-
-class SportTypeView: BaseView{
-    override func setupViews() {
-        
-    }
-    
-    
-    class SportTypeView: BaseView{
-        override func setupViews() {
-            
-        }
-        
-        
-        
-    }
-}
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/Tools/MapManager.swift b/ShenYin/ShenYin/UI/Sport/Sport/Tools/MapManager.swift
new file mode 100644 (file)
index 0000000..76af958
--- /dev/null
@@ -0,0 +1,57 @@
+//
+//  MapManager.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/1/21.
+//
+import MAMapKit
+import UIKit
+
+class MapManager {
+    static let shared = MapManager()
+    
+    func setupSdk(){
+        AMapServices.shared().apiKey = "57aebc5a63fa3ccb8cb81ae0cab649d1"
+        //判断是否是首次启动
+        if !UserDefaults.standard.bool(forKey: "agreeStatus") {
+            //添加隐私合规弹窗
+            self.addAlertController()
+            //更新App是否显示隐私弹窗的状态,隐私弹窗是否包含高德SDK隐私协议内容的状态. since 8.1.0
+            MAMapView.updatePrivacyShow(AMapPrivacyShowStatus.didShow, privacyInfo: AMapPrivacyInfoStatus.didContain)
+        }
+    }
+    
+    
+    func addAlertController(){
+        
+        let paragraphStyle : NSMutableParagraphStyle = NSMutableParagraphStyle.init()
+        paragraphStyle.alignment = NSTextAlignment.left
+        
+        let message : NSMutableAttributedString = NSMutableAttributedString.init(string: "\n亲,感谢您对XXX一直以来的信任!我们依据最新的监管要求更新了XXX《隐私权政策》,特向您说明如下\n1.为向您提供交易相关基本功能,我们会收集、使用必要的信息;\n2.基于您的明示授权,我们可能会获取您的位置(为您提供附近的商品、店铺及优惠资讯等)等信息,您有权拒绝或取消授权;\n3.我们会采取业界先进的安全措施保护您的信息安全;\n4.未经您同意,我们不会从第三方处获取、共享或向提供您的信息;", attributes: [NSAttributedString.Key.paragraphStyle:paragraphStyle])
+        
+        message.setAttributes([NSAttributedString.Key.foregroundColor:UIColor.blue], range: message.mutableString.range(of: "《隐私权政策》"))
+        
+        let alert : UIAlertController = UIAlertController.init(title: "温馨提示(隐私合规示例)", message: "", preferredStyle: UIAlertController.Style.alert)
+        
+        alert.setValue(message, forKey: "attributedMessage")
+        
+        let conform : UIAlertAction = UIAlertAction.init(title: "同意", style: UIAlertAction.Style.default) { UIAlertAction in
+            UserDefaults.standard.set(true, forKey: "agreeStatus")
+            UserDefaults.standard.synchronize()
+            //更新用户授权高德SDK隐私协议状态. since 8.1.0
+            MAMapView.updatePrivacyAgree(AMapPrivacyAgreeStatus.didAgree)
+        }
+        
+        let cancel : UIAlertAction = UIAlertAction.init(title: "不同意", style: UIAlertAction.Style.default) { UIAlertAction in
+            UserDefaults.standard.set(false, forKey: "agreeStatus")
+            UserDefaults.standard.synchronize()
+            //更新用户授权高德SDK隐私协议状态. since 8.1.0
+            MAMapView.updatePrivacyAgree(AMapPrivacyAgreeStatus.notAgree)
+        }
+        
+        alert.addAction(conform)
+        alert.addAction(cancel)
+        
+        App.shared.window?.rootViewController?.present(alert, animated: true, completion: nil)
+    }
+}
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/root/DataView.swift b/ShenYin/ShenYin/UI/Sport/Sport/root/DataView.swift
new file mode 100644 (file)
index 0000000..d09ceef
--- /dev/null
@@ -0,0 +1,20 @@
+//
+//  DataView.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/1/21.
+//
+
+extension SportRootView{
+    class DataView: BaseView {
+        
+        
+        override func setupViews() {
+            backgroundColor = .color(.cellBg)
+        }
+        
+        override func setupLayout() {
+            
+        }
+    }
+}
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/root/GroupView.swift b/ShenYin/ShenYin/UI/Sport/Sport/root/GroupView.swift
new file mode 100644 (file)
index 0000000..575d9b7
--- /dev/null
@@ -0,0 +1,20 @@
+//
+//  GroupView.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/1/21.
+//
+
+extension SportRootView{
+    class GroupView: BaseView {
+        
+        
+        override func setupViews() {
+            backgroundColor = .color(.cellBg)
+        }
+        
+        override func setupLayout() {
+            
+        }
+    }
+}
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/root/PlanView.swift b/ShenYin/ShenYin/UI/Sport/Sport/root/PlanView.swift
new file mode 100644 (file)
index 0000000..05c6339
--- /dev/null
@@ -0,0 +1,20 @@
+//
+//  PlanView.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/1/21.
+//
+
+extension SportRootView{
+    class PlanView: BaseView {
+        
+        
+        override func setupViews() {
+            backgroundColor = .color(.cellBg)
+        }
+        
+        override func setupLayout() {
+            
+        }
+    }
+}
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/root/RouteView.swift b/ShenYin/ShenYin/UI/Sport/Sport/root/RouteView.swift
new file mode 100644 (file)
index 0000000..245babb
--- /dev/null
@@ -0,0 +1,20 @@
+//
+//  RouteView.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/1/21.
+//
+
+extension SportRootView{
+    class RouteView: BaseView {
+        
+        
+        override func setupViews() {
+            backgroundColor = .color(.cellBg)
+        }
+        
+        override func setupLayout() {
+            
+        }
+    }
+}
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/root/SportRootView.swift b/ShenYin/ShenYin/UI/Sport/Sport/root/SportRootView.swift
new file mode 100644 (file)
index 0000000..29ea350
--- /dev/null
@@ -0,0 +1,66 @@
+//
+//  SportVC.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/1/20.
+//
+
+import UIKit
+import JXSegmentedView
+
+class SportRootView: BaseView{
+    let sportType = SportTypeView()
+    let dataView = DataView()
+    let groupView = GroupView()
+    let planView = PlanView()
+    let routeView = RouteView()
+    
+    override func setupViews() {
+        addSubviews([sportType,dataView,groupView,planView,routeView])
+        dataView.do { v in
+            v.yc.setCornerRadius(12)
+        }
+        groupView.do { v in
+            v.yc.setCornerRadius(12)
+        }
+        planView.do { v in
+            v.yc.setCornerRadius(12)
+        }
+        routeView.do { v in
+            v.yc.setCornerRadius(12)
+        }
+    }
+    override func setupLayout() {
+        sportType.snp.makeConstraints { make in
+            make.left.right.equalToSuperview()
+            make.top.equalToSuperview().inset(20)
+            make.height.equalTo(80)
+        }
+        dataView.snp.makeConstraints { make in
+            make.left.right.equalToSuperview().inset(18)
+            make.top.equalTo(sportType.snp.bottom).offset(10)
+            make.height.equalTo(123)
+        }
+        groupView.snp.makeConstraints { make in
+            make.left.right.equalToSuperview().inset(18)
+            make.top.equalTo(dataView.snp.bottom).offset(10)
+            make.height.equalTo(140)
+        }
+        planView.snp.makeConstraints { make in
+            make.left.right.equalToSuperview().inset(18)
+            make.top.equalTo(groupView.snp.bottom).offset(10)
+            make.height.equalTo(65)
+        }
+        routeView.snp.makeConstraints { make in
+            make.left.right.equalToSuperview().inset(18)
+            make.top.equalTo(planView.snp.bottom).offset(10)
+            make.height.equalTo(180)
+        }
+    }
+}
+
+extension SportRootView: JXSegmentedListContainerViewListDelegate {
+    func listView() -> UIView {
+        return self
+    }
+}
diff --git a/ShenYin/ShenYin/UI/Sport/Sport/root/SportTypeView.swift b/ShenYin/ShenYin/UI/Sport/Sport/root/SportTypeView.swift
new file mode 100644 (file)
index 0000000..a6c0a71
--- /dev/null
@@ -0,0 +1,119 @@
+//
+//  SportTypeView.swift
+//  ShenYin
+//
+//  Created by liangshi on 2026/1/20.
+//
+
+
+enum SportType{
+    case run
+    case ride
+    case walk
+    
+    var name:String{
+        switch self {
+        case .run:
+            return "户外跑步"
+        case .ride:
+            return "户外骑行"
+        case .walk:
+            return "健走"
+        }
+    }
+    var icon:String{
+        switch self {
+        case .run:
+            return "sport_run"
+        case .ride:
+            return "sport_ride"
+        case .walk:
+            return "sport_walk"
+        }
+    }
+    static var all:[SportType] = [.run,.ride,.walk]
+}
+
+class SportTypeView: BaseView {
+    let run = SportTypeItem()
+    let ride = SportTypeItem()
+    let walk = SportTypeItem()
+
+    override func setupViews() {
+        addSubviews([run,ride,walk])
+        run.do { v in
+            v.type = .run
+            v.yc.addTap(target: self, action: #selector(runAction))
+        }
+        ride.do { v in
+            v.type = .ride
+            v.yc.addTap(target: self, action: #selector(rideAction))
+        }
+        walk.do { v in
+            v.type = .walk
+            v.yc.addTap(target: self, action: #selector(walkAction))
+        }
+    }
+    
+    override func setupLayout() {
+        run.snp.makeConstraints { make in
+            make.left.equalToSuperview().inset(38)
+            make.width.equalTo(50)
+            make.height.equalTo(80)
+            make.top.equalToSuperview()
+        }
+        ride.snp.makeConstraints { make in
+            make.left.equalTo(run.snp.right).offset(32)
+            make.width.equalTo(50)
+            make.height.equalTo(80)
+            make.top.equalToSuperview()
+        }
+        walk.snp.makeConstraints { make in
+            make.left.equalTo(ride.snp.right).offset(32)
+            make.width.equalTo(50)
+            make.height.equalTo(80)
+            make.top.equalToSuperview()
+        }
+    }
+    @objc func runAction(){
+        App.shared.goToPage(ReadyVC())
+    }
+    @objc func rideAction(){
+        
+    }
+    @objc func walkAction(){
+        
+    }
+}
+
+class SportTypeItem: BaseView {
+    private let icon = UIImageView()
+    private let titleLabel = UILabel()
+    var type:SportType = .run{
+        didSet{
+            titleLabel.text = type.name
+        }
+    }
+    override func setupViews() {
+        addSubviews([titleLabel,icon])
+        icon.do { v in
+            v.image = UIImage(named: type.icon)
+        }
+        titleLabel.do { v in
+            v.textColor = .color(.first)
+            v.font = .regular(10)
+        }
+    }
+    
+    override func setupLayout() {
+        icon.snp.makeConstraints { make in
+            make.size.equalTo(50)
+            make.top.equalToSuperview()
+            make.centerX.equalToSuperview()
+        }
+        titleLabel.snp.makeConstraints { make in
+            make.top.equalTo(icon.snp.bottom).offset(5)
+            make.centerX.equalTo(icon)
+        }
+    }
+}
index 6c82a0d..4a4f320 100644 (file)
@@ -43,6 +43,7 @@ class SportHomeVC: BaseVC {
         
         //        AudioPlayView.shared.show()
         self.view.addSubview(AudioPlayView.shared)
+//        MapManager.shared.setupSdk()
     }
     
     override func setupLayout(){
index a998e1e..52aaa18 100644 (file)
@@ -49,10 +49,12 @@ target 'ShenYin' do
 
   
   pod 'HorizonCalendar'#日历
-#  pod 'DSWaveformImage'
+
+  #高德地图
+  pod 'AMap3DMap-NO-IDFA', '10.0.700'
+  pod 'AMapLocation-NO-IDFA'
+  pod 'AMapSearch-NO-IDFA', '9.7.0'
   
-#  pod 'NVActivityIndicatorView', '~> 5.1.1'  # 最新稳定版
-#  pod 'EZAudio', '~> 1.1.0'
 end
 
 target 'playboy' do