将 expo-modules 与第 3 方本地 xcframework (iOS) 结合使用

kvb*_*vba 6 ios react-native expo react-native-native-module expo-module

我正在尝试使用 expo-modules 为官方 Spotify SDK 构建一个反应本机包装模块。我已.podspec使用s.vendored_frameworks. 示例应用程序的项目预构建工作正常,但框架的头文件不会被复制,并且在为模拟器构建应用程序时,我收到此错误:

\n
\xe2\x9d\x8c  (/Users/<username>/Library/Developer/Xcode/DerivedData/expospotifyexample-ayfjxgjzbhoakacqvfpiaawhvpwz/Build/Products/Debug-iphonesimulator/ExpoSpotify/ExpoSpotify-umbrella.h:13:9)\n\n  11 | #endif\n  12 | \n> 13 | #import "SpotifyAppRemote.h"\n     |         ^ 'SpotifyAppRemote.h' file not found\n  14 | #import "SpotifyiOS.h"\n  15 | #import "SPTAppRemote.h"\n  16 | #import "SPTAppRemoteAlbum.h"\n
Run Code Online (Sandbox Code Playgroud)\n

如果我手动将SDK的头文件复制到错误所在的路径,它就可以正常工作。

\n

我的文件夹结构(只是重要的部分):

\n
\xe2\x94\x9c\xe2\x94\x80 example/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 ios/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 Pods/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 Headers/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 Public/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 ExpoSpotify/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 ExpoSpotify.modulemap\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 ExpoSpotify-umbrella.h\n\xe2\x94\x9c\xe2\x94\x80 ios/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 SpotifyiOS.xcframework/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 ios-arm64_armv7/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 SpotifyiOS.framework/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 Headers/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 SpotifyAppRemote.h\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 Modules/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 module.modulemap\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 ios-arm64_i386_x86_64-simulator/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 SpotifyiOS.framework/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 Headers/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 SpotifyAppRemote.h\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 Modules/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 module.modulemap\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 Info.plist\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 ExpoSpotify.podspec\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 ExpoSpotifyModule.swift\n
Run Code Online (Sandbox Code Playgroud)\n

我的 .podspec 文件:

\n
require 'json'\n\npackage = JSON.parse(File.read(File.join(__dir__, '..', 'package.json')))\n\nPod::Spec.new do |s|\n  s.name           = 'ExpoSpotify'\n  s.version        = package['version']\n  s.summary        = package['description']\n  s.description    = package['description']\n  s.license        = package['license']\n  s.author         = package['author']\n  s.homepage       = package['homepage']\n  s.platform       = :ios, '13.0'\n  s.swift_version  = '5.4'\n  s.source         = { git: 'https://github.com/' }\n  s.static_framework = true\n\n  s.dependency 'ExpoModulesCore'\n\n  # Swift/Objective-C compatibility\n  s.pod_target_xcconfig = {\n    'DEFINES_MODULE' => 'YES',\n    'SWIFT_COMPILATION_MODE' => 'wholemodule',\n  }\n\n  s.preserve_paths = "ExpoSpotify/SpotifyiOS.xcframework/**/*"\n  s.vendored_frameworks = 'ExpoSpotify/SpotifyiOS.xcframework'\n  s.source_files = "**/*.{h,m,swift}", 'ExpoSpotify/SpotifyiOS.xcframework/**/Headers/*.{h,m}'\nend\n
Run Code Online (Sandbox Code Playgroud)\n

我注意到一件事。在示例应用程序example/ios/Pods/Headers/Public/ExpoSpotify-umbrella.h文件中,导入量加倍且平坦:

\n
#import "SpotifyAppRemote.h"\n... other headers\n#import "SpotifyAppRemote.h"\n... other headers\n
Run Code Online (Sandbox Code Playgroud)\n

但是当我将框架模块映射的路径添加到 .podspec 时:

\n

s.header_mappings_dir = 'ExpoSpotify/ios/SpotifyiOS.xcframework/**/Modules'

\n

那么导入是相对的(但路径错误)

\n
#import "../../../../../SpotifyiOS.xcframework/ios-arm64_armv7/SpotifyiOS.framework/Headers/SpotifyAppRemote.h"\n#import "../../../../../SpotifyiOS.xcframework/ios-arm64_i386_x86_64-simulator/SpotifyiOS.framework/Headers/SpotifyAppRemote.h"\n
Run Code Online (Sandbox Code Playgroud)\n

如果它放弃了路径中的 ExpoSpotify

\n
s.preserve_paths = "SpotifyiOS.xcframework/**/*"\n  s.vendored_frameworks = 'SpotifyiOS.xcframework'\n  s.source_files = "**/*.{h,m,swift}", 'SpotifyiOS.xcframework/**/Headers/*.{h,m}'\n  s.header_mappings_dir = 'SpotifyiOS.xcframework/**/Modules'\n
Run Code Online (Sandbox Code Playgroud)\n

导入路径更短(仍然错误):

\n
#import "../../ios-arm64_armv7/SpotifyiOS.framework/Headers/SpotifyAppRemote.h"\n#import "../../ios-arm64_i386_x86_64-simulator/SpotifyiOS.framework/Headers/SpotifyAppRemote.h"\n
Run Code Online (Sandbox Code Playgroud)\n

我使用的是配备 M2 处理器的 MacBook、macOS Ventura (13.3.1)、最新的 Xcode、Cocoapods 1.12.0。

\n