diff --git a/Vendor/AMap/README.md b/Vendor/AMap/README.md index 2bba926..87bd3bd 100644 --- a/Vendor/AMap/README.md +++ b/Vendor/AMap/README.md @@ -16,10 +16,23 @@ 2. 点 `+` → Add Other → Add Files → 把 `Vendor/AMap/AMapFoundationKit.framework` 和 `AMapLocationKit.framework` 一起加入 3. 两个都设为 **Do Not Embed**(高德 fat `.framework` 是静态库,不能 Embed;Embed 会触发链接器对 `__OBJC` 段重复符号错误) 4. Build Settings → Framework Search Paths 自动会被 Xcode 写入 `$(PROJECT_DIR)/Vendor/AMap` -5. Clean Build Folder 后 BuildProject +5. **必须额外 link 3 个系统 framework**(关键!否则真机链接器报 Undefined symbol,模拟器可能不报): + - **SystemConfiguration.framework** ← `_CNCopyCurrentNetworkInfo` / `_SCNetworkReachability*` + - **CoreTelephony.framework** ← `_OBJC_CLASS_$_CTTelephonyNetworkInfo` + - **ExternalAccessory.framework** ← `_OBJC_CLASS_$_EAAccessoryManager` + + 操作:同样 `+` → 搜索框输入 framework 名 → Add(Embed = Do Not Embed)。 + + 原因:AMap 是静态库(fat .framework),它内部引用的系统 API 不会被自动带入 transitive 依赖,必须项目方手动 link。CocoaPods 时代由 podspec 自动声明这些依赖(daoqi msext 走 Pods 故未在 pbxproj 显式 link ExternalAccessory),但本项目走 Vendor 手动接入路线,必须显式补齐。 + +6. Clean Build Folder 后 BuildProject 接入完毕后,源码内 `#if canImport(AMapLocationKit)` 守卫将激活真实路径。 +## 如果未来真机链接报 C++ symbol 缺失(`std::__1::*`) + +加 **libc++.tbd**(同样 `+` 搜索)— 高德 SDK 内部含 C++ 代码,部分版本需要显式 link 系统 C++ 库。daoqi msext 已显式 link `libc++.tbd` + `libc++.1.tbd`;当前 ylgamehall 在 2.12.0 上未触发,先不加;触发再补。 + ## 已知限制:M 芯片 Mac 模拟器无法链接 **症状**:M Mac + iOS-simulator target 链接报 `Building for 'iOS-simulator', but linking in object file (... AMapLocationKit[arm64]) built for 'iOS'`。 diff --git a/docs/SDK-Integration-Guide.md b/docs/SDK-Integration-Guide.md index f77a9df..b9d262e 100644 --- a/docs/SDK-Integration-Guide.md +++ b/docs/SDK-Integration-Guide.md @@ -42,7 +42,13 @@ - `Vendor/AMap/AMapFoundationKit.framework` - `Vendor/AMap/AMapLocationKit.framework` 4. 两个的 **Embed** 列都选 **Do Not Embed**(关键,别错——静态 fat framework,Embed 会触发 `__OBJC` 段重复符号错) -5. ⌘B 编译 — **target 必须选真机**或 Generic iOS Device,模拟器 target 会因 simulator-arm64 slice 缺失而链接失败(按设计) +5. **同一面板再 `+` 加 3 个系统 framework**(关键!漏一个真机链接器立即报 Undefined symbol): + - **SystemConfiguration.framework** + - **CoreTelephony.framework** + - **ExternalAccessory.framework** + + 全部 **Do Not Embed**。详细原因见 `Vendor/AMap/README.md` 「工程接入步骤」第 5 步。 +6. ⌘B 编译 — **target 必须选真机**或 Generic iOS Device,模拟器 target 会因 simulator-arm64 slice 缺失而链接失败(按设计) ### A.3 添加七牛 SPM 依赖(远程) diff --git a/ylgamehall.xcodeproj/project.pbxproj b/ylgamehall.xcodeproj/project.pbxproj index d54d3f8..023ea4d 100644 --- a/ylgamehall.xcodeproj/project.pbxproj +++ b/ylgamehall.xcodeproj/project.pbxproj @@ -13,6 +13,9 @@ 1A2954E02FE99C2C009E703E /* WechatOpenSDK-NoPay.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A2954DE2FE99C2C009E703E /* WechatOpenSDK-NoPay.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 1A2954E32FE99C53009E703E /* AMapFoundationKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A2954E22FE99C53009E703E /* AMapFoundationKit.framework */; }; 1A2954E62FE99C63009E703E /* AMapLocationKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A2954E52FE99C63009E703E /* AMapLocationKit.framework */; }; + 1A2954ED2FE9BA49009E703E /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A2954EC2FE9BA49009E703E /* SystemConfiguration.framework */; }; + 1A2954EF2FE9BA6E009E703E /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A2954EE2FE9BA6E009E703E /* CoreTelephony.framework */; }; + 1A2954F12FE9BA7C009E703E /* ExternalAccessory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A2954F02FE9BA7C009E703E /* ExternalAccessory.framework */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -33,6 +36,9 @@ 1A2954DE2FE99C2C009E703E /* WechatOpenSDK-NoPay.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = "WechatOpenSDK-NoPay.xcframework"; path = "Vendor/WechatSDK/WechatOpenSDK-NoPay.xcframework"; sourceTree = ""; }; 1A2954E22FE99C53009E703E /* AMapFoundationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AMapFoundationKit.framework; path = Vendor/AMap/AMapFoundationKit.framework; sourceTree = ""; }; 1A2954E52FE99C63009E703E /* AMapLocationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AMapLocationKit.framework; path = Vendor/AMap/AMapLocationKit.framework; sourceTree = ""; }; + 1A2954EC2FE9BA49009E703E /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 1A2954EE2FE9BA6E009E703E /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; + 1A2954F02FE9BA7C009E703E /* ExternalAccessory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExternalAccessory.framework; path = System/Library/Frameworks/ExternalAccessory.framework; sourceTree = SDKROOT; }; 1A714BD22FE8047A00913338 /* ylgamehall.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ylgamehall.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -64,8 +70,11 @@ files = ( 1A2954622FE840DA009E703E /* ZIPFoundation in Frameworks */, 1A2954E62FE99C63009E703E /* AMapLocationKit.framework in Frameworks */, + 1A2954EF2FE9BA6E009E703E /* CoreTelephony.framework in Frameworks */, 1A2954E32FE99C53009E703E /* AMapFoundationKit.framework in Frameworks */, 1A2954DA2FE97D61009E703E /* Qiniu in Frameworks */, + 1A2954ED2FE9BA49009E703E /* SystemConfiguration.framework in Frameworks */, + 1A2954F12FE9BA7C009E703E /* ExternalAccessory.framework in Frameworks */, 1A2954DF2FE99C2C009E703E /* WechatOpenSDK-NoPay.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -76,6 +85,9 @@ 1A2954DB2FE99B2F009E703E /* Frameworks */ = { isa = PBXGroup; children = ( + 1A2954F02FE9BA7C009E703E /* ExternalAccessory.framework */, + 1A2954EE2FE9BA6E009E703E /* CoreTelephony.framework */, + 1A2954EC2FE9BA49009E703E /* SystemConfiguration.framework */, 1A2954E52FE99C63009E703E /* AMapLocationKit.framework */, 1A2954E22FE99C53009E703E /* AMapFoundationKit.framework */, 1A2954DE2FE99C2C009E703E /* WechatOpenSDK-NoPay.xcframework */,