Преглед изворни кода

first adapt iOS map to project

Groot пре 8 месеци
родитељ
комит
8380406817
23 измењених фајлова са 86 додато и 51 уклоњено
  1. 3 11
      ios/Runner.xcodeproj/project.pbxproj
  2. 8 5
      ios/Runner/Base.lproj/Main.storyboard
  3. 21 4
      plugins/map/lib/src/core/map_controller.dart
  4. 4 1
      plugins/map/lib/src/entity/camera_position.dart
  5. 10 0
      plugins/map/lib/src/entity/codable.dart
  6. 4 1
      plugins/map/lib/src/entity/lat_lng.dart
  7. 4 1
      plugins/map/lib/src/entity/map_location.dart
  8. 4 1
      plugins/map/lib/src/entity/map_padding.dart
  9. 3 1
      plugins/map/lib/src/entity/marker.dart
  10. 4 1
      plugins/map/lib/src/entity/trace_location.dart
  11. 1 1
      plugins/map_mapkit_ios/ios/Classes/MapMapkitIosPlugin.swift
  12. 1 1
      plugins/map_mapkit_ios/ios/Classes/MapView/MapFlutterView.swift
  13. 1 1
      plugins/map_mapkit_ios/ios/Classes/MapView/Model/Constans.swift
  14. 1 1
      plugins/map_mapkit_ios/ios/Classes/MapView/Model/MapMarkerSupportType.swift
  15. 2 2
      plugins/map_mapkit_ios/ios/Classes/MapView/Model/MapProtocol.swift
  16. 10 10
      plugins/map_mapkit_ios/ios/Classes/MapView/Model/Models.swift
  17. 5 9
      plugins/map_mapkit_ios/ios/Classes/MapView/ViewModel/MapViewModel.swift
  18. 0 0
      plugins/map_mapkit_ios/ios/Resources/com.shishi.dingwei_friend.png
  19. 0 0
      plugins/map_mapkit_ios/ios/Resources/com.shishi.dingwei_mine.png
  20. 0 0
      plugins/map_mapkit_ios/ios/Resources/com.shishi.dingwei_mine_selected.png
  21. 0 0
      plugins/map_mapkit_ios/ios/Resources/com.shishi.dingwei_traceEndFriend.png
  22. 0 0
      plugins/map_mapkit_ios/ios/Resources/com.shishi.dingwei_traceEndMine.png
  23. 0 0
      plugins/map_mapkit_ios/ios/Resources/com.shishi.dingwei_traceStart.png

+ 3 - 11
ios/Runner.xcodeproj/project.pbxproj

@@ -316,14 +316,10 @@
 			inputFileListPaths = (
 				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
 			);
-			inputPaths = (
-			);
 			name = "[CP] Copy Pods Resources";
 			outputFileListPaths = (
 				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
 			);
-			outputPaths = (
-			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
@@ -337,14 +333,10 @@
 			inputFileListPaths = (
 				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
 			);
-			inputPaths = (
-			);
 			name = "[CP] Embed Pods Frameworks";
 			outputFileListPaths = (
 				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
 			);
-			outputPaths = (
-			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
@@ -504,7 +496,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.trace.location;
+				PRODUCT_BUNDLE_IDENTIFIER = com.shishi.dingweis;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
 				SWIFT_VERSION = 5.0;
@@ -688,7 +680,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.trace.location;
+				PRODUCT_BUNDLE_IDENTIFIER = com.shishi.dingweis;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -712,7 +704,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.trace.location;
+				PRODUCT_BUNDLE_IDENTIFIER = com.shishi.dingweis;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
 				SWIFT_VERSION = 5.0;

+ 8 - 5
ios/Runner/Base.lproj/Main.storyboard

@@ -1,8 +1,10 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="23727" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23721"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <scenes>
         <!--Flutter View Controller-->
@@ -14,13 +16,14 @@
                         <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
                     </layoutGuides>
                     <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
-                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
+                        <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                     </view>
                 </viewController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
             </objects>
+            <point key="canvasLocation" x="140" y="-2"/>
         </scene>
     </scenes>
 </document>

+ 21 - 4
plugins/map/lib/src/core/map_controller.dart

@@ -1,10 +1,12 @@
 import 'dart:convert';
+import 'dart:io';
 
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_map/flutter_map.dart';
 import 'package:flutter_map/src/consts/map_constants.dart';
 import 'package:flutter_map/src/entity/camera_position.dart';
+import 'package:flutter_map/src/entity/codable.dart';
 import 'package:flutter_map/src/entity/lat_lng.dart';
 import 'package:flutter_map/src/entity/marker.dart';
 import 'package:flutter_map/src/interface/map_fun_interface.dart';
@@ -45,11 +47,12 @@ class MapController
   @override
   void updateOrAddMarkers(List<Marker> markers) {
     if (_isDisposed || markers.isEmpty) return;
-    final serialized = jsonEncode(markers);
+    final serialized = _encodeJson(markers);
     final params = {
       'method': MapConstants.methodUpdateOrAddMarkers,
       'args': serialized
     };
+    debugPrint("updateOrAddMarkers...params==>$params");
     if (_channel != null) {
       _executeMethod(params);
     } else {
@@ -97,7 +100,7 @@ class MapController
   @override
   void replaceAllMarkers(List<Marker> markers) {
     if (_isDisposed) return;
-    final serialized = jsonEncode(markers);
+    final serialized = _encodeJson(markers);
     final params = {
       'method': MapConstants.methodReplaceAllMarkers,
       'args': serialized
@@ -120,10 +123,10 @@ class MapController
       {bool isAnimateCamera = true, MapPadding? mapPadding}) {
     if (_isDisposed || points.isEmpty) return;
     Map<String, dynamic> map = {};
-    map['points'] = jsonEncode(points);
+    map['points'] = _encodeJson(points);
     map['isAnimateCamera'] = isAnimateCamera;
     if (mapPadding != null) {
-      map['mapPadding'] = jsonEncode(mapPadding);
+      map['mapPadding'] = _encodeJson(mapPadding);
     }
     final params = {'method': MapConstants.methodAddPolyline, 'args': map};
     debugPrint("addPolyline...params==>$params");
@@ -146,4 +149,18 @@ class MapController
       _pendingOperations.add(params);
     }
   }
+
+  /// iOS 需要一个Map 而不是json string
+  dynamic _encodeJson(dynamic object) {
+    // iOS平台直接返回对象或转换为JSON对象
+    if (Platform.isIOS) {
+      if (object is List) {
+        return object.map((item) => item is Codable ? item.toJson() : item).toList();
+      }
+      return object is Codable ? object.toJson() : object;
+    }
+    
+    // 其他平台序列化为JSON字符串
+    return jsonEncode(object);
+  }
 }

+ 4 - 1
plugins/map/lib/src/entity/camera_position.dart

@@ -1,4 +1,6 @@
-class CameraPosition {
+import "codable.dart";
+
+class CameraPosition implements Codable {
   double? longitude;
 
   double? latitude;
@@ -11,6 +13,7 @@ class CameraPosition {
     required this.zoom,
   });
 
+  @override
   Map<String, dynamic> toJson() {
     return {
       'longitude': longitude,

+ 10 - 0
plugins/map/lib/src/entity/codable.dart

@@ -0,0 +1,10 @@
+
+abstract class Codable {
+  /// 将对象转换为JSON格式
+  Map<String, dynamic> toJson();
+  
+  /// 从JSON格式创建对象
+  factory Codable.fromJson(Map<String, dynamic> json) {
+    throw UnimplementedError('子类必须实现fromJson工厂构造函数');
+  }
+}

+ 4 - 1
plugins/map/lib/src/entity/lat_lng.dart

@@ -1,10 +1,13 @@
-class LatLng {
+import "codable.dart";
+
+class LatLng implements Codable {
   double? latitude;
 
   double? longitude;
 
   LatLng({required this.latitude, required this.longitude});
 
+  @override
   Map<String, dynamic> toJson() {
     return {
       'latitude': latitude,

+ 4 - 1
plugins/map/lib/src/entity/map_location.dart

@@ -1,4 +1,6 @@
-class MapLocation {
+import "codable.dart";
+
+class MapLocation implements Codable {  
   final int? time;
 
   final String? address;
@@ -23,6 +25,7 @@ class MapLocation {
     required this.longitude,
   });
 
+  @override
   Map<String, dynamic> toJson() {
     return {
       'time': time,

+ 4 - 1
plugins/map/lib/src/entity/map_padding.dart

@@ -1,4 +1,6 @@
-class MapPadding {
+import "codable.dart";
+
+class MapPadding implements Codable {
   final double left;
   final double top;
   final double right;
@@ -6,6 +8,7 @@ class MapPadding {
 
   MapPadding({this.left = 0, this.top = 0, this.right = 0, this.bottom = 0});
 
+  @override
   Map<String, dynamic> toJson() {
     return {
       'left': left,

+ 3 - 1
plugins/map/lib/src/entity/marker.dart

@@ -1,6 +1,7 @@
 import '../consts/marker_type.dart';
+import "codable.dart";  
 
-class Marker {
+class Marker implements Codable {
   String id;
 
   String markerName;
@@ -22,6 +23,7 @@ class Marker {
     this.isSelected = false,
   });
 
+  @override
   Map<String, dynamic> toJson() {
     return {
       'id': id,

+ 4 - 1
plugins/map/lib/src/entity/trace_location.dart

@@ -1,4 +1,6 @@
-class TraceLocation {
+import 'codable.dart';
+
+class TraceLocation implements Codable {
   double? latitude;
 
   double? longitude;
@@ -12,6 +14,7 @@ class TraceLocation {
   TraceLocation(
       {this.latitude, this.longitude, this.time, this.bearing, this.speed});
 
+  @override
   Map<String, dynamic> toJson() {
     return {
       'latitude': latitude,

+ 1 - 1
plugins/map_mapkit_ios/ios/Classes/MapMapkitIosPlugin.swift

@@ -2,7 +2,7 @@ import Flutter
 import UIKit
 
 enum MapSupportedPackage: String {
-    case traceLocation1 = "com.trace.location"
+    case traceLocation1 = "com.shishi.dingwei"
 }
 
 var currentPackage: MapSupportedPackage {

+ 1 - 1
plugins/map_mapkit_ios/ios/Classes/MapView/MapFlutterView.swift

@@ -35,7 +35,7 @@ class MapFlutterView: NSObject, FlutterPlatformView {
 
     init(withFrame frame: CGRect, viewIdentifier viewId: Int64, arguments args: Any?, binaryMessenger messenger: FlutterBinaryMessenger) {
         contentView = UIView()
-        methodChannel = FlutterMethodChannel(name: MapKitConstans.methodChannelName, binaryMessenger: messenger)
+        methodChannel = FlutterMethodChannel(name: MapKitConstans.methodChannelName + "\(viewId)", binaryMessenger: messenger)
         super.init()
         createMapView()
         setupMethodChannel()

+ 1 - 1
plugins/map_mapkit_ios/ios/Classes/MapView/Model/Constans.swift

@@ -8,7 +8,7 @@
 import Foundation
 
 struct MapKitConstans {
-    static let methodChannelName: String = "atmob_map_method_channel"
+    static let methodChannelName: String = "com.atmob.flutter_map/map_view_"
     
     static let mapViewId: String = "com.atmob.flutter.map"
 }

+ 1 - 1
plugins/map_mapkit_ios/ios/Classes/MapView/Model/MapMarkerSupportType.swift

@@ -48,7 +48,7 @@ enum MarkerType: Int, MapMarkerSupportType {
     case traceEndMine = 5
     
     var supportSelected: Bool {
-        return self == .mine || self == .friend
+        return self == .mine
     }
     func imageName(selected: Bool) -> String {
         let prefixName: String = currentPackage.rawValue

+ 2 - 2
plugins/map_mapkit_ios/ios/Classes/MapView/Model/MapProtocol.swift

@@ -26,7 +26,7 @@ protocol MapCapability {
     func initialize(args: [String: Any]?, result: @escaping FlutterResult)
 
     // 处理地图添加Marker
-    func handleMapAddMarker(args: [String: Any]?, result: @escaping FlutterResult)
+    func handleMapAddMarker(args: [[String: Any]]?, result: @escaping FlutterResult)
     
     // 处理地图添加Polyline
     func handleMapAddPolyline(args: [String: Any]?, result: @escaping FlutterResult)
@@ -59,7 +59,7 @@ extension MapCapability {
         case .methodMapMoveCamera, .methodMapAnimateCamera:
             handleMapMoveCamera(args: call.arguments as? [String: Any], result: result)
         case .methodUpdateOrAddMarkers:
-            handleMapAddMarker(args: call.arguments as? [String: Any], result: result)
+            handleMapAddMarker(args: call.arguments as? [[String: Any]], result: result)
         case .methodMapClear:
             handleMapClearMarkers(result: result)
         case .methodReplaceAllMarkers:

+ 10 - 10
plugins/map_mapkit_ios/ios/Classes/MapView/Model/Models.swift

@@ -9,11 +9,14 @@ import Foundation
 import MapKit
 
 extension Decodable {
-    static func fromJson(json: [String: Any]) -> Self? {
-        guard let data = try? JSONSerialization.data(withJSONObject: json, options: []) else {
+    static func fromJson(json: Any) -> Self? {
+        do {
+            let data = try JSONSerialization.data(withJSONObject: json, options: [])
+            return try JSONDecoder().decode(Self.self, from: data)
+        } catch {
+            print(error.localizedDescription)
             return nil
         }
-        return try? JSONDecoder().decode(Self.self, from: data)
     }
 }
 
@@ -54,11 +57,6 @@ class ATMapPolyline: NSObject, Codable {
         return MKPolyline(coordinates: points, count: points.count)
     }
 
-    init(points: [CLLocationCoordinate2D], mapPadding: ATMapPadding? = nil) {
-        self.points = points
-        self.mapPadding = mapPadding
-    }
-    
     enum CodingKeys: String, CodingKey {
         case points, mapPadding
     }
@@ -82,7 +80,7 @@ class ATMapPolyline: NSObject, Codable {
 
 class ATMapMarker: NSObject, Codable {
     var id: String
-    var markerName: String
+    var markerName: String?
     var latitude: CGFloat
     var longitude: CGFloat
     var isSelected: Bool
@@ -95,7 +93,9 @@ class ATMapMarker: NSObject, Codable {
     required init(from decoder: Decoder) throws {
         let container = try decoder.container(keyedBy: CodingKeys.self)
         id = try container.decode(String.self, forKey: .id)
-        markerName = try container.decode(String.self, forKey: .markerName)
+        if container.contains(.markerName) {
+            markerName = try container.decodeIfPresent(String.self, forKey: .markerName)
+        }
         latitude = try container.decode(CGFloat.self, forKey: .latitude)
         longitude = try container.decode(CGFloat.self, forKey: .longitude)
         isSelected = try container.decode(Bool.self, forKey: .isSelected)

+ 5 - 9
plugins/map_mapkit_ios/ios/Classes/MapView/ViewModel/MapViewModel.swift

@@ -50,25 +50,21 @@ class MapViewModel: NSObject, ObservableObject, MapCapability {
         }
         
         let center = CLLocationCoordinate2D(latitude: cameraPosition.latitude, longitude: cameraPosition.longitude)
-        let span = MKCoordinateSpan(latitudeDelta: cameraPosition.zoom, longitudeDelta: cameraPosition.zoom)
+        let zoome = cameraPosition.zoom / 10000
+        let span = MKCoordinateSpan(latitudeDelta: zoome, longitudeDelta: zoome)
         
         currentRegion = MKCoordinateRegion(center: center, span: span)
         result(nil)
     }
 
     // 处理地图添加Marker
-    func handleMapAddMarker(args: [String: Any]?, result: @escaping FlutterResult) {
-        guard let args = args, let marker = ATMapMarker.fromJson(json: args) else {
+    func handleMapAddMarker(args: [[String: Any]]?, result: @escaping FlutterResult) {
+        guard let args = args, let markers = [ATMapMarker].fromJson(json: args) else {
             result(paramsDecodeError)
             return
         }
 
-        // 检查是否已存在相同ID的标记,如果有则先移除
-        if let index = markers.firstIndex(where: { $0.id == marker.id }) {
-            markers.remove(at: index)
-        }
-        
-        markers.append(marker)
+        self.markers = markers
         result(nil)
     }
 

plugins/map_mapkit_ios/ios/Resources/com.trace.location_friend.png → plugins/map_mapkit_ios/ios/Resources/com.shishi.dingwei_friend.png


plugins/map_mapkit_ios/ios/Resources/com.trace.location_mine.png → plugins/map_mapkit_ios/ios/Resources/com.shishi.dingwei_mine.png


plugins/map_mapkit_ios/ios/Resources/com.trace.location_mine_selected.png → plugins/map_mapkit_ios/ios/Resources/com.shishi.dingwei_mine_selected.png


plugins/map_mapkit_ios/ios/Resources/com.trace.location_traceEndFriend.png → plugins/map_mapkit_ios/ios/Resources/com.shishi.dingwei_traceEndFriend.png


plugins/map_mapkit_ios/ios/Resources/com.trace.location_traceEndMine.png → plugins/map_mapkit_ios/ios/Resources/com.shishi.dingwei_traceEndMine.png


plugins/map_mapkit_ios/ios/Resources/com.trace.location_traceStart.png → plugins/map_mapkit_ios/ios/Resources/com.shishi.dingwei_traceStart.png