n3w*_*bie 6 ios cocoapods google-tag-manager swift3
我正在尝试重做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的依赖,所以我无法控制它.至少这就是我在这里所理解的.
这是我的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
Run Code Online (Sandbox Code Playgroud)
这是我的(缩短为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
Run Code Online (Sandbox Code Playgroud)
我已经尝试下载GTM SDK并在没有cocoapods的情况下安装它,但我想我错过了一步,因为我无法使其工作.
所以我想对podspec和podfile文件提出一些建议,或者解释如何在没有cocoapods的情况下安装SDK.非常感谢 !
好吧,几个月后我不得不回到这个项目。由于 GTM pod 没有改变,并且仍然有静态库作为依赖项,所以仍然不可能创建一个以 GTM pod 为依赖项的框架并通过 Cocoapods 分发它。
我最终决定忽略 Cocoapods 并手动将第三方框架添加到我的框架中。所以这个答案与我的问题并不完全匹配,但这是我发现分发框架的唯一方法。
因此,第一步是创建一个新项目。选择Cocoa Touch 框架:
给它一个名字,我的名字是myFramework。一旦您的工作场所准备就绪,请向其中添加一个新目标:
单击跨平台选项卡并选择聚合模板。我将我的命名为“聚合”(非常有创意)。但我们暂时不会太关心它。
完成此操作后,您的工作场所就为您创建了令人惊叹的框架!让我们再深入一点!
您现在要创建或复制源文件。如果您复制它们,请不要忘记选中“根据需要复制项目”框,并确保将它们添加到框架目标中:
到目前为止,我想这并没有什么大的惊喜。
由于我的问题是关于 GTM 的,因此我们将添加该框架作为框架的依赖项。我在 Cocoapods 上的其他地方找不到源代码,因此我创建了一个新项目(我使用应用程序模板并将其命名为PodApp),然后将 Cocoapods 添加到其中。打开终端并导航到PodApp项目文件夹:
pod initvi Podfilepod 'GoogleTagManager', '~> 6.0.0'pod installopen PodApp.xcworkspace在您的 Framework 项目中,添加一个新的组,您将命名为Frameworks(在 Xcode 导航器中右键单击 -> 新组)。您需要将PodApp项目中下载的所有 Cocoapods 依赖项复制到myFramework的 Frameworks 组下。再次,不要忘记将其添加到 myFramework 目标并根据需要复制项目,如上所示。
在下图中,单击1、2、3,如果一切顺利,您应该会看到刚刚在4上添加的框架/库。
为了让 Firebase 正常工作,您还必须链接到 AdSupport.framework。只需单击 + ( 5 ),搜索并添加它。
我在使用 GoogleToolBoxForMac 时也遇到了一些麻烦,我要做的就是构建PodApp项目,并将 GoogleToolBoxForMac.framework 复制到myFramework /Frameworks / 组中的PodApp /Pods/Products/ 下。请记住将其添加到正确的目标并复制该项目。
与 GTM 相关的另一个棘手细节:您必须向框架添加一些资源。请按照下图上的步骤操作:
在打开的弹出窗口中,单击“添加其他”并找到保存 GTM.framework 的位置,将其展开并添加 TagManagerResources.bundle(不要忘记复制该项目!)。
由于其他资源可能会向您发出警告(在此特定示例中),因此您可以使用-删除它们。
如果您希望框架的最终用户能够使用您嵌入的框架,请在“复制捆绑资源”正上方,打开“标题”面板,将所有项目标题拖放到public。
所有这些框架现在都可以由您自己的框架访问,但要使它们可用,您必须在 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>
Run Code Online (Sandbox Code Playgroud)
好吧,我们快完成了!
现在,选择项目的“信息”部分(上图中的1 ),检查您正在构建的版本(我的版本是 8.0,以便向后兼容大多数设备)。在“配置”面板下,通过选择“调试”并按-来删除它。现在选择“构建设置”(图像上的2 ),我们将在此处进行一些更改。
在您的两个目标中,对于提到的构建设置,将它们设置为$(inherited),这意味着它们将从您刚刚在项目构建设置中设置的参数继承。
在框架目标中,我还将其他链接器标志设置为 PodApp 项目中设置的内容,但我不能 100% 确定这是必要的。
(仅供参考,它们是:$(inherited) -ObjC -l"GoogleAnalytics" -l"c++" -l"sqlite3" -l"z" -framework "AdSupport" -framework "CoreTelephony" -framework "FirebaseAnalytics" -framework “FirebaseCore”-框架“FirebaseInstanceID”-框架“GoogleSymbolUtilities”-框架“GoogleTagManager”-框架“GoogleToolboxForMac”-框架“GoogleUtilities”-框架“JavaScriptCore”-框架“SystemConfiguration”-框架“StoreKit”-框架“AddressBook”-框架“核心数据”)
将定义模块设置为yes。
现在选择聚合目标,这将创建一个胖框架,一个包含我们框架的多个版本的文件,一个用于我们在几步之前指定的每个架构(arm64 armv7 i386 x86_64)。我们必须告诉 Xcode 我们希望它构建什么。请按照下图( 1 )的步骤操作:
在构建阶段,您希望聚合目标在构建自身之前构建 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}/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule"
# 9
# Delete the most recent build.
if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi
# 10
# Remove .zip file if exists from previous run.
if [ -d "${PROJECT_DIR}/${FRAMEWORK_NAME}.zip" ]; then
rm -rf "${PROJECT_DIR}/${FRAMEWORK_NAME}.zip"
fi
# 11
# Zip the Framework and License all together.
zip -r "${PROJECT_DIR}/${FRAMEWORK_NAME}.zip" "${PROJECT_DIR}/LICENSE" "${PROJECT_DIR}/${FRAMEWORK_NAME}.framework"
Run Code Online (Sandbox Code Playgroud)
在脚本的第 2 步中,将名称更改为您的框架名称。花些时间了解它的作用,如果它不满足您的要求,请更改其行为。它最终的作用是在项目文件夹中创建一个框架和一个 zip 存档。我这样做是为了将它与每个 Github 版本链接起来。
现在一切都应该正常了。选择聚合作为活动方案并运行它。
如果您想在测试应用程序中添加框架,请创建一个新的应用程序项目,只需将myFramework.framework(例如从 myFramework 文件夹)拖放到您的应用程序项目中即可。再次,不要忘记将其添加到正确的目标,并复制项目。在应用程序目标的“常规”选项卡下,在“嵌入式二进制文件”面板中添加框架,但从“链接的框架和库”面板中将其删除一次,因为它应该在那里出现两次(在执行此操作之前先检查一下)。导入您的框架
import myFramework
Run Code Online (Sandbox Code Playgroud)
并开始使用您构建的内容!
注意:如果您尝试使用 GTM,请不要忘记添加与 GTM 集成相关的内容(您的容器和 GoogleInfo plist):
我真的希望这能帮助你!如果有任何不清楚的地方或遇到问题,请随时发表评论,我会尽力帮助您。
请在下面找到我的来源:
| 归档时间: |
|
| 查看次数: |
3104 次 |
| 最近记录: |