'Pods-App'目标具有传递依赖关系,包括在swift框架中使用GTM时的静态二进制文件

学向勤中得,萤窗万卷书。这篇文章主要讲述' Pods-App' 目标具有传递依赖关系,包括在swift框架中使用GTM时的静态二进制文件相关的知识,希望能为你提供帮助。
我正在尝试重做swift 3项目的一部分,使其成为一个快速框架,以便将其用作pod。问题是我需要使用GoogleTagManager legacy(v3)作为依赖项,并且在执行pod spec lint时出现以下错误:

错误| [ios] unknown:遇到未知错误('Pods-App'目标具有包含静态二进制文件的传递依赖项:(/ private / var / folders / 7t / 0cd0n1gn46xd7r1cywrgcy2w0000gn / T / CocoaPods / Lint / Pods / GoogleTagManager / Libraries / libTagManager .a))在验证期间。
或者,使用GTM v5:
错误| [iOS] unknown:遇到未知错误('Pods-App'目标具有包含静态二进制文件的传递依赖项:(/ private / var / folders / 7t / 0cd0n1gn46xd7r1cywrgcy2w0000gn / T / CocoaPods / Lint / Pods / GoogleTagManager / Frameworks / GoogleTagManager .framework))在验证期间。
我正在使用最新的cocoapods版本(1.1.0.rc.2),据我所知,问题来自GTM pod的依赖关系,其中至少有一个是静态库。
我读了一些线程,人们谈论在框架中安装静态库的工作区,或者在创建pod时将静态库包装到框架中。问题是静态库是GTM pod的依赖,所以我无法控制它。至少这是我在here所理解的。
这是我的Podfile:
# Uncomment this line to define a global platform for your project platform :ios, '8.0'target 'MyProject' do # Comment this line if you're not using Swift and don't want to use dynamic frameworks # use_frameworks!# Pods for MyProject pod 'GoogleTagManager', '~> 3.15.2' end

这是我的(缩短为StackOverflow)MyProject.podspec:
Pod::Spec.new do |s|s.name= "MyProject" s.version= "0.1.0"s.platform = :ios, '8.0' s.ios.deployment_target = '8.0's.source_files= "MyProject", "MyProject/**/*.{h,m}", "MyProject/**/*.{swift}" s.dependency 'GoogleTagManager', '~> 5.0.0'end

我已经尝试下载GTM SDK并在没有cocoapods的情况下安装它,但我想我错过了一步,因为我无法使其工作。
所以我想对podspec和podfile文件提出一些建议,或者解释如何在没有cocoapods的情况下安装SDK。非常感谢 !
答案好吧,几个月后我不得不回到这个项目。由于GTM pod没有更改并且仍然具有静态库作为依赖项,因此仍然无法创建将GTM pod作为依赖项并通过Cocoapods分发它的框架。
我最终决定忽略Cocoapods并手动添加第三方框架。所以这个答案不能完全匹配我的问题,但这是我发现对我的框架进行ditribute的唯一方法。
因此,第一步是创建一个新项目。选择Cocoa Touch Framework:
'Pods-App'目标具有传递依赖关系,包括在swift框架中使用GTM时的静态二进制文件

文章图片

给它一个名字,我的将是myFramework。工作场所准备就绪后,为其添加新目标:
'Pods-App'目标具有传递依赖关系,包括在swift框架中使用GTM时的静态二进制文件

文章图片

单击跨平台选项卡,然后选择聚合模板。我将其命名为Aggregate(这么多原创性)。但是我们现在不会太关心它。
'Pods-App'目标具有传递依赖关系,包括在swift框架中使用GTM时的静态二进制文件

文章图片

完成后,您的工作场所将为您创建出色的框架!让我们再深入一点吧!
您现在要创建或复制源文件。如果您复制它们,请不要忘记选中复制项目框,如果需要,请确保它们已添加到框架目标:
'Pods-App'目标具有传递依赖关系,包括在swift框架中使用GTM时的静态二进制文件

文章图片

【' Pods-App' 目标具有传递依赖关系,包括在swift框架中使用GTM时的静态二进制文件】到现在为止,我猜没有什么大惊喜。
由于我的问题是关于GTM,我们将添加的框架作为我们框架的依赖。我在Cocoapods的其他地方找不到源代码,所以我创建了一个新项目(我使用了应用程序模板并命名为PodApp),然后我添加了Cocoapods。打开终端并导航到PodApp项目文件夹:
  1. pod init
  2. vi Podfile
  3. 在PodApp的#Pods下,添加pod 'GoogleTagManager', '~> 6.0.0'
  4. 保存并关闭Podfile,然后运行pod install
  5. 下载并安装依赖项后,关闭PodApp项目窗口并运行open PodApp.xcworkspace
在您的Framework项目中,添加一个新的新组,您将命名为Frameworks(右键单击Xco??de Navigator- > new group)。您将复制在myFramework的Frameworks组下的PodApp项目中下载的Cocoapods所有依赖项。再次,不要忘记将其添加到myFramework目标并在需要时复制项目,如上所示。
'Pods-App'目标具有传递依赖关系,包括在swift框架中使用GTM时的静态二进制文件

文章图片

在下图中,单击1,2,3,如果一切顺利,您应该看到刚刚添加的框架/库4。
'Pods-App'目标具有传递依赖关系,包括在swift框架中使用GTM时的静态二进制文件

文章图片

要使Firebase正常运行,您还必须与AdSupport.framework链接。只需单击+(5),搜索它,然后添加它。
我在使用GoogleToolBoxForMac时遇到了一些麻烦,我必须做的是构建PodApp项目,并在myFramework / Frameworks /组中的PodApp / Pods / Products /下复制GoogleToolBoxForMac.framework。请记住将其添加到正确的目标并复制该项目。
与GTM相关的另一个棘手细节:您必须为框架添加一些资源。按照下一张图片上的步骤操作:
'Pods-App'目标具有传递依赖关系,包括在swift框架中使用GTM时的静态二进制文件

文章图片

在打开的弹出窗口中,单击Add Other并找到保存GTM.framework的位置,展开它并添加TagManagerResources.bundle(不要忘记复制项目!)。
'Pods-App'目标具有传递依赖关系,包括在swift框架中使用GTM时的静态二进制文件

文章图片

由于其他资源可能会给您警告(在此特定示例中),您可以使用 - 删除它们。
如果您希望框架的最终用户能够使用您嵌入的框架,请在“复制包资源”上方,打开“标题”面板,将所有项目标题拖放到公共位置。
所有这些框架现在都可以通过您自己的框架访问,但要使它们可用,您必须在myFramework.h中导入它们的标头:
#import < myFramework/AnObjectiveCClass.h> #import < GoogleTagManager/GoogleTagManager.h> #import < GoogleTagManager/TAGCustomFunction.h> #import < myFramework/GTMDefines.h> #import < myFramework/GTMNSData+zlib.h> #import < FirebaseCore/FirebaseCore.h> #import < FirebaseAnalytics/FirebaseAnalytics.h> #import < FirebaseInstanceID/FirebaseInstanceID.h> #import < myFramework/GAI.h> #import < myFramework/GAIDictionaryBuilder.h> #import < myFramework/GAIEcommerceFields.h> #import < myFramework/GAIEcommerceProduct.h> #import < myFramework/GAIEcommerceProductAction.h> #import < myFramework/GAIEcommercePromotion.h> #import < myFramework/GAIFields.h> #import < myFramework/GAILogger.h> #import < myFramework/GAITrackedViewController.h> #import < myFramework/GAITracker.h> #import < myFramework/pb_encode.h> #import < myFramework/pb.h> #import < myFramework/pb_decode.h> #import < myFramework/pb_common.h>

好吧,我们差不多完成了!
&#39;Pods-App&#39;目标具有传递依赖关系,包括在swift框架中使用GTM时的静态二进制文件

文章图片

现在,选择项目的Info部分(上图中的1),检查您正在构建的版本(我的版本为8.0,以便与大多数设备向后兼容)。在Configurations面板下,通过选择它来删除Debug,然后按 - 。现在选择Build Settings(图像上的2),我们将在这里进行一些更改。
  • 仅构建活动架构:否
  • 允许框架模块中的非模块化包含:否
  • 有效的体系结构:arm64 armv7 i386 x86_64(因为armv7s在本例中没有为某些框架构建)
  • 预处理器宏:PB_NO_PACKED_STRUCTS = 1 PB_FIELD_32BIT = 1
  • 启用模块(C和Objective-C):是的
在您的两个目标中,对于上面提到的Build Settings,将它们设置为$(inherited),这意味着它们将继承您刚刚在Project Build Settings上设置的参数。
在框架目标中,我还将其他链接器标志设置为PodApp项目中设置的内容,但我不是100%确定它是必要的。
(仅供参考,这里是:$(继承)-ObjC -l“GoogleAnalytics”-l“c ++”-l“sqlite3”-l“z”-framework“AdSupport”-framework“CoreTelephony”-framework“FirebaseAnalytics”-framework “FirebaseCore”-framework“FirebaseInstanceID”-framework“GoogleSymbolUtilities”-framework“GoogleTagManager”-framework“GoogleToolboxForMac”-framework“GoogleUtilities”-framework“javascriptCore”-framework“SystemConfiguration”-framework“StoreKit”-framework“AddressBook”-framework “CoreData”)
将Define Modules设置为yes。
现在选择Aggregate目标,它将创建一个胖框架,一个包含我们框架的几个版本的文件,一个用于我们几步之前指定的每个架构(arm64 armv7 i386 x86_64)。我们必须告诉Xcode我们想要它构建什么。按照下图(1)的步骤操作:
&#39;Pods-App&#39;目标具有传递依赖关系,包括在swift框架中使用GTM时的静态二进制文件

文章图片

在Build Phases中,您希望Aggregate目标在构建之前构建myFramework.framework。
添加myFramework.framework后,在图片中按+注释为2,然后选择New Run Script Phase。将以下脚本粘贴到其中:
# Merge Script# 1 # Set bash script to exit immediately if any commands fail. set -e# 2 # Setup some constants for use later on. FRAMEWORK_NAME="myFramework"# 3 # If remnants from a previous build exist, delete them. if [ -d "${SRCROOT}/build" ]; then rm -rf "${SRCROOT}/build" fi# 4 # Build the framework for device and for simulator (using # all needed architectures). xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -arch arm64 -arch armv7 -arch armv7s only_active_arch=no defines_module=yes -sdk "iphoneos" xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -arch x86_64 -arch i386 only_active_arch=no defines_module=yes -sdk "iphonesimulator"# 5 # Remove .framework file if exists from previous run. if [ -d "${PROJECT_DIR}/${FRAMEWORK_NAME}.framework" ]; then rm -rf "${PROJECT_DIR}/${FRAMEWORK_NAME}.framework" fi# 6 # Copy the device version of framework to Framework directory. cp -r "${SRCROOT}/build/Release-iphoneos/${FRAMEWORK_NAME}.framework" "${PROJECT_DIR}/${FRAMEWORK_NAME}.framework"# 7 # Replace the framework executable within the framework with # a new version created by merging the device and simulator # frameworks' executables with lipo. lipo -create -output "${PROJECT_DIR}/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${SRCROOT}/build/Release-iphoneos/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${SRCROOT}/build/Release-iphonesimulator/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}"# 8 # Copy the Swift module mappings for the simulator into the # framework.The device mappings already exist from step 6. cp -r "${SRCROOT}/build/Release-iphonesimulator/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule/" "${PROJECT_DIR}/${FRAME

    推荐阅读