Tag: cocoapods

宣布可可足类产生

抬起头,我们已经搬家了! 如果您想继续了解Square的最新技术内容,请访问我们的新家https://developer.squareup.com/blog 在Square,我们将CocoaPods用作iOS开发工作流程的核心部分,除了在测试套件中使用的库之外,仅在Square Point of Sale应用程序中就有大量库。 这些库中有许多都生活在我们的主要iOS monorepo中,并且随着应用的增长,构建整个库所需的时间也越来越长。 CocoaPods允许我们将所有库配置保留在易于阅读的podspec文件中,与Xcode项目相比,在pull请求中查看它要容易得多。 我们的项目配置很少在Xcode本身中进行管理,这确保了文件系统与Xcode中所见内容之间的一致性。 但是,将所有这些模块集成到单个项目中存在一些缺点。 尽管我们已经投入了很多精力来改善安装依赖项的整体性能,但是运行单个pod install命令可能需要一到两分钟,这在快速迭代单个库时会加起来。 使用CocoaPods还会生成一个非常大的Pods项目,这可能导致Xcode的响应速度变慢,并且需要很长时间才能建立索引。 随着这种爆炸性的增长,显然我们需要开发人员更好的工作方式。 我们希望能够隔离地处理模块,仅构建正在积极处理的模块并仅运行随附的测试套件。 输入pod gen。 我们构建了一个CocoaPods插件,该插件使iOS开发人员可以轻松地独立处理各个库,尤其是在monorepo的情况下。 运行此插件将生成一个存根应用程序项目,该项目将集成并链接指定的库及其依赖项。 我们完整的Pods项目大约需要95秒才能生成,并且是35.6万行。 如果我们在U​​I组件库上运行pod gen,则将花费5秒钟并生成9000行项目文件。 这使得在这些基础库上的迭代变得如此快,并且工具可以轻松地处理较小的规模。 关于gen的最酷的事情是它会自动从现有Podfile和Podfile.lock中引入依赖项限制,因此所有配置都将在生成的库工作区中进行镜像。 这不仅在用于独立开发的monorepo上下文中有用。 当与可从podspec中描述测试的功能结合使用时,它在独立的存储库中也可以很好地工作。 这使独立库可以避免检入和维护自己的Xcode项目,因为CocoaPods可以对其进行管理。 这意味着您不再需要处理PR中的Xcode冲突,因为.xcodeproj只是生成的用于开发的工件。 podspec本身成为描述您的库的真理源,您可以使用简单的pod gen命令从中生成工作区。 可以简单地将测试放在文件系统中的相应文件夹中,并将其作为CI的一部分运行。 例如,我们设置了这个演示仓库,我们需要签入的唯一配置是podspecs。 我们已经在内部使用这种宝石几个月了,很高兴与世界分享它!

椰子足与迦太基

很多时候,我们想知道如何管理对我们iOS项目的依赖。 从历史上看,这非常简单,因为选项非常有限。 从历史上看,我们使用Cocoapods是诚实的唯一有意义的选择,因为您既不想自己也不使用git子模块来管理它们。 过去的依赖管理 随着时间的流逝,我们意识到有新的选项可以管理依赖项。 当迦太基第一次出现时,我们也给了它一个机会,但它仍处于早期开发阶段,因此它具有很多令人讨厌的缺点。 不可能只为一个平台建立依赖关系,更新一个依赖关系而不更新其他依赖关系是不可能的,添加一个依赖关系而不编译其他依赖关系也是不可能的。 这样的事情只会让我们放慢脚步,因此我们决定坚持使用Cocoapods。 我们也不喜欢迦太基的哲学,因为我们喜欢运行pod install而不处理其他任何东西的想法。 迅速并发症 自从我们开始使用Swift作为主要的编程语言以来,我们面临着越来越多的麻烦-编译时间增加,语法高亮和SourceKit崩溃频繁。 我们开始想知道如何使我们的开发人员的生活更加愉快。 我们的第一个想法是看一下我们的依赖关系,因为它们是不变的代码,不需要被Xcode一次又一次地索引和编译。 这就是Carthage展示其优势的地方-依赖关系仅在框架中构建一次,仅此而已,不再需要建立索引,也无需进行编译。 迦太基反击 我们进行了一次尝试,Carthage似乎解决了所有早期开发阶段的问题,因此我们仅使用platform选项为iOS构建,而使用cache-builds选项跳过了已在本地编译的框架的编译。 结果真的很酷-语法突出显示变得更加可靠,并且构建时间减少了百分之几十。 这意味着,即使在功能不强的设备上,iOS开发也比15英寸Macbook Pro更舒适。 这也意味着我们决定以迦太基作为主要的依赖项管理器开始新项目。 我说主要的,尽管仍有一些不支持它的图书馆。 这些可能是较旧的存储库,它们不再维护或对我们无关紧要,因为我们尝试仅使用维护的库。 但是,某些专有软件使用静态库,这意味着它不能由迦太基管理。 在那些情况下,我们仍然使用Cocoapods。 持续的不便 但是,我们仍然遇到一些问题。 依赖项的初始编译时间可能会非常长,尤其是当依赖项包含多个子规范时(在Cocoapods术语中),因为Carthage会编译它们的全部(及其所有依赖项),即使项目不需要它们也是如此(为此存在拉动)迦太基github上的请求,这将减少这种不便,但目前仍未合并)。 我们也希望在项目之间进行一些本地缓存。 在我们的机器上,我们有更多的项目使用Carthage,并且经常使用相同版本的依赖项。 如果我们在每个项目中都运行迦太基引导程序 ,则即使它们的依赖关系可能是由以前的项目构建的,也可以建立依赖关系,这可以节省大量的构建时间。 也许与团队远程共享构建工件也很好。 由于我们的许多项目都使用Realm数据库,因此Carthage的空间利用率也可能更高一些-其工件占用大约1 GB的磁盘空间。 如果您有更多项目,则会很快损失很多空间。 仍然不是最好的 迦太基虽然极大地加快了我们的发展速度,但是仍然存在一些需要解决的问题。 也许现在可以通过使用正确的参数集来解决其中的一些问题,而另一些可以通过使用正确的工具(如Rome)来解决,但是那些提到的缺点可以很好地在迦太基内部集中解决。 分享是关怀 我们认为#sharing很重要,因此我们很乐意听到您如何管理依赖项。 您可以在下面给我们留下评论,或者在我们的Twitter,Github或Facebook上ping我们。

Swift 4和iOS 11中的第三方库入门指南:

当我决定在项目中进行自定义操作时,我总是避免使用第三方库,因为我认为库对项目有害。 例如兼容性问题,速度问题,内存问题等。另外,我感觉自己走了简单的路。 经过对专业机构应用程序的观察和研究,我意识到第三方库是有益的,并且它们被普遍使用。 但是,我们需要注意一些重要的方面,例如GitHub上的库的星号,有关错误和问题的响应率,可理解的使用文档,尤其是实际情况。 确定问题或需求: 请查看以下网址:https://github.com/vsouza/awesome-ios。 我建议对这种非常有用的库进行编译。 几乎对第三方库的每个使用领域,都按标题排序。 例如,如果您搜索有关过渡动画的内容,只需从内容中选择标题。 之后,请看一下对库的简短描述,然后选择一个或多个。 下一步是评估文件,星级和回应。 检查文档是否对您足够,星号可接受,问题回复是否有用等。您将使用此库吗? 好的。 现在转到安装部分。 安装: 从图书馆页面找到吊舱方向,然后按照此视频进行操作。 (您需要安装Cocapods。) https://streamable.com/c1xk4 用法: 首先,如果库有点复杂,我建议下载示例项目并进行分析。 逐步解决工作原理。 第一步可以从分析Main.storyboard结构开始。 观察视图及其类。 在那之后,下一步应该是分析代码。 您分析了所有示例项目并针对您的方案实施了该项目。 无论如何,您的项目无法按预期工作。 您应该错过一些东西: 1-尝试查看每个视图,对象及其类以及连接。 例如,假设您的库与过渡动画有关,那么您绝对应该查看控制器之间的联系。 2-尝试在所选对象的身份检查器中查找“用户定义的运行时属性”。 3-您是否检查了由图书馆超级班级定制的班级? 你能做什么? 读。 使用CMD + Click(跳转到定义)功能并读取几乎每个功能上方的所有注释行非常重要。 如果我举一个简单的例子,您可以执行CMD +单击并跳转UITableViewDelegate,UITableViewDataSource,UIScrollViewDelegate等上的定义…除非这不足以解决回到GitHub上您的图书馆的问题页面并搜索已定义的关键字您的情况简要。 仍然找不到解决问题的方法吗? 然后,现在您可以打开一个新期刊。 请确保您的句子和代码清晰。 在本文中,我试图解释第三方库的使用和调试的基本逻辑。 在下一篇博客文章中,我计划编写一些非常有用的库,这些库可以简化您的工作。 如果您有任何建议,请随时说! 希望您喜欢本教程! 另外,我需要您的反馈!

ARKit Pods — FocusNode

这是一篇非常简短的文章,解释了如何实现我创建的名为FocusNode的Pod。 实际上,这实际上与Apple在其ARKit演示中使用的类和代码完全相同,我只是拆分了该类并将其打包,以便可以轻松地在我的ARKit项目中包含和使用它,并认为其他人可能也希望这样做。 此Pod的存储库位于: maxxfrazer / ARKit-FocusNode FocusSquare`类直接取自Apple的ARKit示例,并打包为任何人都可以轻松使用。 … github.com 假设您已经设置了ARKit项目,请创建一个包含pod ‘FocusNode’ 。 整个过程应类似于以下内容: 项目“ PROJECT.xcodeproj” 平台:ios,“ 12.0” 目标“项目” use_frameworks! 吊舱 “ FocusNode” 结束 跳到ViewController.swift文件(在终端中运行pod install后创建的工作区中)并import FocusNode 。 完成之后,您应该可以访问新类FocusSquare ,这将创建一个具有基本方形UI的对象。 将其附加到场景图的rootNode,并将FocusSquare的委托设置为sceneView。 它看起来应该像这样: 让 focusNode = FocusSquare() 覆盖 func viewDidLoad(){ … … 自我 .focusNode.viewDelegate = sceneView sceneView.scene.rootNode.addChildNode( 自我 .focusNode) } 为了使其正常工作,您需要设置配置以检测水平和垂直平面。 为此,您的配置创建将看起来像这样,然后在会话上运行。 让配置= ARWorldTrackingConfiguration() configuration.planeDetection = [。 […]

我的第一个Cocoapod在这里🎉—果冻1.0

是的,我的第一个Pod可供所有人使用。 Jelly 1.0 ,这是一个非常易于使用的Viewcontroller-Transition-Animation框架。 无需创建自己的Presentation-Controllers或Animator-Object即可实现精美而丰富的转换。 果冻将为您完成繁重的工作。 我一直想拥有一个公共的Github存储库,其他人可以为它做贡献,我发现自己一遍又一遍地编写自定义的Viewcontroller-Transition-Code 。 因此,为此创建一个易于使用的Pod并不是一个好主意吗? 这是关于我如何创建Jelly 1.0的故事,包括我遇到的所有问题以及找到的解决方案和工具。 塞巴斯蒂安·博尔特/果冻 Jelly仅需几行代码即可在iOS中提供自定义视图控制器转换 💪github.com 脚手架🛠 直到我开始构建Jelly 1.0为止 我与其他人创建的Pod一起工作了很多,但我从来没有一个人建造过。 因此,我开始仔细研究如何生成一个。 使用pod lib创建工作区create [NAME] 是我做的第一件事。 pod lib创建果冻 该命令创建了我入门所需的一切。 我只需要回答一些有关我使用哪种语言,想要包括哪些测试框架的问题。 您要使用哪种语言? [Swift / ObjC] >斯威夫特 您想在您的媒体库中包含一个演示应用程序吗? [是/否] >是的 您将使用哪些测试框架? [快速/无] >快速 您想进行基于视图的测试吗? [是/否] >否 在CocoaPods为我创建了一个脚手架之后,我立即打开了工作区文件并进行了Xcode 用典型的Swift 3转换对话框提示我。 因此,出于某种原因,似乎Cocoapods模板尚未准备好Swift 3。 我自己转换了代码并尝试构建Project,但是如您所见,它不起作用。 出现错误❗️ 我知道这个 ! Xcode需要为每个目标设置SWIFT_VERSION 。 因此,我在Podfile中添加了安装后阶段,该阶段可以为我完成工作。 post_install做|安装程序| installer.pods_project.targets.each做| […]

Cocoapods —安装教程

Cocoapods是用于快速和对象C开发环境的强大而便捷的第三方库管理工具,在本主题中,如果您想了解有关cocoapods的更多信息,可以访问以下网站: https : //cocoapods.org 。 在本主题中,我将教您如何逐步安装Cocoapods,如果您有任何问题,可以给我发消息,我们可以一起讨论。 我的地址: imbearfly@gmail.com 步骤1:启动终端并安装ruby 2.2.2 逐行插入以下命令 curl -L https://get.rvm.io | bash -s稳定 源〜/ .rvm / scripts / rvm rvm -v rvm安装2.2.2 安装命令2.2.2之后,您将看到以下信息,系统要求您输入用户密码,插入操作系统密码,然后继续 ‘mkdir -p / etc / openssl’所需的密码: 步骤2:安装cocoapods并找到所需的软件包 cocoapods安装命令: 须藤宝石安装cocoapods 成功安装cocoapods之后,转到gococoapods网站以获取想要的程序包的“名称”( 您只需要包的名称 )>>> https://cocoapods.org 。 步骤3:将广告连播插入您的专案 在此步骤中,我将使用“ SDWWebImage”作为示例,首先找到您的项目的路径,然后将终端命令重定向到项目文件的文件夹,例如我的路径:“ Documents / PeterPanClass / class13thPrac” cd文件/ cd PeterPanClass / cd class13thPrac […]

iOS版Sweet&Swifty动画

“在计算机科学中, 数据结构是在计算机中组织数据以便有效利用的一种特殊方式。”-维基百科 这些数据结构和设计模式使您可以通过简单且普遍有用的解决方案来摆脱臭名昭著的反模式 。 输入SwiftyAnimate(插件🔌)。 制作动画的更好方法…… 您是否尝试过将多个动画串在一起? 是的,你当然有。 您将每个后续动画包装在上一个动画的完成处理程序中,并迅速结束编写其他功能的工作,以打破厄运金字塔(或死亡虫洞?)。 无论您最终得到什么,都不是您真正想要的。 也许像这样……? 输入要救援的队列! 它们为您提供O(1)入队和出队的时间复杂度,而您在Swift中使用标准Array类型无法获得(阵列对append和popLast操作具有O(1)的平均时间复杂度,其中popFirst是O(n)操作)。 (现实生活中的例子)

自动生成Swift网络模型– JustBinary

自动生成Swift网络模型 永远不要再编写网络模型。 无论您是移动开发的新手还是经验丰富的移动开发人员,您都很可能会遇到将API集成到移动应用程序中的情况。 将JSON转换为可用模型的艺术可能是乏味的,也是一项令人讨厌的工作。 出于本文的目的,我们将使用下面的Library JSON响应来生成我们的Swift网络模型。 下一步 ModelSynchro目前正在积极开发中,仍然可以添加一些很酷的功能。 我一如既往地重视反馈,并鼓励对改进此广告连播的任何想法。

在Swift中创建一个私有iOS框架并使用CocoaPods分发它

框架是代码和资源的集合,用于封装在多个项目中有价值的功能。 一个swift框架包括一个Swift模块文件和一个共享库,其中Swift文件文件传达了框架API的源级别信息,共享库提供了在运行时加载的已编译实现。 有多种发布iOS框架的方法。 可以通过将其推送到任何git仓库管理器(例如github,gitlab等)来分发它。 在这里,您可以将整个框架项目推送到远程仓库,并使您的源代码可见,或者您可以在不共享源代码的情况下推送您的iOS框架。 在本文中,我们将学习如何快速创建一个私有框架,并在不共享其源代码的情况下使用CocoaPods分发它。 让我们从创建框架开始。 创建一个Swift框架 在这里,我们将创建一个HelloWorld框架,其中包含一个Logger类,该类又具有一个func类printHelloWorld ,该类将打印“ Hello World!”文本。 开启Xcode 从顶部菜单中选择Cocoa Touch Framework ,然后单击下一步。 将产品名称设置为HelloWorld并选择语言为Swift。 单击下一步并创建。 如果在项目中展开HelloWorld文件夹,则会找到两个文件: Info.plist和HelloWorld.h-后者是用于在框架和主机应用程序之间进行通信的头文件。 单击文件 → 新建 → 文件 选择“ 可可接触类” ,然后单击“ 下一步”。 将类名称设置为Logger并确保它是NSObject的子类。 单击下一步并创建。 现在Logger类将如下所示 类记录器:NSObject { } 用以下代码行替换Logger类。 @objc公共类记录器:NSObject { @objc公共类func printHelloWorld(){ 打印(“ Hello World!”) } } Logger是一个公共类,其中包含printHelloWorld函数,该函数打印“ Hello World!Hello World! ”文字。 添加了公共说明符,以便主机应用程序可以访问Logger类和printHelloWorld函数。 @objc→这告诉编译器可以从Objective-C访问这段Swift代码,如果主机应用程序是用Objective-C编写的,则很有用。 生成通用框架 要制作可在设备和模拟器上使用的通用框架,您可以配置一个归档后脚本,该脚本将在存档后为iOS模拟器构建框架,并将模拟器和iOS二进制文件合并为一个胖通用框架。 […]

从Pod导入Objective C标头? 十分简单!

我是一名新的iOS程序员。 我距Swift已有3年了,所以我在iOS编程中的第一门语言是Swift。 尽管那里有很多库可以帮助我开发应用程序,但它不像Swift库那么简单,Swift库仅在“ pod安装”完成后无缝地导入其模块。 为了更清晰,在这里我谈论的是如何从通过Cocoapods注入的库中导入Objective C标头。 轻松将库手动注入到Swift项目中。 您可以将其文件从外部文件夹拖放到您的项目中,Xcode将为您提供为您生成Objective C桥接标头的选项。 或者,您可以创建一个新的Objective C头文件“ .h”,并将其命名为: -Bridging-Header.h 在我们开始之前,我想使它成为一个简单的教程,而不仅仅是有经验的程序员记住某些东西的方式。 这意味着,虽然实现起来很短,但是one line code ,但是我想分享一下我如何通过反复试验来理解这一点。 因此,像往常一样,让我们​​创建一个新的Xcode项目。 随意命名,忽略核心数据,UI测试和单元测试。 就像您每天一样,如果您每天制作一个新应用程序。 然后,我需要您至少知道如何使用Cocoapod。 如果您不知道Cocoapod是什么,那么花一点时间来了解iOS开发者社区为我们提供的如此出色的工具。 您将要访问其官方网站,该网站还提供了我们找到所需图书馆的方式。 前往http://cocoapods.org 新,我想您已经掌握了Cocoapod。 然后,我们将使我们的项目使用将从Cocoapod获取的外部库。 转到项目根文件夹,如果您不知道什么是根文件夹,则只需转到包含我们的。xcodeproj文件的文件夹。 在终端上运行pod init 。 Podfile Pod完成后,让我们打开Podfile声明要导入的Pod库。 让我们找到一个仅用Objective C编写的好的库。我的意思是,这个库在Swift中还没有或者没有。 我们有MagicalRecord,它将帮助我们管理CoreData的使用。 通过将pod ‘MagicalRecord’,’~> 2.3’放在…行的#Pods下pod ‘MagicalRecord’,’~> 2.3’将MagicalRecord声明为Podfile。 保存Podfile,然后在终端上运行pod install 。 我们将获得由pod发送的一堆日志,以告知我们项目中的当前操作。 等到完成。 现在,我们在根文件夹中具有。xcworkspace和.xcodeproj。 如果我们使用Cocoapod作为第三个库管理器,则每次处理项目时都希望使用.xcworkspace。 如果您想替代Cocoapod,我们可以选择Carthage和Swift Package Manager。 打开.xcworkspace。 我们的项目保持不变,只不过我们在Xcode导航器窗格中注册了两个项目。 一个是我们自己的项目,第二个是Pod项目。 这就是为什么我们需要使用xcworkspace来始终加载Pod项目的原因。 […]