11

在创建这样的 xcframework 时

xcodebuild archive -project endiosOne-iOS.xcodeproj -scheme EOFoundation -destination="iOS" -archivePath /tmp/xcf/ios.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphoneos SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

xcodebuild archive -project endiosOne-iOS.xcodeproj -scheme EOFoundation -destination="iOS Simulator" -archivePath /tmp/xcf/iossimulator.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphonesimulator SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

xcodebuild -create-xcframework -framework /tmp/xcf/ios.xcarchive/Products/Library/Frameworks/EOFoundation.framework -framework /tmp/xcf/iossimulator.xcarchive/Products/Library/Frameworks/EOFoundation.framework -output /tmp/ xcf/EOFoundation.xcframework

然后将框架添加到现有项目或新项目中,我们在导入框架时会收到此错误。

无法从其模块接口构建模块“EOFoundation”;它可能已损坏或在生成时触发了 Swift 编译器中的错误

使用 xcode 12.1,也尝试使用 Xcode 11。尝试使用新的 UIKit 应用程序和新的仅 SwiftUI 应用程序

我们得到以下 UIKit 错误UIKit 错误

我无法像在 UIKit 中那样修复 UIkit 错误:不幸的是,苹果没有给我们提供很多关于如何解决这个问题的信息。

我该如何解决这个问题,以便我使用在另一个项目中生成的 xcframework?

4

4 回答 4

5

我针对此问题向 Apple 发布了反馈请求,他们提出了以下建议:

我们可以告诉您,有一个已知问题符合您的描述:如果您的模块名为“MyModuleName”,并且它还声明或导入了一种名为“MyModuleName”的类型,则文件中应该引用该模块的名称将是而是解析为类型,当您尝试导入它时会导致错误。Swift 开源项目的错误跟踪器在https://bugs.swift.org/browse/SR-14195的一篇公开文章中描述了此错误及其解决方法

果然,我从框架中导出的类型与我从中导入它的模块完全一致。重命名类型为我解决了这个问题。

于 2021-03-09T16:50:12.210 回答
2

就我而言,当我更改 iOS 部署目标时,我依赖的预编译 XCFramework 没有重新编译。我重新编译了 XCFramework 并解决了这个问题。

于 2021-09-14T00:58:53.477 回答
0

解决方案是删除扩展 UITextView 中的公共方法: UITextViewDelegate {

并简单地将其添加到文件私有的 UITextView 的子类中。

于 2021-01-03T14:41:10.890 回答
0

我创建了一个小脚本,通过修复 swiftinterface 文件来解决这个问题。

  • 替换框架名称
  • 添加或删除平台(目前生成ios设备和ios模拟器)

    #!/bin/bash
    
    FrameworkName="MyLibAndClassName"
    
    rm -rf build/
    
    xcodebuild archive -scheme "$FrameworkName" \
        -configuration Debug -destination 'generic/platform=iOS' \
        -archivePath "./build/$FrameworkName.framework-iphoneos.xcarchive" \
        SKIP_INSTALL=NO \
        BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
    
    xcodebuild archive -scheme "$FrameworkName" \
        -configuration Debug -destination 'generic/platform=iOS Simulator' \
        -archivePath "./build/$FrameworkName.framework-iphonesimulator.xcarchive" \
        SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
    
    # Fix https://bugs.swift.org/browse/SR-14195 (caused by https://bugs.swift.org/browse/SR-898)
    pattern="./build/$FrameworkName.framework-iphoneos.xcarchive/Products/Library/Frameworks/$FrameworkName.framework/Modules/$FrameworkName.swiftmodule/*.swiftinterface"
    grep -rli "$FrameworkName.$FrameworkName" $pattern \
         | xargs sed -i '' "s,$FrameworkName.$FrameworkName,$FrameworkName,g"
    # end fix
    
    xcodebuild -create-xcframework \
        -framework "./build/$FrameworkName.framework-iphoneos.xcarchive/Products/Library/Frameworks/$FrameworkName.framework" \
        -framework "./build/$FrameworkName.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/$FrameworkName.framework" \
        -output "./build/$FrameworkName.xcframework"
    
    # Wait for process completion and verify result
    pid=$!      
    wait $pid
    echo "Process with PID $pid has finished with Exit status: $?"
    [[ ! -d "./build/$FrameworkName.xcframework/" ]] && { 
        msg="[ERROR] expected ./build/$FrameworkName.xcframework/ to exist"; echo -e $msg
        exit 1
    }
于 2022-02-20T15:20:58.943 回答