关于xcode8的建立依赖其他第三方库(cocoapods管理)的静态库framework

Xcode使用Cocoa Touch Framework新建Framework 网上有很多教程使用Xcode新建Framework的教程,不过使用的是Cocoa Touch Static Library,Xcode 7有一个新的功能,通过Cocoa Touch Framework。能直接生成Framework。 Step 1 打开Xcode,新建工程,选择Cocoa Touch Framework,命名为xibFramework. step 2 1 阅读详情

我们在编写 SDK 的时候, 有时候会用到一些常用组件, 比如 AFNetworking.
如果直接将AFNetworking编译进 SDK ,那么如果用户在使用你写的 SDK 的同时也使用了 AFNetworking,那么会出现”duplicate symbol OBJC_CLASS$_xxx”的问题.
如果自己重新写一个功能类似 AFNetworking 的组件,一来是很麻烦,二来像这种成熟的第三方库, 都是经过很多人测试过,多次修改 bug的,自己写的话,未必比得上,而且重复造轮子也是没有多大意义的.
接下来我们就来开始写一个简单的 SDK,并且使用 AFNetworking库

*1. 创建工程*

选Cocoa Touch Framework,
创建静态库framework的第一步:
至于为何不选择 Cocoa Touch Static Library 是因为虽然后者也能建立静态库,但是最后得到的是一堆头文件加上一个 .a 文件,不容易部署, 而 Framework 则是把头文件和编译好的二进制文件打包为一个. framwork ,容易部署.
这里写图片描述

*2. 加入 AFNetworking*

既然要使用 AFNetworking ,自然要先引入, 这里我用 CocoaPods 来管理。
首先,你需要安装一个CocoaPods 插件,然后在终端操作。
终端打开工程,开始编辑下载AFNetworking
编辑下载的第三方内容

然后pod install,下载AFNetworking.

* 3. 编写 SDK*

拖入需要生成静态库的文件

拖入需要生成静态库的文件

在与工程同名文件内部将需要暴漏出来的头文件

编辑需要暴漏出的文件头部

*4. 配置*

在Targets->Build Phases ->Headers里面把需要暴漏的头文件拖拽到Public里面
这里写图片描述

接下来到 General 中设置需要支持的版本, Build Setting 中加入 armv7s

(注:此处为什么添加armv7s?
首先了解一下什么是ARM,ARM是微处理器,而armv6, armv7, armv7s是ARM CPU的不同指令集,

armv6设备:iPhone, iPhone2, iPhone 3G,第一代、第二代iPod Touch

armv7设备:iPhone 3GS,iPhone 4,iPhone 4S,iPad ,iPad 2,iPod Touch 3G,iPod Touch 4

armv7s设备:iPhone 5,iPad4

arm64设备:iPhone 5S,iPad Air,iphone6,iphone6plus,iPhone6s,iPhone6s Plus等

Xcode6更新后,默认不支持armv7s,也就是默认不会编译armv7s架构,虽然其处理器架构会向下兼容,但是无法进行相关优化操作。如果你提供的Framework默认不支持armv7s架构,但是使用者要支持armv7s架构,这时就会有冲突,Xcode无法构建代码原因是丢失某架构(armv7s架构)链接库的错误,所以为了避免冲突,Framework默认支持armv7s架构,使用过程中由使用者自行决定是否支持。)

这里写图片描述
将Build Active Architecture Only选项设为YES,导致其编译时只生成当前机器的框架,将其设置为NO,不知生成当前的机器框架,所有的都有。
这里写图片描述
1.选择工程文件>target第一项>Build Setting>搜索linking,然后几个需要设置的选项都显现出来,首先是Dead Code Stripping设置为NO,
2.然后将Link With Standard Libraries关闭,
3.最后将Mach-O Type设为Static Library,framework可以是动态库也可以是静态库,对于系统的framework是动态库,而用户制作的framework只能是静态库。动态库,上传appstore是不允许的。
这里写图片描述

Architectures:包含哪些架构指令,这里我们需要添加armv7s架构

Build Active Architecture Only:是否只为当前架构编译

Dead Code Stripping:是否从framework中删除未使用的代码

Link With Standard Libraries:是否链接苹果标准库

Mach-O Type:这里有好几种类型,我们需要选中static library

Other Linker Flags(本文没有用到,提醒):链接参数,如果framework中使用了category,最好加上ObjC、all_load,确保运行时系统会加载其中的category

Other C Flags(本文没有用到,提醒):额外的C语言链接参数,如果需要支持bitcode,需要加上-fembed-bitcode

接下来可以编译试试有没有什么错误和警告
如果没有,就可以进行下一步了

*5. 增加合并模拟器和真机的 Aggregate Target*

由于编译的时候,只会编译当前选中设备的版本,为了编译一份同时能够运行于真机和模拟器的 SDK ,我们再增加一个 target
这里写图片描述
在这个 Target 里面选择 Build Phase, 新建一个 Run Script
然后添加脚本代码:
这里写图片描述
脚本代码:

#!/bin/sh
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
WORKSPACE_NAME=${PROJECT_NAME}.xcworkspace
# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
# Step 1. Build Device and Simulator versions
xcodebuild -workspace "${WORKSPACE_NAME}" -scheme "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphoneos ONLY_ACTIVE_ARCH=NO   BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -workspace "${WORKSPACE_NAME}" -scheme "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
# Step 2. Copy the framework structure (from iphoneos build) to the universal folder
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"
# Step 3. Copy Swift modules from iphonesimulator build (if it exists) to the copied framework directory
SIMULATOR_SWIFT_MODULES_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/."
if [ -d "${SIMULATOR_SWIFT_MODULES_DIR}" ]; then
cp -R "${SIMULATOR_SWIFT_MODULES_DIR}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"
fi
# Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"
# Step 5. Convenience step to copy the framework to the project's directory
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"
# Step 6. Convenience step to open the project's directory in Finder
open "${PROJECT_DIR}"

这里写图片描述

设置这个 Target 为 Release
这里写图片描述

然后编辑运行,这里选择真机运行会比较好。运行完成后会弹出合成好的framework文件夹路径,然后就可以拖入项目使用了。
运行完成自动打开的界面
也可以使用终端,对分别build生成的模拟器和真机的framework进行合并。

(终端代码:lipo -create 模拟器的二进制文件 真机的二进制文件 -output 生成新二进制文件的路径),然后再把真机的framework里面的二进制文件替换掉,接下来这个真机的framework就是合成的最终静态库文件。

*6. 试用。*

拖入的项目工程。
这里写图片描述
添加配置头文件路径
这里写图片描述这里写图片描述
这里,在使用终端将我们这个工程里面加入AFNetworking(这里不再赘述)。
运行,就可以使用了。
(之前自己碰到我的项目里面调用拖进去的framework,想要继承里面的一个类,在新建的时候subclass of竟然找不到里面的那个类。以为是哪里配置出现问题了。后来发现是项目编辑运行的时候就没有调用framework的那个类,可以在appdelegate里面讲我们的framework的写入所有的暴漏头文件的那个.h文件导入,那么工程就会预编译到,在新建的时候就会找得到你的framework里买呢所有的暴漏类的头文件了)。

*7. 总结*

架构

对于模拟器来说4s和5的模架构是i386的32位架构,5s至今是x86_64的64位架构。对于真机来说3GS~4s是armv7架构,5和5c是armv7s架构,5s至今是arm64架构

静态库

静态库: 链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

动态库

动态库:链接时不会拷贝至可执行文件中,运行时动态加载进内存,供程序调用,只加载一次,多个程序可以共用。

iOS SDK开发系列一之Cocoapods原理,Xcode的配置,动态库和静态库介绍 前言 三个月没写东西了,是时候总结点东西了。SDK这个东西开发其实和项目开发类似,但是项目中你不需要关注一些配置和打包的参数,或者你压根不需要关注Framework和.a到底是怎么链接配置的,因为Cocoapods或者你拖进Xcode已经帮你自动生成配置了,趁着周末这良辰美景,翻了几篇文章,做个总结和记录,文章不知道会分几篇,但是一片理论介绍,一篇Demo制作应该会有的,由于网上的Demo都是很简... 阅读详情

相关推荐

pod-template-xcframework:带有XCFramework和CocoaPods依赖关系的Pod创建模板

吊舱模板 用于创建具有以下功能的Pod的实用模板: Git作为源代码管理管理系统 干净的文件夹结构 项目生成 麻省理工学院执照 作为标准测试 交钥匙访问Travis CI 还支持迦太基 入门 想要使用此模板有两个原因,一个是您自己制作,另一个是为每个人改进。在这两种情况下,您都将需要使用setup文件夹中的ruby类,以及从template/ios/内部使用的示例基本模板。 最佳实务 命令pod lib create目的是与本指南一起运行: : 因此流程的任何更改也应在此进行更新。 它可以接受公共意见,但是添加新功能或新想法可能最好在问题中首先进行讨论。总的来说,我们尝试考虑普通的Xcode用户是否会使用此功能,如果不太可能,则强烈建议您采用最佳做法(ala测试/ CI。)。如果这样做有助于节省每次部署几分钟的时间,或者在指南中不容易记录,为了使该项目尽可能简单,可能会拒绝它。 要求:

【iOS】Cocoapods的安装以及使用

最近笔者在仿写天气预报App时用到了api调用数据,一般的基本数据类型我们用Xcode中自带的框架就可以转换得到。但是在和风天气api中的图标的格式为svg格式。似乎iOS13之后Xcode中可以直接使用svg格式的图片,但笔者没有查到对应的资料。笔者就调用了第三方库来使用svg格式的图片,这花了读者一天的时间才安装完成集成第三方库的Cocoapods并对其进行使用,特此写博客记录,如有不足请不吝指出至此Cocoapods的安装以及使用大概也讲的七七八八了,本博客仅供交流学习,如有不足或错误请不吝指出。

weixin_72437555的博客 9399

STM32 超声波模块输入捕获测距(标准库)

通道2设置为下降沿触发,触发瞬间会将CNT的记录到CCR2中,由于上升沿触发时已经将CNT置零所以此时的CNT的值就是高电平的持续时间。通道1设置为上升沿触发,触发的瞬间会将CNT的值记录到CCR1里面,同时设置通道1触发带有从模式,并把从模式设置为置零CNT。超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有四个引脚:VCC、GND、Trig(触发)、Echo(回应)。输入捕获原理可以看看这位大佬,感觉写的很清楚,工作电压与电流:5V,15mA。感测角度:不小于15度。

qq_62425900的博客 2082

自己创建Cocoa touch FrameWork

1)按command+shift+n创建新工程 点击选择Framework & Library->Cocoa Touch Framework->next 给工程取名myFrameworkLibrary,点击next 2)选保存路径,点击create,会发现工程中包含了一个自动生成的头文件myFrameworkLibrary.h 3)按command+n创建文件依次

xubaimiao的专栏 4101

利用Solidworks2020将挖掘机装配体转换为URDF模型

利用Solidworks2020将挖掘机装配体转换为URDF模型一、下载sw_urdf_exporter插件 URDF(Universal Robot Description Format)——通用机器人描述格式,它是ROS里边使用的一种机器人的描述文件,包含的内容有:连杆、关节,运动学和动力学参数、可视化模型、碰撞检测模型等。 一、下载sw_urdf_exporter插件 ROS提供了SolidWorks转URDF的插件(下载链接)—sw2urdfSetup.exe,下载后点击安装,安装完成后就能在sol

weixin_48192326的博客 6101

ComfyUI-controlnet控制出图

提供加载预处理器节点。

Bu2n的博客 5494

WWDC2014之iOS使用动态库

http://blog.sina.com.cn/s/blog_82c8198f0101vga0.html 苹果的开放态度 framework是Cocoa/Cocoa Touch程序中使用的一种资源打包方式,可以将将代码文件、头文件、资源文件、说明文档等集中在一起,方便开发者使用,作为一名Cocoa/Cocoa Touch程序员每天都要跟各种各样的Framewor

qhexin的专栏 913

[QMT量化交易小白入门]-七十一、十年回测ETF动量策略,超额年化收益率为10.6%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1854

iOS 安装包瘦身(下篇)

本文来自网易云社区作者:饶梦云2.4. 清理无用代码2.4.1. Dead Code StrippingActivating this setting causes the -dead_strip flag to be passed to ld(1) via cc(1) to turn on dead code stripping. Remove functions and data that a...

网易数帆社区博客 1134

2026华为OD机考双机位C卷++ 双机位B卷 + 双机位A卷 + 2025C/B/A卷+ 往年真题 - 题库目录分值说明 + 考点说明+在线OJ

2025华为OD机考双机位C卷++ 双机位B卷 + 双机位A卷 + 2025C/B/A卷+ 往年真题 - 题库目录分值说明 + 考点说明+在线OJ

算法大师! 5万+

Open Lovable 网站克隆AI工具超详细实战教程(含环境配置、排错与代码修改)

本教程面向有一定计算机基础的新手用户,提供一份全面、深入的 Open Lovable 使用指南。从开发环境搭建、API密钥获取、项目部署到网站克隆、代码下载、本地运行与二次开发,涵盖全流程细节与常见问题解决方案。通过本教程,新手可掌握如何利用AI驱动的Open Lovable工具,将任意目标网站智能复刻为结构清晰、可编辑的现代前端项目(React/Vite),实现快速原型开发与技术学习。

hy行者勇哥的博客 4961

Unity iOS 混合集成指南:CocoaPods 与手动添加.framework

本文详细介绍了在Unity项目中通过ApplovinCustomAdapter集成TradPlusSDK的具体步骤。主要内容包括:1)通过Podfile配置安装AppLovinSDK和TradPlusAdSDK;2)将ALMCMediationAdapter.framework集成到Xcode项目中的两种方法;3)解决编译报错的关键技巧,包括配置框架搜索路径、检查TargetMembership和调整Podfile设置。

帅次的博客 2194

高通开发系列 - Camera之摄像头调试记录

记录一些调试内容

fulinux的博客 1217

CocoaPods原理

CocoaPods是IOS项目上负责管理依赖的工具,即对第三方库的依赖。 CocoaPods 的原理是将所有的依赖库都放到另一个名为Pods的项目中, 然而让主项目依赖Pods项目, 这样,源码管理工作任务从主项目移到了Pods项目中.   1.Pods项目最终会编译成一个名为libPods.a的文件, 主项目只要依赖这个.a文件即可.   2.对于资源文件, CocoaPods提供了一个名为P...

gcs的博客 7071

Cesium 实战 28 - 三维视频融合(视频投影)

Cesium 实战 27 - 三维视频融合(视频投影)。

非科班Java出身GISer的博客 3368

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

CocoaPods-Rome:让Xcode外框架构建变得前所未有的简单

CocoaPods-Rome是一款强大的CocoaPods插件,它能让开发者轻松构建可在Xcode外部使用的框架列表,极大简化了iOS开发中的框架管理流程。无论是独立Podfile的框架生成,还是现有项目的框架提取,Rome都能提供高效解决方案。 ## 🌟 为什么选择CocoaPods-Rome? Rome的核心价值在于解决了Xcode项目外框架管理的痛点。传统开发中,框架的编译和管理往往依

gitblog_01073的博客 1110

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

创建CocoaPods的Framework Swift组件化之路(下)

系统: Mac OS 10.15.2, XCode 11.3,swift 5.0 写作时间:2019-12-23 1. 说明 开发iOS App,基本上没有从零开始构建。因为系统以及提供了很多Framework,比如UIKit, Foundation, WebKit,MapKit等,GitHub上也有很多开源的Framework,Alamofire, Kingfisher等。 动态库与静态库的区...

AI架构师易筋 2156

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

automake生成静态库文件_基于CocoaPods的组件化原理及私有库实践

轮子为什么会存在智人能在残酷的进化大战中存活下来,原因之一就是智人懂得将知识沉淀成外物,辅助彼此之间的合作,从而使得整个群体产生了规模效应,即1+1>2的效果。从一个角度上说,石器时代是基于石器的组件化的时代,因为老张家的石矛(或其它石头利器)借给了老王,一样可以拿去狩猎。要想实现这个目的,一定要保证:石矛足够锋利。不然贸然拿着石矛去找野兽就变成了给野兽送夜宵。石矛容易使用。如果是...

weixin_31463861的博客 197

YYText静态库终极集成指南:无需CocoaPods的快速解决方案

YYText是一个功能强大的iOS富文本框架,专为显示和编辑富文本内容而设计。如果你希望在项目中集成YYText但不想使用CocoaPods依赖管理器,这篇完整指南将为你提供多种替代方案,帮助你快速实现YYText静态库的无缝集成。🚀 ## 为什么选择手动集成YYText? 虽然CocoaPods是最流行的iOS依赖管理工具,但有些情况下手动集成更有优势: - **项目环境限制**:公司网

gitblog_00596的博客 1071

Swift Framework 编译成动态链接库和静态链接库

默认情况下,静态库只会打包代码文件,像图片、xib、storyboard、plist文件等都不会被打包,就需要创建一个bundle 文件夹,把所有的图片、plist 文件、Images.xcassets、xib、storyboard 都打包进去,而且项目中用到图片的时候,只能通过 bundle/xxx.png 文件名的方式来设置。如果我们打包整个工程的时候没有把用到的第三方框架一起打包,那么提供静态库的时候,要说明依赖哪些第三方的库。.dylib和.framework 文件。

w243164468的博客 2317

cocoapods应用Xcode创建framework相关

问题提出: 随着项目的越来越大,可能会出现好几个团队共同维护一个项目的情况,例如:项目组A负责其中的A块,项目组B负责其中的B块.....这几块彼此之间既独立,也相互联系。对于这种情况,可以采用约定的方式,比如,你只修改你那块,不要修改公共的。如果要修改公共的,那么必须要通知一下其它组...

chubi1173的博客 295

iOS-CocoaPods原理

CocoaPods是IOS项目上负责管理依赖的工具,即对第三方库的依赖。 CocoaPods 的原理是将所有的依赖库都放到另一个名为Pods的项目中, 然而让主项目依赖Pods项目, 这样,源码管理工作任务从主项目移到了Pods项目中.   1.Pods项目最终会编译成一个名为libPods.a的文件, 主项目只要依赖这个.a文件即可.   2.对于资源文件, CocoaPods提供了一个名为Pods-resources.sh的bash脚步, 该脚本在每次项目    编译的时候都会执行,将第三方库的各种.

MinggeQingchun的博客 1179

Path of Building PoE2详解:离线计算流放之路2伤害、天赋与装备

PoE2(Path of Building PoE2)是一款面向《流放之路2》的离线构建规划器:你在本地填入技能、装备与天赋,它实时算出技能DPS、有效伤害、生命与能量护盾等防御数据,全程不依赖服务器,所有数字都由本地计算引擎推导。 ## 计算引擎覆盖哪些内容:从基础伤害到有效DPS 任何一处改动——换一颗宝石、点一个节点、替换一件装备——右侧数字都会立即刷新。进攻侧,引擎先算基础伤害、攻击/

gitblog_00279的博客 499

React Native Firebase App 模块安装指南:SPM 与 CocoaPods 依赖解析深度解读

`@react-native-firebase/app` 是 React Native Firebase 生态的**核心模块**,无论你最终集成 Analytics、Auth 还是 Firestore,都必须先安装它。它负责建立 React Native 与原生 Firebase SDK(Android / iOS)之间的连接,并提供默认 App 实例、[次要 App 实例](https://li

gitblog_01024的博客 929

iOS开发framework和demo 使用cocoapod方法集成三方库

使用workspace。workspace相当于项目管理,创建workspace形成的文件是.xcworkspace。使用一、xcode创建workspace并放入SDKFramework文件夹内,如图选择File → new→Workspace → 点击save这时候文件夹中就多了 SDKFramework.xcworkspace 文件1-4.png。

qq_32873193的博客 3093

CocoaPods的安装和使用那些事(Xcode 7.2,iOS 9.2,Swift)

Using The CocoaPods to Manage The Third Party Open-source Libaries 介绍 CocoaPods是用来管理你的Xcode项目的依赖库的。使用一个名叫Podfile的文件来描述你的项目的依赖关系。CocoaPods会解析库之间的依赖关系,获取库的源代码,然后再Xcode的工作空间中将他们链接在一起来构建你的项目。归根结底,C...

agah91620的博客 150
下一篇: iOS 二维码生成
Cao_Shixin攻城狮
博客等级 码龄10年 710粉丝 102原创
评论 20
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值