cocoapods更新某个库 上的版本何时更新

在Swift中使用CocoaPods
从CocoaPods的从介绍来看,它是主要给Objective-C项目用的,但是我们可以很容易地混合Objective-C和Swift到同个项目,从而利用大量的CocoaPods库和Swift漂亮舒服的语法。
什么是 CocoaPods
&&CocoaPods is the dependency manager for Objective-C projects. It has thousands of libraries and can help you scale your projects elegantly. &
从介绍看,它是主要给 Objective-C 项目用的,但是我们可以很容易地混合 Objective-C 和 Swift 到同个项目,从而利用大量的 CocoaPods 库和 Swift 漂亮舒服的语法。
作为 iOS 开发新手,一定是要紧跟前人脚步,学习使用 CocoaPods 。
这里简单略过,请参考其他无数的文章。
系统默认安装,可以参考。在命令行下执行。
sudo&gem&install&cocoapods&
我的环境是 HomeBrew
#&添加&taobao&Mirror&不然被墙掉没办法下载&gem&sources&-a&http:&#&安装&gem&install&cocoapods&#&更新命令&rbenv&rehash&#&执行&pod&#&此时一般会下载官方的所有&PodSpec&库,也可以用&pod&setup&初始化环境&
本文不打算在安装部分耗费太多时间。希望看到这里保证你的命令行下有可用的 pod 命令。
假设我们已经有个项目,叫 ProjName ,需要使用一些注明的 CocoaPods 库,比如 AFNetworking3.
首先,命令行 cd 到我们的项目目录,一般 ls 命令会看到如下几个文件夹:
ProjName&ProjName.xcodeproj&ProjNameTests&
赞,就是这里,创建一个 Podfile 文本文件,写入如下内容
platform&:ios,&&8.0&&pod&&AFNetworking&,&&~&&2.0&&
一般这么简单的文件都是直接 nano 写。 :)
直接创建 Podfile , CocoaPods 会创建一个项目同名的 WorkSpace ,然后添加一个叫 Pods 的项目,这个项目编译结果是一个叫 libPods.a的链接库, 它会添加到我们之前的 ProjName 项目中作为编译依赖。
当然,通过命令行执行 pod init 也可以自动创建 Podfile,而且可以自动分析当前项目的 target ,相对来说更好,也更优雅。具体请参考官方手册。这样的好处是更细致,还可以区分多个子项目子 target 。原理大同小异。
然后接下来,命令行执行 open ProjName.xcworkspace,注意这个可不是 .xcodeproj,这个是 CocoaPods 为我们创建的一个 WorkSpace ,包含我们之前的项目,和 Pods 依赖。
开始编码过程。直接在代码里调用,比如写在某个按钮的 @IBAction 里:
let&manager&=&AFHTTPRequestOperationManager()&let&url&=&&http://api.openweathermap.org/data/2.5/weather&&println(url)&&let&params&=&[&lat&:&39.26,&&lon&:&41.03,&&cnt&:0]&println(params)&&manager.GET(url,&&&&&parameters:&params,&&&&&success:&{&(operation:&AFHTTPRequestOperation!,&&&&&&&&&&&&&&&&&responseObject:&AnyObject!)&in&&&&&&&&&println(&JSON:&&&+&responseObject.description!)&&&&&},&&&&&failure:&{&(operation:&AFHTTPRequestOperation!,&&&&&&&&&&&&&&&&&error:&NSError!)&in&&&&&&&&&println(&Error:&&&+&error.localizedDescription)&&&&&})&
这里直接抄了 JakeLin 的 SwiftWeather 代码4,就一小段,希望他不会打我。
Swift 坑爹了
看起来貌似我们已经可以在 Swift 中使用 AFNetworking 了。结果刚写几句代码一堆类和变量找不到定义,而且坑爹的是很多时候我们只能靠猜测,判断这些 Objective-C 的定义转换成 Swift 定义是什么样子,用起来就是完全靠蒙!
这不科学!
这都三礼拜了,所以大家都摸索出了调用的方法,那就是按照和 Objective-C 代码混编的例子,添加 Bridging Header !
之前简单介绍过和 Objective-C 交互的内容5,大家可以去围观。
一般说来,你在 Swift 项目新建 Objective-C 类的时候,直接弹出是否创建 Bridge Header 的窗口,点 YES 就是了,这时候一般多出来个 ProjectName-Bridging-Header.h 。然后删掉这个类, Bridging Header 头文件还在。
在这个 Bridging Header 文件里写入要导入的 CocoaPods 库,就可以在 Swift 中使用了。
#import&&AFNetworking/AFNetworking.h&&
如果没有自动创建头文件的话,这个配置在项目的 Build Settings 中的 Swift Compiler & Code Generation 子项里。
创建一个头文件,指定为 Bridging Header 也可以。
然后编译,成功执行!
这就完事了?
实际上,前两天刚写一篇
, 把任意 Objective-C 库当做 Swift Module 是可行的。当时就觉得这个东西应该是可能完全进入 CocoaPods 的,但是在官方 repo 找了下发现,以前有人提过增加 module.map 支持,结果 CocoaPods 的人认为这个是 llvm 内部特性, issue 被关闭了。 最近又被提起,我在后面提了下 Swift 支持,希望官方靠谱。
所以下面的内容,就是,我们是否可以在 CocoaPods 上加入 module.map 支持,然后直接在 Swift 中 import ModuleName ?
扩展 CocoaPods
考虑了多种方式,最后选择了 Hook 的方式。如果 Ruby 技术足够好,或许可以直接写个插件。或者直接改官方代码给官方提交。但是实在能力有限。相关的 module.map 语法参考 llvm 官方手册 。用了最简单的功能。也许遇到复杂的 PodSpec 就不起作用了,但是原理如此,相信小伙伴们已经知道怎么做了。
目前我的 Podfile 大概是这个样子:
platform&:ios,&&8.0&&pod&&AFNetworking&,&&~&&2.0&&pod&&Baidu-Maps-iOS-SDK&,&&~&&2.0&&&post_install&do&|installer|&&&File.open(&#{installer.sandbox_root}/Headers/module.map&,&'w')&do&|fp|&&&&&installer.pods.each&do&|pod|&&&&&&&normalized_pod_name&=&pod.name.gsub('-',&'')&&&&&&&fp.write&&&EOF&module&#{normalized_pod_name}&[system]&{&&&umbrella&&#{pod.name}&&&&export&*&}&EOF&&&&&&&puts&&Generating&Swift&Module&#{normalized_pod_name.green}&for&#{pod}&OK!&&&&&&end&&&end&end&
post_install 是 Podfile 的一种 hook 机制,可以用来加入自定义操作。我在这里的写的逻辑就是,针对所有的 Pod 生成一个 module.map 文件。 位于 Pods/Headers/,这个目录被 CocoaPods 自动设置为项目的 Header Search Path 所以不需要额外处理。默认我们的 Swift 文件就找得到。
其中 normalized_pod_name 用于处理百度地图 API SDK 这一类名字带减号的库,因为他们不能作为 Module Name ,实际上或许有更好的方法来处理。
实测发现完全没有问题,直接 import AFNetworking 或者 import BaiduMapsiOSSDK 都可以。
而且很不错的一点是,按住 Command 键,然后鼠标点击模块名、类名等,会跳转到 Swift 定义。
遇到提示 .pcm 文件 outdate 的情况下需要你删除 $HOME/Library/Developer/Xcode/DerivedData/ModuleCache 目录,这个目录保存的是预编译模块,类似于预编译头文件。
目前 Swift 还是有很多 BUG 的,调用 NSObject 也许会让编译器直接 segment fault ,不带任何出错信息。很伤情。此时请第一时间检查语法是否有诡异,其次将所有用到字符串或者 Optional 的地方都额外用变量处理,避免用字面常量。(个人经验)
如果多次调用 pod install 并在其中修改过 Podfile,那么有可能你的项目依赖会乱掉,多了不存在的 .a 文件到依赖或者多次包含。手工在项目树和项目选项里删除就可以了。此类编译错误都是链接错误。
本文提出了一种 Bridging Header 之外的使用 CocoaPods 库的方法。利用有限的 Ruby 知识写了个 Hook 。目前测试 OK 。
CocoaPods 官网
CocoaChina 对 CocoaPods 的介绍
(Swift 与 Objective-C 之间的交互)
CocoaChina是全球最大的苹果开发中文社区,官方微信每日定时推送各种精彩的研发教程资源和工具,介绍app推广营销经验,最新企业招聘和外包信息,以及Cocos2d引擎、Cocos Studio开发工具包的最新动态及培训信息。关注微信可以第一时间了解最新产品和服务动态,微信在手,天下我有!
请搜索微信号“CocoaChina”关注我们!
关注微信 每日推荐
扫一扫 浏览移动版1055人阅读
粉笔网的iOS工程师曾经写过一篇blog介绍了基本的CocoaPods使用方法。本文将另外谈一谈如何使用CocoaPods进行本地的包管理。建议没有接触过CococaPods的朋友先阅读一下唐巧的blog。
为什么要进行本地的包管理
有的时候CocoaPods的spec版本过旧,pull request没有及时merge,导致我们无法利用CocoaPods使用较新的代码版本;有的时候我们的一些代码不是开源的,或者暂时不想放到Github上。我们更想使用CocoaPods引用本地的代码;
使用CocoaPods里没有的第三方库新版本
这里我们以PlayHavenSDK为例介绍一下。我们在这个repository里面可以看到,PlayHavenSDK的版本是1.11.0。而里面的tag,已经有了1.12.1这个版本。CocoaPods的Spec repository已经落后了两个版本。这时我们想使用最新版,需要的就是一个更新的spec。
Pod::Spec.new do |s|
s.name = 'PlayHavenSDK'
s.version = '1.12.1'
s.license = 'MIT'
s.summary = 'PlayHaven is a real-time mobile game marketing platform to help you take control of the business of your games.'
s.homepage = ''
s.author = { 'Sam Stewart' =& '' }
s.source = { :git =& '/playhaven/sdk-ios.git', :tag =& '1.12.1' }
s.description = &PlayHaven is a real-time mobile game marketing platform to help you take control of the business of your games. Acquire, retain, re-engage, and monetize your players with the help of PlayHaven's powerful marketing platform. Integrate once and embrace the flexibility of the web as you build, schedule, deploy, and analyze your in-game promotions and monetization in real-time through PlayHaven's easy-to-use, web-based dashboard. An API token and secret is required to use this SDK. These tokens uniquely identify your app to PlayHaven and prevent others from making requests to the API on your behalf. To get a token and secret, please visit the PlayHaven developer dashboard at .&
s.platform = :ios
s.source_files = 'Cache', 'src', 'WaterWorks', 'JSON', 'OpenUDID'
s.frameworks = 'SystemConfiguration', 'CFNetwork', 'StoreKit', 'CoreGraphics', 'QuartzCore'
s.weak_frameworks = 'AdSupport'
这里我们注意到s.source这一行配置,指向了playhaven/sdk-ios.git仓库的1.12.1这个tag,表示这个spec将使用这个tag的代码。我们将它保存到本地的一个目录中,如~/Desktop/PlayHavenSDK/PlayHavenSDK.podspec。
我们回到Xcode project目录中,打开Podfile,添加pod 'PlayHavenSDK', :podspec =& '~/Desktop/PlayHavenSDK/PlayHavenSDK.podspec',接着运行pod
update即可。
PS: 当然这个podspec也可以不放在本地,比如放在gist上。
使用CocoaPods管理本地代码
这种情况稍微复杂一步,除了指定podspec,还需要准备一个本地要使用的git repository。我们以Chartboost为例来进行说明。
首先我们新建一个名为~/Desktop/ChartboostSDK/的目录,然后执行git
init初始化这个git repository。
接着我们去Chartboost官方网站下载最早新的SDK。将它放进这个目录中,然后执行git add . && git commit -m&Add new SDK&。
这样我们这个目录已经成为一个git repository,里面是最新的Chartboost SDK。
这时我们仍然需要一个podspec文件,来说明我们从哪个仓库来获取代码:
Pod::Spec.new do |s|
s.name = 'ChartboostSDK'
s.version = '3.1.1'
s.license = 'Commercial'
s.summary = 'ChartboostSDK for showing ads and more apps pages, and tracking analytics and in-app purchase revenue.'
s.homepage = '/'
s.author = { 'Chartboost' =& '/' }
s.source = { :git =& '~/Desktop/ChartboostSDK' }
s.platform = :ios
s.source_files = '**/*.h'
s.preserve_paths = '**/*.a'
s.library = 'Chartboost'
s.xcconfig = { 'LIBRARY_SEARCH_PATHS' =& '&$(PODS_ROOT)/ChartboostSDK/Chartboost&' }
s.weak_frameworks = 'AdSupport', 'StoreKit'
s.frameworks = 'QuartzCore', 'SystemConfiguration', 'CoreGraphics'
我们运行ls -lh | awk '{print $9}',ChartboostSDK目录的结构显示如下:
CBAnalytics.h
Chartboost.h
ChartboostSDK.podspec
libChartboost.a
除了两个.h,一个.a,还有一个podspec文件。
接着我们回到Xcode proj所在的文件夹中,编辑Podfile,添加pod 'ChartboostSDK', :local =& '~/Desktop/ChartboostSDK'。这里的local表明从本地的git仓库里获取代码。
最后我们运行pod update,大功告成。
CocoaPods小结
上面的两种情况,简单来说:
需要使用最新的开源代码/库,但没最新的spec需要使用私有代码/库,需要对应的私有的spec
对于第一种情况,建议大家可以给提交一个pull request。
使用CocoaPods只需要知道两件事情:
podspec:一个pod的配置是什么,pod的代码放在哪里Podfile:项目依赖哪个pod,以何种方式依赖,它的podspec放在哪里
这里podspec和git repository都非常灵活,可以放在本地,也可以放到github/gist上。代码仓库甚至可以不使用git而直接使用一个zip压缩包。
使用CocoaPods可以把多们从繁重的配置和代码管理中解脱出来,而且可以少犯错误。比如Deployment Target设置为5.0,但App中需要使用AdSupport.framework,如果忘记设置为optional则所有5.x的设备运行时都会crash。对于这种情况CocoaPods在spec提供了weak_frameworks的配置选项。同时CocoaPods能够保证库的依赖关系,而不会出现几个项目依赖版本不一致的情况。
PS: 最近为了UDID更新的同学们可别犯AdSupport.framework这个错误,后果很严重。
希望这个blog对大家使用CocoaPods有所帮助。
赶个时髦,祝大家一帆风顺。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:834794次
积分:11618
积分:11618
排名:第524名
原创:175篇
转载:820篇
译文:44篇
评论:122条
(15)(9)(3)(9)(3)(2)(7)(5)(1)(3)(14)(24)(20)(28)(14)(21)(19)(36)(26)(18)(21)(35)(49)(23)(60)(38)(33)(51)(49)(58)(44)(67)(31)(44)(70)(90)(1)收藏,708 浏览
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
按照教程上的试验了cocoaPods是否安装成功,却出现这样的问题
和教程上德不一样啊
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我只是个搬运工
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
命令行pod setup:升级spec仓库数据
同步到新浪微博
分享到微博?
不要错过该问题的后续解决方案
如果你没找到答案,记得登录关注哦,大家会尽全力帮你解决的 ^___^
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
举报理由:
推广(招聘、广告、SEO 等)方面的内容
带有人身攻击、辱骂、仇恨等违反条款的内容
与已有问题重复(请编辑该提问指向已有相同问题)
内容质量差,或不适合在本网站出现
答非所问,不符合答题要求
其他原因(请补充说明)
补充说明:
扫扫下载 App主题 : 最近更新了CocoaPods,结果创建完Podfile后运行pod update时出错
级别: 新手上路
UID: 289405
可可豆: 157 CB
威望: 92 点
在线时间: 67(时)
发自: Web Page
来源于&&分类
最近更新了CocoaPods,结果创建完Podfile后运行pod update时出错&&&
引用 Update all podsUpdating local specs repositoriesAnalyzing dependenciesDownloading dependenciesInstalling AFNetworking (2.5.4)[!] Error installing AFNetworking[!] /usr/bin/git clone
/var/folders/ls/jt4v8j_922jc_z4w40tn000r0000gn/T/d62-iui6nc --single-branch --depth 1 --branch 2.5.4Cloning into '/var/folders/ls/jt4v8j_922jc_z4w40tn000r0000gn/T/d62-iui6nc'...error: RPC result=56, HTTP code = 200fatal: The remote end hung up unexpectedlyfatal: early EOFfatal: index-pack failed[!] CocoaPods was not able to update the `master` repo. If this is an unexpected issue and persists you can inspect it running `pod repo update --verbose`
~~~^_^~~~ 他们说不作死就不会死,我说不作死也会死
级别: 新手上路
UID: 289405
可可豆: 157 CB
威望: 92 点
在线时间: 67(时)
发自: Web Page
有没有人遇到过,求解决方法
~~~^_^~~~ 他们说不作死就不会死,我说不作死也会死
关注本帖(如果有新回复会站内信通知您)
论坛技术问题应该发布到? 正确答案:CocoaChina问答
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版当前访客身份:游客 [
做真正的程序人 iOS技术群:
:好文章。目前ShareREC_v1.1.3版本之后,是可以录...
:免费提供App网页自动下载安装所需https服务器!微...
:引用来自“as3的学习者”的评论 没有找到1.4版本...
:没有找到1.4版本,在github上下载了你的源码重编...
:引用来自“qiujunwei”的评论我现在要设置新浪微...
:我现在要设置新浪微博分享时的UI ,因为分享图片...
:引用来自“邓鹏辉”的评论 可不可以直接粘贴图片...
:可不可以直接粘贴图片
今日访问:42
昨日访问:27
本周访问:42
本月访问:838
所有访问:45399
CocoaPods安装与使用
发表于2年前( 23:51)&&
阅读(5931)&|&评论()
0人收藏此文章,
本文将介绍CocoaPods从安装到使用过程。
CocoaPods是一个负责管理iOS项目中第三方开源代码的工具。使用CocoaPods可以为我们节省设置和更新第三方开源库的时间。 下面将分为两部分来讲述如何安装和使用CocoaPods。
一、安装CocoaPods
& & 先使用下面命令升级Ruby版本:
gem update --system & & 等待更新完成后,然后通过gem命令来下载安装CocoaPods:
gem install cocoapods & & 安装完毕后调用下面命令,进行CocoaPods设置:
& & 执行完成上述命令后,表示安装成功!下面将讲述如何使用CocoaPods。
二、使用CocoaPods
& & 打开终端,使用cd命令定位到需要使用CocoaPods的项目根路径。如:
cd /Users/username/Documents/Projects/Demo & & 先考虑项目中需要引用哪些库,然后在通过search命令来查找库的信息,如需要加入JSONKit,那可以如下写法:
pod search JSONKit & & 命令执行后会得到如下结果:
-& JSONKit (1.5pre)
A Very High Performance Objective-C JSON Library.
pod 'JSONKit', '~& 1.5pre'
- Homepage: /johnezang/JSONKit
/johnezang/JSONKit.git
- Versions: 1.5pre, 1.4 [master repo] & & 其中的pod 'JSONKit', '~& 1.5pre'是待会要写入到Podfile中的信息。如果已经知道这些信息,那可以直接省略此步。直接进行下面的步骤。
& & 得到必要的库信息后,现在需要在项目中建立Podfile文件。通过下面的命令:
touch Podfile & & 然后编辑Podfile文件,命令如下:
open -e Podfile & & 在弹出的编辑界面中输入下面内容:
platform :ios
pod 'JSONKit', '~& 1.5pre' & & 然后调用下面命令来进行初始化:
pod install & & 运行完毕后,原本的项目目录会多出一些文件。如图:
& &&多了*.xcworkspace &pod等文件。这是pod生成的项目管理文件,打开LibDemo.xcworkspace 项目文件,在Xcode里看到是这样的目录结构:
& & 这里要注意的一点是,如果不调用创建Podfile命令就直接调用pod install命令。将会提示“
[!] No `Podfile' found in the current working directory.”
& & 如果Podfile中添加了新库,可以使用下面命令进行更新:
pod update
& & &现在,你的所有第三方库都已经下载完成并且设置好了编译参数和依赖,你只需要记住如下2点即可:&
& & 1、使用CocoaPods生成的 .xcworkspace 文件来打开工程,而不是以前的 .xcodeproj 文件。&
& & &2、每次更改了Podfile文件,你需要重新执行一次pod install或者pod update命令&。
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读}

我要回帖

更多关于 cocoapods更新某个库 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信