如何为依赖于使用cocoapods添加的其他框架的所有架构构建可可触摸框架?

索拉巴蒂亚

我想为为模拟器和设备构建的输出框架创建一个私有的cocoapod。

我创建了一个Cocoa触摸框架,其中使用Cocoapods集成了CocoaLumberjack。我想为所有可能的架构(模拟器和设备)构建框架。

默认情况下,构建设置

 'Build Active Architectures Only' is set to (Debug - Yes, Release - No).

一旦将此调试设置设置为“否”,构建将失败,并显示以下链接器错误:

Undefined symbols for architecture i386:
"_OBJC_CLASS_$_DDASLLogger", referenced from:
  objc-class-ref in MyManager.o
"_OBJC_CLASS_$_DDLog", referenced from:
  objc-class-ref in MyManager.o
"_OBJC_CLASS_$_DDTTYLogger", referenced from:
  objc-class-ref in MyManager.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我知道CocoaLumberjack仅适用于调试版本中的活动架构。

因此,我将“构建用于调试的活动体系结构”切换回“是”,并成功构建了框架。

为了构建适用于所有架构的框架,我使用了在构建阶段中添加的运行脚本,该脚本还声称将ios-device和ios-simulator构建合并为一个。这是脚本:

    set -e
    set +u
    # Avoid recursively calling this script.
    if [[ $SF_MASTER_SCRIPT_RUNNING ]]
    then
    exit 0
    fi
    set -u
    export SF_MASTER_SCRIPT_RUNNING=1


    # Constants
    SF_TARGET_NAME=${PROJECT_NAME}
    UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal

    # Take build target
    if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]
    then
    SF_SDK_PLATFORM=${BASH_REMATCH[1]}
    else
    echo "Could not find platform name from SDK_NAME: $SDK_NAME"
    exit 1
    fi

    if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]]
    then
    echo "Please choose iPhone simulator as the build target."
    exit 1
    fi

    IPHONE_DEVICE_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos

    # Build the other (non-simulator) platform
    xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/arm64" SYMROOT="${SYMROOT}" ARCHS='arm64' VALID_ARCHS='arm64' $ACTION

    xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}"  CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/armv7" SYMROOT="${SYMROOT}" ARCHS='armv7 armv7s' VALID_ARCHS='armv7 armv7s' $ACTION

    # Copy the framework structure to the universal folder (clean it first)
    rm -rf "${UNIVERSAL_OUTPUTFOLDER}"
    mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
    cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework"

    # Smash them together to combine all architectures
    lipo -create  "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/arm64/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/armv7/${PROJECT_NAME}.framework/${PROJECT_NAME}" -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}"

我选中运行脚本下方的“仅在安装时运行脚本”复选框。现在,我为通用iOS设备构建框架。现在,我单击Project层次结构中存在的Products组,然后选择MyFramework.framework文件,右键单击并选择在finder中显示。它会在finder中打开〜/ Library / Developer / Xcode / DerivedData / MyFramework-dlpsipmxkqmemwgqrfeovlzgyhca / Build / Products / Debug-iphoneos / MyFramework.framework。

Now, I create a new tag 'MyFramework-v0.0.1' containing the commit where I added MyFramework.framework file. 

我转到〜/ .cocoapods / repos / MyRepoName /并创建一个podspec文件MyFramework.podspec,如下所示:

Pod::Spec.new do |s|
s.name         = "MyFramework"
s.version      = "0.0.1"
s.summary      = "A pod for MyFramework"
s.description  = "A pod designed for MyFramework"

s.homepage     = "My_Private_Repo_Path"
s.license      = { :type => "MIT", :file => "FILE_LICENSE" }
s.authors             = { "My_Username" => "my_email_address"
}
s.platform     = :ios, "8.0"
s.ios.deployment_target = "8.0"

s.source       = { :git => "My_Private_Repo_Path", :tag => 'MyFramework-v'+String(s.version) }

s.requires_arc = true
s.vendored_frameworks = "MyFramework.framework"
s.dependency "CocoaLumberjack"
end

现在,当我在终端中运行以下命令时:

pod repo push MyRepoName MyFramework.podspec

我收到以下错误:

Validating spec
-> MyFramework (0.0.1)
- ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use `   --verbose` for more information.
- NOTE  | [iOS] xcodebuild:  ld: warning: ignoring file  MyFramework/MyFramework.framework/MyFramework, missing required architecture i386 in file   MyFramework/MyFramework.framework/MyFramework (2 slices)
- NOTE  | [iOS] xcodebuild:  ld: warning: ignoring file MyFramework/MyFramework.framework/MyFramework, missing required architecture x86_64 in file MyFramework/MyFramework.framework/MyFramework (2 slices)
- NOTE  | [iOS] xcodebuild:  fatal error: lipo: -remove's specified would result in an empty fat file

[!] The `MyFramework.podspec` specification does not validate.

如何为所有设备和模拟器构建可可触摸框架,该框架依赖于使用可可豆添加的另一个框架(CocoaLumberjack)?我需要为输出框架创建一个私有容器。

索拉巴蒂亚

所以基本上我发现我只需要遵循这些简单的步骤。

1. Create a cocoa touch framework.
2. Set bitcode enabled to No.
3. Select your target and choose edit schemes. Select Run and choose Release from Info tab. 
4. No other setting required.
5. Now build the framework for any simulator as simulator runs on x86 architecture.
6. Click on Products group in Project Navigator and find the .framework file. 
7. Right click on it and click on Show in finder. Copy and paste it in any folder, I personally prefer the name 'simulator'.
8. Now build the framework for Generic iOS Device and follow the steps 6 through 
9. Just rename the folder to 'device' instead of 'simulator'.
10. Copy the device .framework file and paste in any other directory. I prefer the immediate super directory of both.

因此,目录结构现在变为:

 - Desktop
   - device
     - MyFramework.framework
   - simulator
     - MyFramework.framework
   - MyFramework.framework

现在打开终端并cd到桌面。现在开始键入以下命令:

lipo -create 'device/MyFramework.framework/MyFramework' 'simulator/MyFramework.framework/MyFramework' -output 'MyFramework.framework/MyFramework'

就是这样。在这里,我们合并了MyFramework.framework中存在的MyFramework二进制文件的模拟器和设备版本。我们得到了一个通用框架,可以为所有架构(包括模拟器和设备)构建。

现在,为此框架创建一个pod并没有任何区别。它像一种魅力。还请注意,也可以使用运行脚本来实现相同的功能,但是我花了很多时间来查找正确的脚本。因此,我建议您使用此方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何为依赖于其他项目的项目构建jar

如何构建依赖于其他 observables 的 observables?

Django rest 框架:序列化依赖于其他状态的额外字段?

数据表:将观察值添加到所有组并分配依赖于其他行的值

在linq中构建对象-添加依赖于其他属性的属性

如何为依赖于其他服务或数据库的服务编写单元测试

在Gentoo上,如何重建所有依赖于其他软件包的软件包?

如何组织依赖于Pod的框架项目?

如何使用依赖于其他列的值有效地将多个列添加到pandas数据框

如何剥离可可触摸框架

Scapy - 添加类型依赖于其他字段的字段

如何在iOS中构建可可触摸框架?

如何使用依赖于 ReactJS 的 VS Code 运行 .NET 框架项目?

MongoDB删除依赖于所有其他元素的元素(迭代)

如何找出其他包依赖于特定包?

如何动态更新依赖于其他成员的成员?

如何执行依赖于其他行的SQL查询?

如何让变量依赖于类中的其他变量?

如何使变量依赖于其他变量?

在没有DataKinds的情况下,如何使值依赖于其他值?

如何使用@Configuration排除Spring配置文件以依赖于其他项目

如何使用mutate()生成依赖于其他新变量的先前行值的变量?

如何仅使用jQuery使单选按钮选项依赖于其他单选按钮选择?

依赖于其他属性的属性

我应该在CocoaPods依赖项中添加Foundation和其他标准框架吗?

如何使用cmake解析整个项目,但仅构建依赖于其他子文件夹的子文件夹

如何在可可触摸框架中使用MagicalRecord库?

Azure DevOps 构建管道依赖于其他构建管道

Redux:更新列表中的一项,而不更新依赖于该列表的所有其他组件