在Swift创建CocoaPods

转自

http://www.csdn.net/article/2015-08-05/2825383/1


本文出自:raywenderlich,译文出自:开发技术前线,译者:MrLoong

你可能会熟悉一些众所周知的、开源的CocoaPods的框架,例如AlamofireMBProgressHUD,但有的时候你并不能找到一个符合你要求的pod,或者你可能想要把一个大的项目分成小的项目,或是可复用组建。

幸运的是创建自己的CocoaPods很容易。

如果你已经针对你的元件创建一个Cocoa Touch框架,那么就已经完成了大部分困难的工作。如果你没有创建过,不要惊慌,因为它确实很简单。

如果你仅仅是创建了iOS应用的一部分,那也是OK的。你可以很轻松地创建一些新的pod,用于特殊环境下使用的推送类和功能。

本教程以How to Use CocoaPods withSwift结束。如果你之前从来没有使用过CocoaPods,然而这是本教程的一个先决条件。

开始

你的顶级客户是一个冰淇凌店,他们的冰淇凌是如此地受欢迎,他们的柜台跟不上客户的订单,需要创建一个简洁的iOS应用,让用户使用他们的Phone订购冰淇凌。你将开始开发这个应用程序。

这里下载这个开始的项目——这是How to Use CocoaPods with Swift最终版本。这个应用有一些pod开发包已经包含在下载中,所以你不需要运行pod install去安装他们。

打开IceCreamShop.xcworkspace,然后点击Main.storyboard,在Views\Storyboards & Nibs看看这个应用是如何布局的。

下面是快速Choose Your Flavor的应用场景,核心功能如下:

  • PickFlavorViewController: handles user interaction,such as when
  • the user selects an ice cream flavor.
  • PickFlavorViewController:处理用户交互,例如当用户选择一个口味的冰淇凌的时候
  • PickFlavorDataSource: is the data source for the collection view
  • that displays ice cream flavors.
  • PickFlavorDataSource:是选择冰淇凌口味试图的数据源。
  • IceCreamView: is a custom view that displays an ice cream cone and
  • is backed by a Flavor model.
  • IceCreamView: 是一个冰淇凌自定义模型。
  • ScoopCell: is a custom collection view cell that contains a
  • ScoopView,which is also backed by an instance of the Flavor
  • model class.
  • ScoopCell:自定义集合试图集合单元包含一个ScoopView,也是风味模型的一个支持类。


这个冰淇凌店的老板非常喜欢这个应用程序,但他们又添加了一个新的要求:在他们的应用程序中需要有相同的口味风格选择。

等等,那不是最初的设计,但是,对于一个NB的开发者来说,应该没有问题的。

你能猜猜这个功能是怎么做的吗?是的,你将把这个功能集成到你自己的CocoaPod!。

建立你自己的Pod

创建一个新的Xcode项目并且选择iOS\Framework & Library\CocoaTouch Framework,然后点击下一步:


将工程命名为RWPickFlavor,并选择Swift语言,点击Next。

这个教程的工程将创建在~/Documents/Libraries,在你的主目录中选择Documents文件夹。如果你没有Libraries文件夹,在底部点击新建文件夹按钮并且创建它。

最后,选择Libraries文件夹并单击创建。

保存你开发的pods这个目录非常重要,因为在本地开发Podfile期间,你将引用这个目录。

正常情况下,当你使用CocoaPods,你在你的Podfile包含的关系是:

pod ' PodName ','~> 1.0'
但是当你开发你自己的CocoaPod,你将在本地建立一个特殊的路径,像这样:

pod ' MyPodName ',:path => ' ~/Path/To/Folder/Containing/My/Pod '

这种方法有两种好处:

  • 对于你的pod,它是使用本地机器上的文件,而不是从远程仓库中获取。
  • 正常情况下,你不需要选择一个pod包含到你的App中,因为这些选择将在你下一次运行pod install时被覆盖,pod将会重新从远程仓库读取并且覆盖更改的文件。
  • 你可以使用不同的位置对你的pods进行开发,一般情况下我建议还是将它们放在~/Documents/Libraries。如果你和一个团队合作开发,CocoaPods扩展作为扩展主目录,因此你不需要努力构建绝对路径在Podfile目录中。

    你也能使用其他的CocoaPods在你的工程中作为项目的依赖对于你创建CocoaPod。你只需要一个Podfile来管理你的CocoaPod依赖关系。

    关闭Xcode,然后在终端输入以下命令:

    cd ~/Documents/Libraries/RWPickFlavor pod init open -a Xcode Podfile

    这是创建一个新的Podfile,并在Xcode中打开它。

    使用下面的命令对Podfile进行更新:

    platform :ios,'8.0' use_frameworks! target 'RWPickFlavor' do pod 'Alamofire','~> 1.2' pod 'MBProgressHUD','~> 0.9.0' end

    这声明RWPickFlavor将在Alamofire和MBProgressHUD提供依赖关系。

    保存并关闭Podfile,然后在终端输入以下命令:

    pod install

    正如你所期望的,这将创建一个工作区间并安装你所需要的各种文件。

    注意:如果pod install给你任何警告,这样的话你可能使用的是旧版本。Swift基于CocoaPods,尤其是Alamofire,需要CocoaPods 0.36版本或更新。根据以下命令,你可以检测你已经安装的CocoaPods版本。
    pod --version
    如果是版本过低的原因,输入以下终端命令来安装最新的版本。
    sudo gem install CocoaPods

    输入以下命令,打开并创建一个新的RWPickFlavor工作区间。

    open RWPickflavor.xcworkspace

    你的项目导航器看起来应该是这个样子:

    你现在需要从IceCreamShop复制一些已经存在的文件在RWPickFlavor工作区间。

    首先在RWPickFlavor.xcworkspace创建一个组,把你需要的文件复制进去。

    1. Categories
    2. Controllers
    3. Factories
    4. Models
    5. Views

    • Ice Cream
    • Storyboards & Nibs

    现在拖拽每一个文件,除了AppDelegate.swift和LaunchScreen.xib,从IceCreamShop.xcworkspace拖拽进RWPickFlavor.xcworkspace,就像这样:

    当被提示时,确保每一个需要被复制的条目被复制安装了而不是简单的链接。

    当你完成了,RWPickFlavor应该有以下文件:

    RWPickFlavor

  • RWPickFlavor.h
  • Categories

    RGBAColorFromString.swift

  • Controllers
  • PickFlavorDataSource.swift
    PickFlavorViewController.swift

  • Factories
  • FlavorFactory.swift

  • Models
  • Flavor.swift

  • Supporting Files
  • Info.plist

  • Views
  • Ice Cream
  • Storyboard & Nibs
  • Main.storyboard

    现在,打开Info.plist,找到Supporting Files组,并且删除Main storyboard file base name。

    构建并运行,你不应该看见任何错误,并且你会看见“Ice Cream Shop”的图标和黑色的背景。

    图像呢?

    你可能会注意,你并没有复制Resources组,这是因为你需要复制的仅仅是background.jpg他自己本身到Resources文件夹中。不完整的Images.xcassets资源文件。

    首先在RWPickFlavor创建一个Resources组。

    下一步,选择Images.xcassets在IceCreamShop,点击右侧background,并且选择Show In Finder,像这样。

    现在拖拽background.jpg到RWPickFlavor的 Resources组中。当提示的时候依然检测每一个条目是否被安装。当你复制后,从IceCreamShop中删除Images.xcassets原来的背景。

    最后,在RWPickFlavor更新视图的图像上选择你的场景在Main.storyboard,所以引用background.jpg替代background:

    信不信,最难创造的是你的pod。


    CocoaPods和Git

    自从CocoaPods傻瓜式引导,每一个pod将需要有他自己的git仓库。如果你已经有一个首选的git托管,好的,你可以用它来作为你的仓库。

    如果没有,GitHub是一个很好的的选择因为它是众所周知的开发平台,有着很多自由的开源项目。在本教程中,我们使用GitHub,但你也可以使用git仓库。

    GitHub设置

    首先创建或登陆你的GitHub账户。

    下一步,点击顶部右侧+ (create new)图标并选择New repository展示如下:

    进入RWPickFlavor仓库,并选择Create repository。Github将创建一个新的仓库在你的账户下。然后你会看到下面的屏幕与一个快速设置,显示你储存的仓库网址。

    所以距离打开到现在你需要这个URL在短短的一瞬间。

    现在你需要第二个仓库涌来存放你所有私有的pod,你将在本教程中使用。

    在新窗口打开github.com,再一次点击Create new图标,并选择New repository。仓库名为RWPodSpecs,选择Create repository。

    离开这个标签,这样当你需要使用它的时候很简单去使用了。

    Podspec设置

    现在你需要创建RWPickFlavor.podspec文件对于RWPickFlavor,Podspec包含基础信息,尤其是pod的名字,版本和Git下载的URL

    在终端输入以下命令:

    cd ~/Documents/Libraries/RWPickFlavor pod spec create RWPickFlavor open -a Xcode RWPickFlavor.podspec

    这是创建的RWPickFlavor.podspec,在Xcode中打开它。

    默认情况下有很多优秀的例子和文档,然而你并不需要其中的大部分。

    以下RWPickFlavor.podspec代替了一切:

    Pod::Spec.new do |s| # 1 s.platform = :ios s.ios.deployment_target = '8.0' s.name = "RWPickFlavor" s.summary = "RWPickFlavor lets a user select an ice cream flavor." s.requires_arc = true # 2 s.version = "0.1.0" # 3 s.license = { :type => "MIT",:file => "LICENSE" } # 4 - Replace with your name and e-mail address s.author = { "[Your Name Goes Here]" => "[Your_Email@Your_Email_Domain.com]" } # For example,# s.author = { "Joshua Greene" => "jrg.developer@gmail.com" } # 5 - Replace this URL with your own Github page's URL (from the address bar) s.homepage = "[Your RWPickFlavor Homepage URL Goes Here]" # For example,# s.homepage = "https://github.com/JRG-Developer/RWPickFlavor" # 6 - Replace this URL with your own Git URL from "Quick Setup" s.source = { :git => "[Your RWPickFlavor Git URL Goes Here]",:tag => "#{s.version}"} # For example,# s.source = { :git => "https://github.com/JRG-Developer/RWPickFlavor.git",:tag => "#{s.version}"} # 7 s.framework = "UIKit" s.dependency 'Alamofire','~> 1.1' s.dependency 'MBProgressHUD','~> 0.9.0' # 8 s.source_files = "RWPickFlavor/**/*.{swift}" # 9 s.resources = "RWPickFlavor/**/*.{png,jpeg,jpg,storyboard,xib}" end

    就像一个Podfile,Podspec是用Ruby写的。要格外小心,不要做任何错误,否则将可能无法验证安装后是否成功.

    这是发生了什么?

  • 首先你详细说明了pod的基本信息。Swift必须最低基于CocoaPods8.0版本或者更高。如果你指定了较低的版本,pod无法正常安装。
  • 对于你指定的CocoaPod版本好,本质上Podspec是一个快照。当你更新一个pod,你也将需要更新Podspec的版本。所有的高版本度遵循Semantic Versioning如果你并没有相似的版本,请查阅《如何在Swift中使用CocoaPods?》。
  • 所有pods必须指定一个许可证。如果你没有,CocoaPods将在你安装的时候提出警告。并且你不能把它上传到分支。
  • 在这里,您可以指定关于自己的信息,pod作者。输入你的名字和e-mail地址。替代那些占位符文本。
  • 在这里你需要指定你的pod的网页和网址。就是简单的从浏览器地址栏复制和粘贴到Github主页。
  • 从上面创建第一个“Quick Setup”,那部分的git下载网址替代URL。最好使用一个HTTP或HTTPS:URL更容易被其他用户处理。如果你想你也可以使用SSH URL,但是你需要确保你团队的每一个人-无论谁需要访问CocoaPod-已经有自己的公钥/私钥针对你的Git host。
  • 这里你需要说明你的框架和pod依赖关系。
  • 在这里你可以说明指定基于文件扩展的公共源文件,在这种情况下,你可以说明‘.swift’作为扩展。
  • 最后你可以根据指定的文件扩展名指定资源。
  • 推送Git

    你终于准备推送RWPickFlavor pod GitHub主页!在终端输入以下命令,然后跳出提示,输入你的用户名和密码到Github。

    cd ~/Documents/Libraries/RWPickFlavor git init git add . git commit -m "Initial commit" git tag 0.1.0 git remote add origin [Your RWPickFlavor Git URL] git push -u origin master --tags

    这所有文件在RWPickFlavor目录中,创建一个新的0.1.0标签,并且推送你每一个东西到你的远程仓库。祝贺你,你已经创建你的第一个CocoaPod!

    你已经创建了第一个CocoaPod,但是你能真正的使用吗?并不能很快使用。

    你首先需要添加你的Podspec去私有的specs repo,当你尝试去安装它这让CocoaPods发现pod。对于这个你已经创建一个Git repo,所以这最后一步比较简单。

    在终端输入以下命令,确保你仍在RWPickFlavor目录中。

    pod repo add RWPodSpecs [Your RWPodSpecs Git URL] pod repo push RWPodSpecs RWPickFlavor.podspec

    这将创建一个本地引用 RWPodSpecs在你的机器上,并推送RWPickFlavor.podspec到它上。

    你现在有一个私有的pod specs repo被建立!比你想象的容易,对吗?

    使用你的新CocoaPod

    最后来使用你创建的pod。对于IceCreamShop打开Podfile,输入以下命令:

    确保你替换的[Your RWPodSpecs Git URL Goes Here]Git URL是你的RWPodSpecs repo,然后在终端运行pod install。

    最后,用下面的替换AppDelegate.swift。

    import UIKit import RWPickFlavor @UIApplicationMain class AppDelegate: UIResponder,UIApplicationDelegate { var window: UIWindow? var rootViewController: UIViewController! func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { setupRootViewController() window = UIWindow(frame: UIScreen.mainScreen().bounds) window?.rootViewController = rootViewController window?.makeKeyAndVisible() return true } func setupRootViewController() { let bundle = NSBundle(forClass: PickFlavorViewController.self) let storyboard = UIStoryboard(name: "Main",bundle: bundle) rootViewController = storyboard.instantiateInitialViewController() as! UIViewController } }

    在setupRootViewController(),你得到一个可参考的RWPickFlavor“bundle”,这实际上是一个动态绑定框架,创建一个Main.storyboard,并且实例化其根视图控制器。

    构建并且运行。你将看到你熟悉的“Choose Your Flavor”界面。


    抽象所有事物

    如果你像我一样,你可能会想,“哇,App Delegate一定知道很多关于RWPickFlavor结构”。幸运的是,有一些事情你可以做来减少这种耦合性,通过BetterBaseClasses来让创建CocoaPods更容易。

    添加一下代码带你的RWPickFlavor:

    pod 'BetterBaseClasses','~> 1.0'

    同样添加到RWPickFlavor.podspec:

    s.dependency 'BetterBaseClasses',sans-serif; font-size:14px; line-height:24px"> 现在替换版本:

    s.version = "0.2.0"

    在这里,你声明BetterBaseClasses作为一个关系,然后加入你的CocoaPod。现在你在终端运行pod install安装这个新的依赖关系。接下来添加提取PickFlavorViewController:

    import BetterBaseClasses

    然后替换类的定义:

    public class PickFlavorViewController: BaseViewController,UICollectionViewDelegate {

    这种PickFlavorViewController是BetterBaseClasses中的BaseViewController的一部分,现在你需要推送这些改变到你的RWPickFlavor andRWPodSpecs仓库。运行以下命令:

    cd ~/Documents/Libraries/RWPickFlavor git add . git commit -m "Added BetterBaseClasses dependency" git tag 0.2.0 git push origin master --tags pod repo push RWPodSpecs RWPickFlavor.podspec

    接下来你需要提交这些改变到你的IceCreamShop。更新IceCreamShop Podfile,替换`pod ‘RWPickFlavor’。

    pod 'RWPickFlavor','~> 0.2.0

    在这里更新Podfile请求的版本就是你刚刚推送的。

    在终端执行pod install去更新这种依赖关系在IceCreamShop。最后用以下内容替换AppDelegate.swift:

    这很简单,BetterBaseClasses添加到UIViewController、UITableViewController和其他的UIkit类。这里包括一个UIViewController+BetterBaseClasses,增加了更加方便的方法,尤其是instanceFromStoryboard()使它更容易实例化视图控制器。无论他们在main bundle活着其他一些地方,尤其是在框架中。

    再一次构建并运行,你应该看见了熟悉的界面“Choose Your Flavor”。

    何去何从?

    你能在这儿这里完成IceCreamShop project和RWPickFlavor pod工程的下载。

    你现在开始准备制作自己的CocoaPods!然而,本教程谈到的CocoaPods知识冰山一角。你可以通过学习CocoaPodsGuides去了解创建CocoaPods的知识。

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐


    软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘贴.待开发的功能:1.支持自动生成约束2.开发设置页面3.做一个浏览器插件,支持不需要下载整个工程,可即时操作当前蓝湖浏览页面4.支持Flutter语言模板生成5.支持更多平台,如Sketch等6.支持用户自定义语言模板
    现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。目前我们在计算机上进行音频播放都需要依赖于音频文件。那么音频文件如何生成的呢?音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程,我们人耳所能听到的声音频率范围为(20Hz~20KHz),因此音频文件格式的最大带宽是20KHZ。根据奈奎斯特的理论,音频文件的采样率一般在40~50KHZ之间。奈奎斯特采样定律,又称香农采样定律。...............
    前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗 【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCII Animator进行ASCII字符转换把转换的字符gif根据每
    【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
    前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至2022年4月底。我已经将这篇博客的内容写为论文,上传至arxiv:https://arxiv.org/pdf/2204.10160.pdf欢迎大家指出我论文中的问题,特别是语法与用词问题在github上,我也上传了完整的项目:https://github.com/Whiffe/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset关于自定义ava数据集,也是后台
    因为我既对接过session、cookie,也对接过JWT,今年因为工作需要也对接了gtoken的2个版本,对这方面的理解还算深入。尤其是看到官方文档评论区又小伙伴表示看不懂,所以做了这期视频内容出来:视频在这里:本期内容对应B站的开源视频因为涉及的知识点比较多,视频内容比较长。如果你觉得看视频浪费时间,可以直接阅读源码:goframe v2版本集成gtokengoframe v1版本集成gtokengoframe v2版本集成jwtgoframe v2版本session登录官方调用示例文档jwt和sess
    【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
    用Android Studio的VideoView组件实现简单的本地视频播放器。本文将讲解如何使用Android视频播放器VideoView组件来播放本地视频和网络视频,实现起来还是比较简单的。VideoView组件的作用与ImageView类似,只是ImageView用于显示图片,VideoView用于播放视频。...
    采用MATLAB对正弦信号,语音信号进行生成、采样和内插恢复,利用MATLAB工具箱对混杂噪声的音频信号进行滤波
    随着移动互联网、云端存储等技术的快速发展,包含丰富信息的音频数据呈现几何级速率增长。这些海量数据在为人工分析带来困难的同时,也为音频认知、创新学习研究提供了数据基础。在本节中,我们通过构建生成模型来生成音频序列文件,从而进一步加深对序列数据处理问题的了解。
    基于yolov5+deepsort+slowfast算法的视频实时行为检测。1. yolov5实现目标检测,确定目标坐标 2. deepsort实现目标跟踪,持续标注目标坐标 3. slowfast实现动作识别,并给出置信率 4. 用框持续框住目标,并将动作类别以及置信度显示在框上
    数字电子钟设计本文主要完成数字电子钟的以下功能1、计时功能(24小时)2、秒表功能(一个按键实现开始暂停,另一个按键实现清零功能)3、闹钟功能(设置闹钟以及到时响10秒)4、校时功能5、其他功能(清零、加速、星期、八位数码管显示等)前排提示:前面几篇文章介绍过的内容就不详细介绍了,可以看我专栏的前几篇文章。PS.工程文件放在最后面总体设计本次设计主要是在前一篇文章 数字电子钟基本功能的实现 的基础上改编而成的,主要结构不变,分频器将50MHz分为较低的频率备用;dig_select
    1.进入官网下载OBS stdioOpen Broadcaster Software | OBS (obsproject.com)2.下载一个插件,拓展OBS的虚拟摄像头功能链接:OBS 虚拟摄像头插件.zip_免费高速下载|百度网盘-分享无限制 (baidu.com)提取码:6656--来自百度网盘超级会员V1的分享**注意**该插件必须下载但OBS的根目录(应该是自动匹配了的)3.打开OBS,选中虚拟摄像头选择启用在底部添加一段视频录制选择下面,进行录制.
    Meta公司在9月29日首次推出一款人工智能系统模型:Make-A-Video,可以从给定的文字提示生成短视频。基于**文本到图像生成技术的最新进展**,该技术旨在实现文本到视频的生成,可以仅用几个单词或几行文本生成异想天开、独一无二的视频,将无限的想象力带入生活
    音频信号叠加噪声及滤波一、前言二、信号分析及加噪三、滤波去噪四、总结一、前言之前一直对硬件上的内容比较关注,但是可能是因为硬件方面的东西可能真的是比较杂,而且需要渗透的东西太多了,所以学习进展比较缓慢。因为也很少有单纯的硬件学习研究,总是会伴随着各种理论需要硬件做支撑,所以还是想要慢慢接触理论学习。但是之前总找不到切入点,不知道从哪里开始,就一直拖着。最近稍微接触了一点信号处理,就用这个当作切入点,开始接触理论学习。二、信号分析及加噪信号处理选用了matlab做工具,选了一个最简单的语音信号处理方
    腾讯云 TRTC 实时音视频服务体验,从认识 TRTC 到 TRTC 的开发实践,Demo 演示& IM 服务搭建。
    音乐音频分类技术能够基于音乐内容为音乐添加类别标签,在音乐资源的高效组织、检索和推荐等相关方面的研究和应用具有重要意义。传统的音乐分类方法大量使用了人工设计的声学特征,特征的设计需要音乐领域的知识,不同分类任务的特征往往并不通用。深度学习的出现给更好地解决音乐分类问题提供了新的思路,本文对基于深度学习的音乐音频分类方法进行了研究。首先将音乐的音频信号转换成声谱作为统一表示,避免了手工选取特征存在的问题,然后基于一维卷积构建了一种音乐分类模型。
    C++知识精讲16 | 井字棋游戏(配资源+视频)【赋源码,双人对战】
    本文主要讲解如何在Java中,使用FFmpeg进行视频的帧读取,并最终合并成Gif动态图。
    在本篇博文中,我们谈及了 Swift 中 some、any 关键字以及主关联类型(primary associated types)的前世今生,并由浅及深用简明的示例向大家讲解了它们之间的奥秘玄机。