Tag: cocoapods

为什么我喜欢SnapKit,您也可以

刚开始编码时,我100%参与StoryBoard团队。 很容易看到不同的UIView是如何交互的,您可以将它们精确地放置在所需的位置。 这适用于单个屏幕尺寸,但是随着视图变得越来越复杂并且需要适应各种屏幕尺寸,约束的层次结构变得越来越难以确定。 尽管如此,程序化还是令人恐惧! Swift的内置方法是噩梦。 即使我现在已经全心全意地通过程序设计应用程序,但仅查看这些方法仍然会让我感到恐惧。 幸运的是,令许多程序员感到宽慰的是,SnapKit幸运的灵魂为iOS和OS X设计了一个完全用Swift编写的疯狂简单的自动布局DSL! 首先,只需在pod文件中使用pod ‘SnapKit’安装SnapKit CocoaPod,然后打开项目的.xcworkspace。 以编程方式设计应用程序需要一些设置。 首先转到您应用的“常规设置”,然后在“部署信息”的“主界面”下,删除“ Main所在的位置。 这告诉您的应用不再担心故事板! 尽管如此,应用程序仍需要一个切入点……这就是AppDelegate发挥作用的地方。 在这里,您要声明第一个ViewController的实例。 (如果您使用的是UINavigationController,UITabBarController或ContainerViewController,则也可以在其中进行设置,但现在我们将使用单个ViewController)。 在AppDelegate的func application(… didFinishLaunchingWithOptions…)方法中,将window初始化为具有与UIScreen绑定的框架相同的框架的UIWindow() ,然后初始化主ViewController。 接下来将window?.rootViewController设置为与您新创建的ViewController相等,并使该window可见! 五行代码,您的应用程序将打开您指定的ViewController。 现在,让我们来看看有趣的东西吧! 当然,第一步是导入SnapKit。 (如果它声称不存在这样的模块,请给它旧的Command + B;还要检查您是否在xcworkspace中工作,而不仅仅是xcodeproj)。 通常,我制作的第一个UIView会占据整个屏幕,因此让我们创建一个mainView: UIView!实例mainView: UIView! ,对其进行初始化,然后将其添加到ViewController的view将其设置为等于屏幕的大小。 在mainView.snp.makeContraints方法中,每次您写入$0它只是简单地引用受约束的-view本身! 将边缘设置为equalToSuperview将允许此View扩展到其superView(UIScreen的view )所允许的最大范围。 这是一个简单的介绍,但让我们看看snp.makeConstraints还有哪些其他选项。 现在我们有了背景视图,让我们在可能要显示一些常规信息的地方添加标题。 此新视图将添加到mainView顶部,并将与Screen / SuperView的高度成比例: 请注意,如果属性有所不同,如何将不同的约束链接在一起,并添加新行。 这使得代码非常容易键入和阅读! 在这一点上,我们有一个mainView,大小为UIScreen的青色,还有一个headerView的彩色迷离,它覆盖了屏幕的前25%。 让我们添加一个Label并将其直接放置在headerView : 使用UILabels,您不必将它们设置为特定的高度或宽度。 取决于您选择的文字和字体/大小。 这样,您只需给它一个X / Y轴位置,Xcode就会假定其余的位置。 最终结果应显示3/4青色和1/4蓝色屏幕,其中标签直接位于蓝色部分的中心。 SnapKit中提供了许多其他方法,其中大多数是完全不言自明的。 例如,如果我们希望mainLabel位于屏幕中央,但在蓝色headerView ,则可以删除centerY约束并添加新行,指示$0.top.equalTo(mainHeader.snp.bottom).offset(10) […]

使用CocoaPods和Carthage分发封闭源框架

每个开发人员都会不时地努力工作。 为了实现我们想要的功能,我们从博客,书籍,Github页面(源代码,要点,问题–顺便阅读Github问题可能会非常有帮助)中进行阅读,堆栈溢出线程等。我们从上述所有来源中收集很少的信息并收集它们寻找解决方案。 对于我们大多数人来说,在解决了我们的问题之后,我们就解决了。 但是,如果我们忘记了,或者我们不准备再做一次该怎么办? 写下我们在此过程中遇到的挑战是一个好习惯,但是我们当中有多少人呢? 大多数时候,我们选择we懒的方式。 我会记住它,或者会再次找到相关的东西。 这次,我将改变态度,并写出在与CocoaPods和Carthage一起作为封闭源项目分发我们的框架时遇到的挑战。 我希望这篇文章可以帮助某人节省时间并保持神经😄 让我们从列出我们正在做的事情开始: 我们正在构建一个简单的框架(本例中为付款结帐服务)。 现在,我们自己完成所有工作,这意味着我们的框架没有内部依赖性。 (好吧,如果您嵌套了依赖项,那么本文将不再涉及它们,因此,您将学到更多内容,但是请相信我,它们并不难。) 框架使用Objective-C编写,以支持两种语言。 尽管我们是Swift的粉丝,但出于某些考虑,我们还是选择了Obj-C。 (如果您拥有Swift框架,则可以像本文中一样应用所有内容,因此不用担心👊🏻) 我们希望将代码作为封闭源分发。 因此,我们将分发通用二进制文件(.framework文件)。 通用意味着该宝贝将在物理设备和模拟器的所有体系结构上工作。 我们正在使用Github作为我们框架的宿主。 我听说在进行聊天之前已经足够了,在我们开始之前,我假设您都已经在Mac上安装了CocoaPods和Carthage并熟悉它们和一些终端命令(实际上,我确定,因为您要分发您的框架以及一些依赖项管理器😄)。 迦太基 https://github.com/Carthage/Carthage/pull/1760,直到出现该拉取请求,您才能将框架发布为封闭源。 它相对较新,因为它已于今年2月14日❤️推送回购。 (编码code真是糟糕的一天) 迦太基手册将这一过程命名为将预先构建的框架归档到一个zip文件中 ,该文件缺少有关如何读取日志的信息,等等。我们现在将进行遍历。 如果Carthage附加到项目存储库上的GitHub Release或通过二进制项目定义文件,它们可以自动使用预构建的框架,而不是从头开始构建。 要为特定标签提供预构建的框架,应将所有受支持平台的二进制文件一起压缩到一个存档中,并且该存档应附加到与该标签相对应的已发布发行版中。 附件名称中应包含.framework (例如ReactiveCocoa.framework.zip ),以向Carthage指示其包含二进制文件。 您可以使用carthage archive命令执行上述归档操作,如下所示: 迦太基建造-无漏电流 迦太基档案YourFrameworkName 开始之前,请在Xcode上打开框架项目,然后通过Command + Option + Shift + K干净地构建项目。 (清洁文件夹会在大多数情况下将您从恶魔中拯救出来) 打开一个终端并导航到您的项目文件夹。 carthage build –no-skip-current到终端。 (首先,我将显示失败的构建和处理方法。然后,我们将继续)

为什么Cocoapods吃应用程序图标

大型应用程序需要团队合作,因此将其分为不同的组件。 在这种情况下,每个团队都将其中一个作为单个回购协议,并使用Cocoapods将它们链接并绑定在一起。 一切正常,直到我们点击主页按钮并发现我们的应用程序图标丢失。 让我们退后一步,看看我们如何处理每个组件的图像资产。 通常,我们将图像文件放在.xcassets文件夹中,以避免与其他模块中的图像重复或名称冲突。 .xcassets那些图像将添加到捆绑中,如下所示: 这样,可以正确加载每个图像,并且我们的UI看起来不错。 那为什么我们会错过App图标呢? 原因是在“ 复制捆绑资源”构建步骤中,Xcode对.xcassets使用–app-icon参数,这意味着我们在此步骤中具有应用程序图标。 下一步“ [CP] Copy Pods Resources ”时,缺少此参数,因此将删除应用程序图标。 此配置将覆盖最终的Assets.car并导致应用图标丢失。 解决该问题的方法是在Pods-your_project_name-resources.sh中添加–app-icon参数,以确保它可以在“ [CP]复制Pods资源 ”步骤中工作。 积分属于Tima Khomutnikov。 另一种解决方案是将所有图像文件而不是.xcassets目录放入捆绑包。 它肯定会工作,但不是上一个的最佳选择。 有关更多详细信息,您可以在此处参考Cocoapods问题。

Como publicar seu框架iOS否CocoaPods

Hoje em dia temosinúmerosprojetos de colaboradores que escolheram contribuir de alguma forma com a common de la e e por quenãofazer parte delatambém? 😎 Muitas审查了projetos的Podemos贡献目录,Criando novas功能,Corrigindo Bug,Ciando umadocumentação或qualqueraçãoque possa tornar o projeto maisescalávele intuitivo。 Aldem desse tipo decontribuiçãopodemos compartilhar algum框架de nossa autoria quetambémpossa facailitar a vida dealguém。 不存在违法违规行为,不存在违法违规行为,违背法律责任,不履行法律责任。 💪🏻😅 阿尔及利亚外结构性研究组织的特色,证明形式的证明,阿尔及利亚综合性香料的性状(perfumaria迹事),模数化简单的事例。 Épod emos ajudar algum amiguinho […]

在没有CocoaPods的情况下将React Native添加到现有的iOS项目中

由于多种原因,您可能会发现自己想要将React Native添加到现有的iOS项目中而不使用CocoaPods。 CocoaPods是一种用于自动将第三方库添加到项目中的过程的工具,但是没有理由在情况需要时不能手动执行此操作。 注意,这假设您已在本地存储库内的node_modules文件夹中将 React Native下载为依赖项。 有关如何将React Native作为依赖项添加到项目的示例,无非是使用react-native init或UIExplorer项目创建的任何项目(包括在react-native Github存储库的Examples目录中)。 将React Native的子项目添加到您自己的项目中 默认情况下,新创建的React Native项目包括以下子项目。 我建议您在项目中创建一个组,以在Xcode中将这些子项目添加到其中,右键单击它,然后选择“将文件添加到YOUR_PROJECT_NAME ”。 然后,您可以添加React项目本身(位于node_modules / react-native / React中)和所有其他React Native子项目(位于node_modules / react-native / libraries中)。 将二进制文件与库链接 为了编译我们的项目,我们必须将我们的项目目标与第三方的React Native库链接; 在这种情况下,我们的项目目标是“ UIExplorer”。 注意,如果您正在使用位于任何React Native子项目中的类的任何目标,则必须将受关注的库与所讨论的目标链接。 导航到Build-phases-> Link Binary With Libraries添加以下库。 注意,在这种情况下,库是静态链接的。 “其他链接器标志” 如果您尚未设置以下链接器标志,则有必要添加它们以在项目中编译React-Native。 标头搜索路径 如果您使用的React Native版本低于0.40,则有必要向项目添加一些其他标题搜索路径 。 从0.40开始,由于在React Native项目中添加了“ copy headers”阶段,因此没有必要。 这些标头可以包含在系统包含(’s)中,因为标头本身将与其他系统标头一起位于特定目录中。 在您使用的React-Native版本低于0.40的实例中,您需要在项目的标题搜索路径中添加以下内容; 这告诉编译器可以在哪里找到React Native头文件。 注意,添加的路径应相对于node_modules目录。 希望信息对您有所帮助。 […]

在BuddyBuild中处理更新的pod

我们正在使用BuddyBuild作为CI。 运行得很好。 今天,我遇到了有关更新的广告连播的问题,这是我们如何解决问题的记录。 在我们的一个应用程序中,我们使用了自己的本地条形码扫描仪。 它使用子视图控制器模式进行了一次甜蜜的更新,该模式允许轻松进行自定义和实例配置。 版本4.1.1已发布到CocoaPods 因此,我使用pod update BarcodeScanner更新了pod,更新了代码以使用新的委托方法和配置。 一切都很好。 让我们提交并发出Pull请求。 BuddyBuild踢的构建,它失败。 日志说明了Podfile和Podfile.lock之间的冲突 尝试脚本 所以我想我可以运行一些自定义脚本来强制BuddyBuild更新Pod。 查看有关自定义脚本的文档,克隆后脚本听起来像是编写脚本的好地方 Buddybuild自动分析您的存储库,并自动以最佳构建设置对其进行配置。 但是,如果在构建过程中需要自定义逻辑,则可以在存储库中包含自定义脚本,以在构建过程中的四个点运行 克隆后脚本在git clone之后立即运行,然后buddybuild对存储库中的内容进行任何分析。 让我们创建一个文件buddybuild_postclone.sh 没用 让我们重置本地规格存储库 也没用。 然后,我仔细查看了日志 将CocoaPods版本切换到1.1.1 看来BuddyBuild正在使用cocoapods 1.1.1 。 我的是version 1.4.0 。 指定CocoaPods版本 所以我需要指定正确的CocoaPods版本,以确保我和BuddyBuild在同一页面上 在我的Gemfile 然后运行bundler install并检查Gemfile.lock以查看CocoaPods的版本为1.4.0。 新希望 提交更改后,BuddyBuild选择了正确的CocoaPods版本,现在可以正确使用新的Pod。

CocoaPods的本地开发

CocoaPods使您的应用程序模块化和集成外部库或框架变得非常容易。 但是,对于更特定的应用程序,该工具会很快达到其极限。 问题如下:我的库是通过我的回购的master分支克隆的。 要测试更改,必须将它们合并到master分支中,并提供一个version标记。 解决方案:本地podfile,该文件不吸引版本,但直接从目录获取源。 创建本地Podfile 首先,您必须创建一个名为“ Podfile.local”的新文件。 现在,您可以在此处覆盖依赖关系。 内部Pod的定义应在Podfile中覆盖。 我们可以通过简单添加以下红宝石线来做到这一点: 修改后的podfile现在应该看起来像这样: 忽略本地文件 在.gitignore中包含本地文件很重要。 否则可能会意外检查文件。 如果应用是通过Jenkins和/或Fastlane构建的,则本地文件也会被吸引,而不是master分支的文件。 我总是在.gitignore上有Podfile.lock和Podfile.local 。

我在React-Native和iOS之间集成的经验

好吧,这是我第一次使用React Native,但不仅是第一次与本地iOS应用程序集成。 项目配置 通常,我从Facebook官方文档开始: 与现有应用程序集成·React Native 从头开始新的移动应用程序时,React Native很棒。 但是,它对于添加… facebook.github.io 也很好。 必备的先决条件是已安装npm ,即JavaScript的软件包管理器。 一切都非常简单: https://nodejs.org/en/download/ 最后我执行: $ npm -v 我看到我已经安装了版本5.6.0 除此之外,建议安装: CocoaPods ,用于Objective-C,Swift和在Objective-C运行时上运行的任何其他语言的依赖项管理器。 为了便于安装,我使用Homebrew (macOS缺少的软件包管理器)进行安装: $ brew安装cocoapods 好的,您可以开始设置项目了。 在iOS项目中,我创建了一个“ js ”文件夹,其中包含React-Native项目。 首先,在此文件夹中,创建具有以下结构的文件“ package.json ”。 请注意,我的应用程序称为“ StoryReact” 该应用无法生成,“ Yoga-internal.h”文件似乎存在错误。 经过一些在线研究之后,我决定在GitHub上创建一个问题,但是我得到了负面的反馈,我将不得不手动更改框架的代码。 但是我不喜欢它作为解决方案,因此我尝试切换到另一个版本 。 然后我删除: “豆荚” “ Podfile.lock” “ js / node_modules” 在阅读到从0.54到最新版本的版本都给出了相同的问题之后,我回到终端并安装了React-Native的版本0.51.0 。 因此,我将执行与之前相同的命令,以使用pod在项目上安装react-native和依赖项,相反,包括对Podfile的更改: $ yarn add […]

Jenkins + iOS构建

不久前,我需要为iOS项目设置构建管道。 这是一个经典的故事,开发团队解散了,公司需要一些外部软件帮助。 长话短说,这成为我修补iOS构建自动化的借口。 编译良好且有文档证明的开源项目是一回事,编译没有文档且无人问津的iOS项目,至少让我非常兴奋。 该项目是为iPad设计的,我认为我需要一个实际的项目来开发。 事实证明,为Apple设备开发软件仅需要Apple计算机。 不需要手机或平板电脑。 一切都可以通过模拟器来完成。 下一个困难的部分是弄清构建配置和库依赖关系。 这是我第一次听到cocoapods,事实证明它很整洁。 就像NPM用于节点,pip用于python,Cocoapods用于快速/目标C项目。 我不能在这里分享代码,但是可以分享我学到的课程。 资质认证 对于新开发者来说,这可能是最令人困惑的事情,但是实际上,这并不太疯狂。 所有这些都是关于知道谁编写了代码以及谁在分发应用程序。 证书 -每个开发人员都应在developer.apple.com上获得一个帐户,并生成自己的开发证书。 这用于签名代码。 您稍后将使用您的用户名和密码来获取证书。 证书的私钥仅在证书创建期间可用。 那些.p12私钥需要导入Mac的钥匙串中才能对代码进行签名。 标识符 -只是某种Java类,例如命名约定ID即可识别应用程序。 设备 -允许将设备注册到公司帐户,并且配置文件可以指定允许安装该应用程序的设备。 供应配置文件 -证书+应用程序ID +设备的组合。 它用于对应用程序进行签名。 编译中 安装Xcode和CLI工具。 安装分发证书和该证书的私钥。 Fastlane是人们多年来构建的实用程序的组合,可帮助实现iOS项目构建的自动化。 Jenkins Side自动化 对于Jenkins服务器端,在Jenkins管理内创建一个slave node 。 您可以: 在Mac上创建SSH帐户,让skin进入ssh。 要么 使用webstart方法,从Mac上从Jenkins的master下载slave.jar并手动启动。 可以为slave.jar创建自动启动。 在工作中,使用jenkin的插件将文件从jenkin的文件系统复制到Mac从节点。 为了执行构建, #!/ bin / bash -l export LANG =“ zh_CN.UTF-8” #秘密文件本地存储在构建服务器上 […]

修复了“无法连接到GitHub以更新CocoaPods / Specs规范回购”错误

经过这个令人讨厌的错误的努力之后,发生了: Failed to connect to GitHub to update the CocoaPods/Specs specs repo – Please check if you are offline, or that GitHub is down ,我终于可以通过以下步骤解决此问题: 使用Homebrew在Mac上升级系统的红宝石 $ brew安装红宝石 2.用新的红宝石重新安装椰子 $ sudo gem install cocoapods [-v 1.2.0] 在本例中,使用1.2.0版来防止错误处理与’!ProtoCompiler’相关的错误 3.更新有关CocoaPods主回购的信息(可能没有必要) $荚设置 然后我们都完成了🙂 参考文献: 错误提示“无法连接到GitHub”,应打印完整错误·问题#7447·… 我已阅读并了解* CONTRIBUTING准则,并已尽最大努力遵循。 报告(注:此… github.com