- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个要求稍微复杂的项目,所以让我们从期望的目标开始:
该项目是用于与我们的后端服务(不是应用程序)接口的SDK。
项目必须输出可以包含在Xamarin应用程序中的.framework
文件(我们所有内部应用程序都是使用Xamarin构建的)
该项目必须是带有.podspec
文件的正确CocoaPod,以便第三方可以将SDK包含在自己的应用中(客户要求)
该项目依赖于三个第三方依赖关系,其中一个与另一个依赖关系的交付方式有所不同:
CocoaLumberjack和JSONModel在Podfile
或.podspec
中作为依赖项列出时,将下载它们各自的项目并将它们作为子项目包含在您自己的工作空间中,以进行构建
当GoogleInterativeMediaAds作为Podfile
或.podspec
中的依赖项列出时,它将下载.framework
文件,并且是完全封闭源代码
该项目必须能够同时为iOS和tvOS构建(我们同时具有应用和客户端)
请注意,尽管JSONModel和CocoaLumberjack都宣称它们支持iOS和tvOS,但GoogleInteractiveMediaAds分别有CocoaPods(GoogleAds-IMA-iOS-SDK ~> 3.9
和GoogleAds-IMA-tvOS-SDK ~> 4.0
)
项目输出的任何.framework
文件都必须包含嵌入的位码,并且必须是胖二进制文件
该项目有几个静态资产(PNG文件和XIB文件),需要作为.bundle
包含在.framework
中
那么,现在:我已经完成了所有这些工作。这花费了很长时间,并且进行了大量实验,但是我有一个满足上述所有要求的项目。我的Podfile看起来像这样:
播客文件
use_frameworks!
def common()
pod 'CocoaLumberjack', '~> 3.5'
pod 'JSONModel', '~> 1.8'
end
target 'MyFramework-iOS' do
platform :ios, '9.0'
common()
pod 'GoogleAds-IMA-iOS-SDK', '~> 3.9'
end
target 'MyFramework-tvOS' do
platform :tvos, '9.1'
common()
pod 'GoogleAds-IMA-tvOS-SDK', '~> 4.0'
end
.podspec
看起来像这样:
Pod::Spec.new do |spec|
spec.name = "MyFramework"
spec.version = "1.0.0"
spec.summary = "A framework for interfacing with our back-end"
spec.description = <<-DESC
A longer description
DESC
spec.homepage = "https://example.com/"
spec.license = "MIT"
spec.authors = {
"Steven Barnett" => "xxx@example.com"
}
spec.ios.deployment_target = "9.0"
spec.tvos.deployment_target = "9.1"
spec.source = { :git => "https://bitbucket.org/xxx/MyFramework.git", :tag => "#{spec.version}" }
spec.source_files = "Sources/Common/**/*.{h,m}", "Sources/MyFramework.h"
spec.ios.source_files = "Sources/iOS/**/*.{h,m}"
spec.tvos.source_files = "Sources/tvOS/**/*.{h,m}"
spec.ios.resource_bundles = {
"MyFramework" => ["Assets.xcassets", "Sources/iOS/**/*.{xib}"]
}
spec.tvos.resource_bundles = {
"MyFramework" => ["Assets.xcassets", "Sources/tvOS/**/*.{xib}"]
}
spec.frameworks = "Foundation", "UIKit", "AVKit"
spec.requires_arc = true
spec.dependency "CocoaLumberjack", "~> 3.5"
spec.dependency "JSONModel", "~> 1.8"
spec.ios.dependency "GoogleAds-IMA-iOS-SDK", "~> 3.9"
spec.tvos.dependency "GoogleAds-IMA-tvOS-SDK", "~> 4.0"
end
./Sources/Common
包含我们99%的代码,在iOS和tvOS中很常见
./Sources/iOS
包含仅在iOS上可用的少数功能。具体来说,iOS在自定义视频播放器的布局方面提供了更大的灵活性,因此我们拥有自定义控件
./Sources/tvOS
包含一些仅在tvOS上可用的功能。具体来说,是用于播放器控件的XIB和
.m
文件的配对集合
Run Script
阶段:
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
if [ "true" == ${ALREADYINVOKED:-false} ]; then
echo "RECURSION: Detected, stopping"
else
export ALREADYINVOKED="true"
# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
# Step "0". Build our project twice
echo "Building for AppleTV Device (redundantly... sigh)"
xcodebuild -workspace "${PROJECT_DIR}/${PROJECT}.xcworkspace" -scheme "${TARGET_NAME}" -configuration ${CONFIGURATION} -sdk appletvos ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" OBJROOT="${OBJROOT}/DependentBuilds" OTHER_CFLAGS="-fembed-bitcode"
echo "Building for AppleTV Simulator"
xcodebuild -workspace "${PROJECT_DIR}/${PROJECT}.xcworkspace" -scheme "${TARGET_NAME}" -configuration ${CONFIGURATION} -sdk appletvsimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" OBJROOT="${OBJROOT}/DependentBuilds" OTHER_CFLAGS="-fembed-bitcode"
# Step 1. Copy the framework structure (from iphoneos build) to the universal folder
echo "Copying to output folder"
cp -R "${TARGET_BUILD_DIR}/${FULL_PRODUCT_NAME}" "${UNIVERSAL_OUTPUTFOLDER}/"
# Step 2. Create universal binary file using lipo and place the combined executable in the copied framework directory
echo "Combining executables"
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${EXECUTABLE_PATH}" "${BUILD_DIR}/${CONFIGURATION}-appletvsimulator/${EXECUTABLE_PATH}" "${TARGET_BUILD_DIR}/${EXECUTABLE_PATH}"
# Step 3. Create universal binaries for embedded frameworks
for FRAMEWORK in $( find "${TARGET_BUILD_DIR}" -type d -name "*.framework" ); do
FRAMEWORK_PATH="${FRAMEWORK##$TARGET_BUILD_DIR}"
BINARY_NAME="${FRAMEWORK##*/}"
BINARY_NAME="${BINARY_NAME%.*}"
# I don't know how to do "if not" in Bash. Sue me.
if [[ $BINARY_NAME == Pods_* ]] || [[ $BINARY_NAME == $TARGET_NAME ]]; then
echo "Skipping framework: $FRAMEWORK_PATH"
else
echo "Creating fat binary for framework: $FRAMEWORK_PATH"
cp -r "${FRAMEWORK}" "${UNIVERSAL_OUTPUTFOLDER}/"
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${BINARY_NAME}.framework/${BINARY_NAME}" "${BUILD_DIR}/${CONFIGURATION}-appletvsimulator/${FRAMEWORK_PATH}/${BINARY_NAME}" "${TARGET_BUILD_DIR}/${FRAMEWORK_PATH}/${BINARY_NAME}"
fi
done
# Step 4. Manually copy some files to the output dir
cp -r "${SOURCE_ROOT}/Pods/GoogleAds-IMA-tvOS-SDK/GoogleInteractiveMediaAds.framework" "${UNIVERSAL_OUTPUTFOLDER}"
cp "${SOURCE_ROOT}/generate-xamarin-bindings.py" "${UNIVERSAL_OUTPUTFOLDER}"
# Step 5. Convenience step
open "${UNIVERSAL_OUTPUTFOLDER}"
fi
generate-xamarin-bindings.py
文件。就我的目的而言,这几乎可以忽略。它仅使用
Objective Sharpie来自动创建Xamarin绑定,然后使用JSONModel修复了一些已知的错误(定义为
@property (retain, nonatomic, nullable) NSString <Optional> *test;
的变量将以
Optional test { get; set; }
而不是
string test { get; set; }
的形式引入绑定中)
use_frameworks!
platform :tvos, '9.1'
target 'MyFramework Example tvOS App' do
pod 'MyFramework', :path => '../../'
end
MyFramework.framework
,
CocoaLumberjack.framework
,
JSONModel.framework
和
GoogleInteractiveMediaAds.framework
)嵌入到我们的Xamarin应用程序中,它们将在两个模拟器和真实设备上。
Product > Archive
和
Product > Build For > Profiling
,所以我认为ITMS-90668或ITMS-90209的建议解决方案并不准确。
~/Library/Developer/Xcode/DerivedData/MyFramework-xxxxxx/Build/Products
(此后称为
${BUILD_ROOT}
)中,正在构建依赖项的iOS和tvOS版本:
${BUILD_ROOT}/Release-appletvos/JSONModel-iOS.framework
${BUILD_ROOT}/Release-appletvos/JSONModel-tvOS.framework
${BUILD_ROOT}/Release-appletvsimulator/JSONModel-iOS.framework
${BUILD_ROOT}/Release-appletvsimulator/JSONModel-tvOS.framework
${BUILD_ROOT}/Release-universal/MyFramework-tvOS.framework/MyFramework.bundle
的内容,里面会有一个名为
MyFramework
的可执行文件。我不知道是谁,什么来创建此可执行文件,它来自何处或为什么将其包含在我的捆绑软件中。在任何构建阶段都没有引用它,但这似乎是ITMS-90171的原因
.framework
文件而不是CocoaPod(不确定CocoaLumberjack是否有这个?)。但是我找不到我遇到的问题的任何答案,也找不到某些奇怪的构建行为的解释。
.bundle
中?
__LLVM
段
.bundle
中删除二进制文件将ITMS-90171替换为一个新错误(我忘记了ITMS-X代码),该错误有关Info.plist引用的CFBundleExecutable不存在。删除此二进制文件也可以处理ITMS-90166
BITCODE_GENERATION_MODE=bitcode
标志似乎可以改善情况。我的输出二进制文件从1.2 MB增至3.4 MB(大概包含“完整”位码)。但是,发生了一些奇怪的事情。代替了ITMS-90668的三个实例,针对单个框架的所有三个错误(ITMS-90668,ITMS-90635和ITMS-90209)都消失了:JSONModel
OTHER_CFLAGS
被传递给clang的每个调用,而不仅仅是相关的调用,所以我删除了
OTHER_CFLAGS="-fembed-bitcode"
,这解决了链接器错误
*-tvOS
版本。我的运行脚本正在构建
*-iOS
版本。这似乎对我从Apple Store看到的错误没有影响,但是它减慢了我的构建速度,创建了额外的文件,并发出了有关隐式依赖性检测找到两个候选对象的警告。我不知道该如何解决。
VERSIONING_SYSTEM
构建设置默认为
apple-generic
造成的。苹果通用版本控制系统创建一个名为
<ProjectName>_vers.c
的源文件,对其进行编译,然后将该文件与某些库链接(我猜是系统库吗?)
OTHER_CFLAGS="-fembed-bitcode"
时,正是此文件引起了链接器错误,因为此二进制文件设置了不兼容的
-bundle
。通过将版本控制系统设置为
None
,我可以带回该标志而没有任何链接程序错误!
Versioning System
设置为
None
Executable File
键(如果存在,请删除它)
BITCODE_GENERATION_MODE=bitcode
和
ENABLE_BITCODE=YES
添加到我的
xcodebuild
命令中(以及现有的
OTHER_CFLAGS="-fembed-bitcode"
)
最佳答案
我不知道这个问题/答案对偶然发现它的其他人有多大用处,因为我有大量的问题和非常具体的设置。但我想继续发布,确实为我的问题找到了解决方案。
首先,我需要设置ENABLE_BITCODE=YES
和BITCODE_GENERATION_MODE=bitcode
标志。但是,设置这两个标志会阻止我的代码因链接器错误而生成。造成此错误的原因是我的资源捆绑目标使用的是Apple通用版本控制-资源捆绑不支持
通过将Versioning System
构建设置设置为“无”,它修复了所有问题
关于ios - 如何修复我的构建:具有CocoaPods依赖项和2个目标(iOS和tvOS)的.framework文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59164395/
有没有办法在 CocoaPod 文件中写入注释?我看了他们的CocoaPods Guide ,但我什么也没看到。 最佳答案 您可以使用 Ruby 注释语法在 Podfile 中添加注释: 内联 #co
我在 Xcode 项目中有多个目标,它们必须依赖于相同的 pod 列表。我可以这样写 Podfile: target :target1 do pod 'pod1' pod 'pod2'
我正在创建一个新的 cocoapod,并希望包含另一个 cocoapod 作为依赖项。 我在 podspec 中添加了必要的行: s.dependency 'Locksmith', '~> 2.0
我执行了我的正常 pod update并收到以下消息: [!] There was an error reading '~/.cocoapods/repos/master/CocoaPods-vers
背景 几年前,我为我正在从事的项目安装了 cocoapods。从那以后我就没有使用过它,现在我需要更新它才能让 Flutter 工作。 系统 操作系统 MacOS Mojave 版本 10.14.3
我想知道用 CocoaPod 包含演示项目的最佳方法是什么。特别是,我希望它成为任何人都可以尝试使用 pod try 的组件。命令。 我看到两个选项: 选项 1:使用 Podfile 在 Exampl
我正在尝试为 firebase 获取一个 pod,但是我在搜索框中输入的任何名称都没有返回任何内容。是网站打不开还是?谢谢 最佳答案 这似乎是许多开发人员不时面临的问题,包括我自己,但是 cocoap
我有一个库的公共(public)分支,该库已存在于 CocoaPods/Specs 中。在 Podfile 中,我可以通过执行以下操作来引用此 fork pod: pod 'CoolLibrary',
pod 命令是否支持列出给定项目中已安装的 CococaPods 的选项? pod list 似乎显示了所有已发布 pod 的列表。我查看了文档,但找不到执行此操作的方法。 最佳答案 如 @DougA
我在 Amazon s3 中存储了一个预编译的框架。 “pod spec lint”失败并出现以下错误。 - ERROR | [iOS] file patterns: The `source_file
我正在用一些资源文件创建我自己的 pod。它基本上是这样定义的: Pod::Spec.new do |s| s.name = 'MyName' s.version = '0.
我正在尝试在我的项目中使用编译到 iOS 的 libFLAC,并使用 CocoaPod 作为依赖项进行安装。 问题是,如果我使用 CocoaPod 0.39 版,工作区创建得很好,但如果我使用 Coc
我在使 CocoaPods 依赖项在 RubyMotion 中工作时遇到了各种问题。首先,如果我添加 dependency 'JSONKit'到我的 Rakefile 然后运行 rake它被 ca
当使用 faSTLane 和 cocoapods 构建我们的 iOS 应用程序时,我注意到 faSTLane 不使用我使用安装的 cocoapods 版本 sudo gem install cocoa
有没有办法在 Podfile 中指定那个 xcconfig文件应该是 #include d 在 Cocoapods 生成的那个? 是否有公开的方法/变量用于附加此 #include还是我需要阅读生成的
在新的 XCode5 中构建我的项目时,我收到以下警告: Pods-App 作为“libPods-App.a”的隐式依赖项被拒绝,因为其架构“i386”不包含所有必需的架构“x86_64” . 最佳答
我已经使用以下命令在 bundle 中安装了 Cocoapods-art: bundle exec gem install cocoapods-art 这是成功消息: Fetching cocoap
在 Xcode 7 中,cocoapods 库的库具有排除代码覆盖率的功能。 但在 Xcode 8 中,该库将包含代码覆盖率。 我是否可以在代码覆盖率中排除该库? 示例:安装 pod 'TPKeybo
我目前正在寻找一个仅支持 Carthage 作为包管理器的库。我希望将其集成的项目已经有一些 CocoaPods 依赖项。有人尝试过同时使用这两个管理器吗? 我觉得这是一个坏主意,但我很想听听实际情况
我刚刚在 Specs Repo 中使用 Pod trunk Push 发布了 Pod 的 Beta 版本。我想知道是否有任何方法可以从规范存储库中删除此版本规范。我没有找到任何通过 pod 命令执行此
我是一名优秀的程序员,十分优秀!