如何手动添加.xcframework到Flutter iOS插件?

ej83mcc0  于 2022-11-30  发布在  Flutter
关注(0)|答案(3)|浏览(305)

我正在尝试创建一个Flutter插件来使用一个本地库。我正在尝试使用的这个库存储在一个私有库中,可以与Swift Dependency Manager一起使用。
这让我很头疼,因为我不能在我的插件中添加一个私有仓库依赖项(我找不到一种方法在.podspec文件中做到这一点),所以我所做的:
1.我已经使用Swift Package Manager将插件添加到Example项目中
1.手动将MyDependency.xcframework文件夹复制到MyPlugin/ios文件夹
1.在podspec文件中引用它,如下所示:

s.preserve_paths = 'MyDependency.xcframework'
s.xcconfig = { 'OTHER_LDFLAGS' => '-framework MyDependency' }
s.vendored_frameworks = 'MyDependency.xcframework'

这样我就可以在插件的源代码中使用MyDependency。
我目前的问题是:这仅在模拟器中有效
在此之前,该项目在实际设备中运行时没有任何问题。
这是我每次尝试在真实设备中运行时收到的错误消息:

另外,我已经直接从Swift Dependency Manager中使用依赖项做了一个测试,运行良好。我认为问题是我将框架添加到插件的方式。

dbf7pr2w

dbf7pr2w1#

我通过在xxx.podspec中添加以下代码行来使我的代码工作:

s.preserve_paths = 'xxxxxx.xcframework/**/*'
s.xcconfig = { 'OTHER_LDFLAGS' => '-framework xxxxxx' }
s.vendored_frameworks = 'xxxxxx.xcframework'

请注意s.preserve_paths末尾的/**/*
下面是完整的xxx.podspec文件:

#
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
# Run `pod lib lint xxx.podspec` to validate before publishing.
#
Pod::Spec.new do |s|
  s.name             = 'xxx'
  s.version          = '1.0.0'
  s.summary          = 'xxx'
  s.description      = <<-DESC
xxx is a flutter plugin
                       DESC
  s.homepage         = 'https://example.com'
  s.license          = { :file => '../LICENSE', :type => 'BSD' }
  s.author           = { 'xxx' => 'email@example.com' }
  s.source           = { :path => '.' }
  s.source_files = 'Classes/**/*'
  s.dependency 'Flutter'
  s.platform = :ios, '10.0'

  # Flutter.framework does not contain a i386 slice.
  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
  s.swift_version = '5.0'

  s.preserve_paths = 'xxxxxx.xcframework/**/*'
  s.xcconfig = { 'OTHER_LDFLAGS' => '-framework xxxxxx' }
  s.vendored_frameworks = 'xxxxxx.xcframework'
end

确保将xxxxxx.xcframework目录复制到.../xxx/ios/xxxxxx.xcframework(您的xxx.podspec插件所在的位置)

xxxxxx.xcframework添加到Pods方案以便能够导入它

运行flutter命令创建插件ie时,Frameworks目录应该在Pods方案下。
flutter create --org com.xxx --template=plugin --platforms=android,ios -a java -i swift xxx
来源:开发软件包和插件

  • (如果没有,请添加)*

1.导航到Pods方案,然后右键单击Frameworks
1.单击Add Files to "Pods"...

1.导航到xxxxxx.xcframework所在的ios目录的根目录
1.取消选中Copy items if needed
1.选择Create folder references
1.检查Pods-Runner
1.检查您的插件ie. xxx
1.单击Add

xxxxxx.xcframework嵌入到项目中

  • (这应该允许您运行/发布到实际设备)*

1.点击Pods方案
1.在TARGETS中选择Pods-Runner
1.单击General选项卡
1.确保xxxxx.xcframework位于Frameworks and Libraries下方(如果没有,请单击+添加)
1.将Embed更改为Embed & Sign

1.点击你的插件,即xxx
1.确保Frameworks and Libraries下面有xxxxx.xcframework
1.将Embed更改为Embed & Sign
x1c4d 1x指令集
1.同样,对于Pods scheme下面的两个目标,接下来的步骤应该已经很好了,但只需检查一下
1.单击Build Phases
1.单击Link Binary With Libraries
1.确保xxxxx.xcframework存在,如果不存在,请单击+添加xxxxx.xcframework,并将Status设置为Required
现在,您应该能够导入框架并在代码中引用它,并且还应该可以完美地发布。
希望这能有所帮助,祝你好运。我希望这不会很快再次改变

  • 祈祷吧 *
eqfvzcg8

eqfvzcg82#

在做了一些研究之后,我发现some links给了我一个关于真正问题的想法...
为了解决这个问题,我在主项目的构建过程中添加了一个简单的脚本。
此脚本将代码签名添加到内部.framework文件。

cd "${CODESIGNING_FOLDER_PATH}/Frameworks/"

# flatten nested frameworks by copying to APP.app/Frameworks
for framework in *; do
    if [ -d "$framework" ]; then
        if [ -d "${framework}/Frameworks" ]; then
            echo "Moving embedded frameworks from ${framework} to ${PRODUCT_NAME}.app/Frameworks"
            cp -R "${framework}/Frameworks/" .
            rm -rf "${framework}/Frameworks"
        fi
    fi
done

# remove any leftover nested frameworks (i.e. 'PackageName_359AFEED79E48935_PackageProduct.framework')
for framework in *; do
    if [ -d "$framework" ]; then
        if [ -d "${framework}/Frameworks" ]; then
            echo "Removing embedded frameworks from ${framework} to ${PRODUCT_NAME}.app/Frameworks"
            rm -rf "${framework}/Frameworks"
        fi
    fi
done

# codesign for Debugging on device
if [ "${CONFIGURATION}" == "Debug" ] & [ "${SDKROOT}" != *Simulator* ] ; then

    echo "Code signing frameworks..."
    find "${CODESIGNING_FOLDER_PATH}/Frameworks" -maxdepth 1 -name '*.framework' -print0 | while read -d $'\0' framework
    do
        # only sign frameworks without a signature
        if ! codesign -v "${framework}"; then
            codesign --force --sign "${EXPANDED_CODE_SIGN_IDENTITY}" --preserve-metadata=identifier,entitlements --timestamp=none "${framework}"
            echo "Added missing signature to '${framework}'"
        fi
    done
fi
vqlkdk9b

vqlkdk9b3#

如果以上修复都不起作用,但仍然出现类似“framework xxx not found”的错误,请验证xxx.xcframeworkxxx.framework文件夹是否同名。
我花了几天时间未能将.xcframework添加到Flutter插件中,结果发现命名不匹配。

相关问题