Tag: 框架

使用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到终端。 (首先,我将显示失败的构建和处理方法。然后,我们将继续)

为什么我写家庭框架

在Apple平台上构建应用程序时,开箱即用的是模型视图控制器模式。 尽管多年来引起了很多争议,但这种体系结构本身并没有什么坏处。 主要的抱怨是可怕的“ Massive View Controller”,这些年来,它还获得了许多其他同义词,例如哥斯拉控制器,View ConTROLLer,我可以继续说下去。 我分享了很长时间的观点,在其他几个模式中寻找一个穿着闪亮盔甲的骑士。 但是,他们全都走同一条路。 与系统作斗争,直到我迷路了,发现自己回到了Apple为您提供的服务。 看起来一切希望都已荡然无存,Dave DeLong发表了自己的四部分文章系列“更好的MVC”。 更好的MVC,第1部分:问题 “修复”模型视图控制器系列文章的第1部分:修复封装问题修复大规模视图控制器… davedelong.com 使灯泡发光的是第3部分。 我是一个常见的误解的受害者,因为误解是视图控制器需要负责整个屏幕。 一旦我学会了这种“反模式”,生活就变得像一千个太阳的火焰一样明亮。 我开始以不同的方式考虑控制器,并且我接受了子视图控制器。 作为iOS开发人员的生活开始重新变得有意义。 在继续之前,我只想弄清楚本文的目的。 这与流量控制器模式无关。 使用该模式仅暴露了我认为需要修复的情况。 我不认为流量控制器模式是最终的答案。 这是构建模块化,可扩展且可测试的控制器的一种好方法,甚至是一种很好的模式,对于我和我的同事来说,这都是很好的选择。 如果您想更多地了解该模式,则不是本文。 我建议您阅读戴夫的文章。 他解释得比以往任何时候都好。 继续前进,在使用了子视图控制器一段时间之后,我开始看到我的时间花在了哪里,主要是在必须快速适应变化的时候。 更精确地说,构建流量控制器比将多个控制器粘合在一起要麻烦得多。 我想使用Apple提供的所有可用的UI元素来构成我的用户界面,但是当任何需要出队的问题出现时,我很快就感到失望。 必须有更好的方法。 一种不涉及链式约束并且适应变化的方法。 就像过去的爆炸一样,我想到了Spots框架的核心实现,即SpotsScrollView 。 在该类中,我们使用了基于OLEContainerScrollView的Ole Begemanns实现的布局算法。 该算法开放用于在滚动视图内部使用滚动视图,从而为用户创建一致的滚动体验。 我以Spots算法为基础,重新审视了代码,并逐渐对其进行了改进,直到它可以与您喜欢的任何UI元素按预期方式工作,而无需配置单个约束。 在为框架破解公共API时,我希望它尽可能精简。 我的目标是成为一个嵌入式解决方案,使设置子视图控制器变得像馅饼一样容易。 “公共API简洁明了,应该节省很多您想花在其他地方的时间……” 我想出了三种方法,一种用于添加常规子视图控制器,该子视图控制器处理内部调用所有适当的子视图控制器相关方法。 对于需要将控制器(或更确切地说,其视图)限制为特定高度的情况,我又添加了一个。 最后但并非最不重要的一点是,我添加了一个带有闭包的方法来选择与标准UIViewController的视图不同的视图。 这些是当今存在的公共API方法,以与添加视图时相同的线性垂直顺序排列视图,而子视图控制器由框架内部掩盖和处理。 如果视图在任何时间点都应更改,则算法将相应地对视图进行布局。 另外,我实现了对动画的支持,如果通过使用动画将视图的高度设置为零来删除视图,则框架将确定动画的持续时间,并在布置视图的新位置时采用动画。 这样,它尊重用户的意愿,而无需他们做任何额外的工作。 那么关于出队的事情呢,因为该实现植根于Spots框架,该算法已经考虑到了这一点,这意味着您可以自由地混合和匹配集合视图,表视图,堆栈视图,分段控件和常规UIView ‘ s。 Family框架仍处于起步阶段,但是我看到它的前途光明,因为它的责任很轻,公共API简洁明了,应该可以节省很多您想花在其他地方的时间,最好是与人类家庭在一起。 因此,事不宜迟,我给你一个家庭友好的儿童视图控制器框架:家庭。 希望您能像我一样喜欢它! […]

设置一个Xcode项目以开发可共享通用代码的Cocoa和Cocoa Touch框架,并为MacOS和iOS应用程序提供可重用和可重新分发的UI和非UI组件

缺少这样的教程,或者至少当我第一次尝试执行标题(尽可能长,但尽可能短)时,自己还没有找到。 我来到了来自C#编程的Apple开发生态系统,只是试图通过新的(很有希望的)macOS和iOS目标扩展我公司已经为Windows和Web开发提供的产品集(主要是组件库)。 由于我必须通过尝试和重试来学习所有内容,而且这并不容易(至少不应该像恕我直言,这本来应该如此简单),所以我认为写下已建立的步骤并没有什么害处(随后一些屏幕截图),也许他们也可以帮助其他人-谁知道? – 在将来。 因此,让我们开始吧。 一个项目,多个目标,没有显式工作区 我了解到的第一件事是(与.NET世界中Visual Studio解决方案通常将更多项目分组的情况不同),我不需要Xcode工作区来对多个项目进行分组。 仅仅是因为我不需要多个项目。 因为单个Xcode项目可以定义多个目标,所以每个目标都有其自己的类型和目标,并且每个目标都具有针对特定平台(例如macOS或iOS)构建的二进制文件。 (但是,顺便说一下,无论何时创建项目,无论如何都会为其创建内部工作区。) 在我的研究期间,我也没有发现对通用的跨平台层的真正技术需求(尽管我曾经习惯于在.NET中开发共享的跨平台类库。)仅仅是因为Xcode中的每个源代码文件项目可以是其一个或多个目标的一部分,而无需任何源代码重复,并且目标可以根据需要完全自定义。 因此,让我们在Xcode中创建我们的第一个项目。 我们可能会尝试从一个更具体的项目类型开始,但是我发现如果首先选择一个Empty模板(从“跨平台”选项卡下;为什么从那里选择)最简单,那是因为我们肯定会为多个平台)。 因为目标(和生成的产品)必须具有唯一的名称,所以我不得不将其中一个作为主要(我选择了macOS),将另一个作为iOS(辅助)。 对于后者的名字,我刚刚附加了“ Touch”来区分它(这个想法来自您可能已经猜到的苹果公司Cocoa和Cocoa Touch框架的名字。) 分组源代码文件 下一个挑战是找到一种在项目中考虑或不考虑其指定目标的好方法,将源代码文件分组。 我最终选择使用简单分组,并为每组源代码文件生成一个文件夹。 (Xcode确实支持不带文件夹的项目内分组,某种程度上类似于Visual Studio解决方案文件夹,但至少在我开始使用的版本9中,此功能存在一个丑陋的错误-拖动非文件夹分组的项目有时会崩溃。 ) 最终,考虑到它包含的源代码的功能区域,以及一个组包含的代码对于我的项目目标(macOS和iOS)是公共的还是特定于一个的,我决定进行多级分组。 请注意,默认情况下,为每个目标Xcode创建了一个组(和一个文件夹),我还希望将该分隔保留为我的主层次结构分组。 但是,这再次要求一个目标(我选择了macOS)成为主文件夹,并同时包含特定的和通用的源代码文件,而另一个目标(iOS目标)获得了仅保留特定源代码文件的辅助文件夹。 如果您想将其复制粘贴到您的Xcode中,这是实际的源代码: 不过,我在使用示例应用程序时发现的一个重要方面是,我们不应该尝试通过将它们移动到项目结构下的公共文件夹(在那里成为子文件夹)来对应用程序进行分组,因为它似乎有些Xcode应用程序设置不要在此过程中进行更新,并且会在构建时生成特定的警告。 但是,最终我能做的是解决这个问题,即创建一个不带名为“ Samples”的文件夹的组,然后将所有示例应用程序文件夹拖到该文件夹​​中,并将它们全部放在项目结构中的单个可折叠树节点下。 (重要的是文件路径保持不变。) 部署产品 对于每个目标,Xcode都会生成一个框架文件,其中包含为该目标构建的二进制文件和一些元数据,消费者可以使用这些元数据来访问您的组件。 您可以在项目结构中为您生成的Products文件夹中看到框架文件,并且可以通过Finder的上下文菜单在Finder中打开每个文件的位置。 然后,您可以从Finder复制框架文件并将其托管在任意位置,例如可以从Web服务器下载的文件,也可以通过您管理的任何分发渠道发布该文件。 发布配置 您可能已经看到输出框架是使用Debug配置构建的,并且您可能希望在实际部署它们之前切换到Release。 要改为选择发布配置,只需从Xcode的顶部菜单中单击目标组合框,然后单击“编辑方案”。 然后,对于“运行”选择,将“构建配置”从“调试”更改为“发行”,关闭对话框,然后重新构建目标。 体系结构:iOS模拟器不是ARM! 但是你不流行。 您最终会注意到,即使您使用Release配置构建了iOS框架(以Touch后缀命名),也无法在所有架构上正常运行。 例如,如果您使用真实设备(或具有ARM体系结构的通用设备)构建框架,则输出框架将不适用于以模拟器为目标(使用x86体系结构)的iOS应用。 反之亦然。 因此,您还需要定义一个聚合目标,以便能够运行脚本以将为不同体系结构构建的框架“合并”为一个聚合的“胖”对象。 为此,请在新目标对话框的“跨平台”选项卡中创建一个类型为Aggregate的新目标,为其命名,如“ FramisTouch-aggregate”,并为其添加一个新的运行脚本阶段(使用“ +”按钮目标的“构建阶段”部分),并定义一些命令来执行所需的操作: 然后,可以通过构建聚合目标(很重要:之后)轻松地执行上述命令:通过从目标中选择通用iOS设备和模拟器,您已经在Xcode中构建了设备和模拟器框架(即针对两种类型的体系结构)组合框,然后重复构建输出。 您当然想知道这些命令实际上会做什么: 创建一个新目录(例如“ Release-iphoneaggregated”)作为目标(在项目的构建目录中); 将基于设备的框架的结构复制到新目录中; […]

投资定制开发

随着INVASIVECODE推出SignaKit,我们想解释为什么您应该投资定制的代码。 SignaKit是一个高级iOS框架,可帮助您创建手写签名并将其添加到PDF文档中。 SignaKit是您需要付费的代码,并提供所需的支持,以确保它在将来的Apple更新中仍然有效。 开发应用程序时,您可以选择使用第三方代码和开源库,也可以创建自定义的构建代码。 使用开源代码看似简单,高效且具有成本效益,但是您可能需要考虑使用这些含义。 从长远来看,这实际上可能会花费您更多的金钱和时间。 随着每个Apple iOS过渡,更新iOS应用程序变得至关重要。 更新提供了机会,包括企业优化其应用程序的功能和美观性的机会,开发人员利用新技术和工具的机会以及吸引对利用最新平台感到兴奋的用户的机会。 很容易想到:我的应用程序现在运行流畅,因此可以轻松过渡到下一个iOS版本。 Apple提供了轻松转换代码的工具和平台。 可以重做图形,并且该应用程序看起来已经过完全重新设计。 但是大多数时候,您尚未编写的代码,一段代码或借来“修补”某种功能的库都会出现问题。 使用第三方代码和开放源代码库意味着相信其他开发人员的工作,并希望代码已经以完整性和标准编写。 但是,您应该考虑信任那些没有为编写的代码付费的开发人员,使他们免于承担全部责任:他们可能没有时间更新开源库,因为他们有一份付费的全职工作或他们的优先级可能已经改变。 或简单地说,他们可以编写或不编写质量代码,但是无论如何,您不能责怪他们,因为他们免费提供了代码! 当您的应用程序停止正常运行,或者在更糟的情况下,您的应用程序停止运行时,这将成为问题。 如果您没有与开发人员承担任何合同义务,则所使用的代码将由您自己承担。 为了理解开发过程,想象一下写一本书。 但是,编写本书时,不要自己写每个句子,而是想从其他作家那里借用每个句子。 此过程将节省您的时间。 从头开始写东西总是比从别人那里借书花费更多的时间和精力,并且基本上您要做的就是复制和重新配置。 但是,如果您必须在手稿上找到一个简单的错字,然后才能出版,那么您基本上是无助的,试图阅读和更正数千个未知的句子,最终无法出版您的书。 现在从应用程序开发以及更新iOS应用程序的实际情况来考虑这个问题。 在更新iOS应用时,Apple要求重新编译代码。 在重新编译过程中,Apple会检查应用程序是否存在错误,并确定它是否可以在新的OS版本上正常运行。 如果发现错误,则必须找到并修复。 如果您仍然希望进行更新(这对于保持相关性至关重要),则需要查找错误。 现在,发现错误似乎很简单。 作为编码员,错误是生活的一部分,发现并修复它们是我们的工作。 但是,如果该错误存在于由第三方编写的一段代码中,则开发人员将被迫花费大量时间和资源来浏览并修复其他人的工作,或者等待开发人员维护该代码修复它,可能会发生或可能不会发生,具体取决于开发人员的时间或关注点。 相反,购买SignaKit之类的定制代码将使您放心,当您可以请求快速,无缝地解决问题所需的支持时。 关键是,将代码片段放在一起看似更快,更容易启动,但要注意,随着技术的进步,您可能会遇到很多麻烦。 因此,内部编写本机iOS应用程序以及了解应用程序构成的重要性。 尽管第三方开源代码允许开发人员在短期内加快开发过程并节省资金,但其风险要比许多人希望的高得多。 产品的成功,无论是汽车应用还是移动应用,都取决于寿命。 如果一个小问题导致产品无用,那么就不可能说该产品具有任何实际价值。 尽管开放源代码的使用非常普遍,但是请考虑为在出现问题时提供支持的代码付费。 事实是,与包含第三方代码的应用程序相比,从头编写的iOS应用程序具有更大的价值,并且更易于维护。 有关SignaKit的更多信息,请访问iNVASIVECODE网站。 —伊娃·迪亚兹·桑塔纳(Eva Diaz-Santana) 她是InvasiveCode的共同创始人,从2008年开始开发iOS应用程序并教授iOS开发。她还曾在Apple担任Cocoa Architect和UX设计师。

Objective-C框架

像大多数编程语言一样,Objective-C是一种相对简单的语法,由大量标准库支持。 那里有一些不同的“标准库”,但是苹果公​​司的Cocoa和Cocoa Touch框架是迄今为止最受欢迎的。 它们分别定义了用于构建macOS和iOS应用程序的API。 稍微备份一下,框架就是资源的集合。 它将静态库及其头文件收集到单个结构中,Xcode可以轻松地将其合并到您的项目中。 下面的列表重点介绍了Cocoa和Cocoa Touch中的一些关键框架。 基础 Foundation框架定义了Objective-C类的基础层。 在本文中,您将找到核心的面向对象的数据类型,例如字符串,数组,字典等。 UIKit UIKit框架提供了构建和管理iOS应用所需的关键基础架构。 该框架实质上提供了数十个类,用于在iOS设备上创建和控制用户界面。 AppKit基本上是UIKit,但适用于OS X设备。 核心数据 核心数据为Foundation和Cocoa应用程序提供了对象图管理和持久性。 该框架提供了用于管理对象关系的便捷API,并允许您轻松地将数据库功能集成到应用程序中。 媒体播放器 Media Player框架是一个API,可提供播放电影,音乐和音频播客的功能,同时还允许您访问用户的iTunes库。 石英芯 Quartz Core框架允许您处理图像。 它分为两个子框架: CoreImage提供图像和视频处理功能(例如,滤镜)。 CoreAnimation框架使您可以对UI组件进行动画处理。 CoreGraphics 基于Quartz高级绘图引擎,CoreGraphics提供了低级2D绘图支持,并允许您自定义UI并具有惊人的效果。 我希望这是有用的! 如果您有任何疑问…,您可能应该将其绑定。 😊

如何在Windows上使用Xamarin绑定Fat iOS框架

使用Xamarin开发Android项目时,我没有遇到任何麻烦。 但是,使用Xamarin构建iOS应用程序时,这是完全不同的体验—更复杂。 在本文中,我将分享我使用Xamarin绑定DynamsoftBarcodeReader.framework的经验。 将iOS框架与Xamarin绑定 下载 DynamsoftBarcodeReader.framework是用于条形码检测的SDK。 用Linkwith.cs文件链接依赖项 在Visual Studio 2015中创建一个iOS绑定库项目: 将DynamsoftBarcodeReader.framework \ DynamsoftBarcodeReader重命名为DynamsoftBarcodeReader.framework \ DynamsoftBarcodeReader.a ,然后将静态库拖到项目中。 IDE将自动生成相应的DynamsoftBarcodeReader.linkwith.cs文件: DynamsoftBarcodeReader.framework依赖于libc ++。1.dylib 。 参考ObjCRuntime.LinkWithAttribute类, DynamsoftBarcodeReader.linkwith.cs编写如下: using System; using ObjCRuntime; [assembly: LinkWith (“DynamsoftBarcodeReader.a”, LinkTarget.ArmV7 | LinkTarget.Simulator, ForceLoad = true , LinkerFlags = “-lc++.1”)] 使用Objective Sharpie生成ApiDefinition.cs ApiDefinition.cs是定义API合同的地方,该文件描述了如何将基本的Objective-C API投影到C#中。 您可以为库手动定义所有API,也可以使用仅在macOS上运行的Objective Sharpie自动生成定义。 这是为DynamsoftBarcodeReader.framework生成ApiDeifinition.cs的命令: sharpie -tlm- do -not-submit bind -framework ~/Desktop/DynamsoftBarcodeReader.framework -sdk iphoneos10.2 […]

最佳SoftwareHut的iOS实践-SoftwareHut

尽管2017年Android应用程序的下载频率是iOS应用程序的两倍,但后者也受到广泛欢迎。 但是,Apple设备的普及率在增长,对iOS开发人员的需求也在增长。 如果您是或想成为其中的一员,那么本文适合您,因为我将向您展示最佳的iOS做法。 他们将帮助您开发更好的应用程序。 准备? 我将上述做法分为以下几节: 通用技术概念 代码质量 性能 构架 建筑 其他有用的提示和技巧 在本节中,我只为您提供三个词: SOLID —单职责原则,开放/封闭原则,Liskov替代原则,接口隔离原则,依赖反转原则 吻 —保持简单,愚蠢 干 -不要重复自己 首先,您应该遵循为Swift和Objective-C准备的代码样式指南。 这很重要,尤其是当只有几个程序员在开发同一应用程序时。 这就像成立一个音乐乐队一样-如果每个人都做自己的事,他们将不会成功,开发团队也是如此。 如果您可以在深夜重复这些指南中的建议,则可以继续进行下一步-自动执行构建。 使用Fastlane将每个项目配置为自动生成,然后将其上传到HockeyApp。 最后,在单个视图控制器中避免大量代码。 您可以使用VIPER或MVVM体系结构来完成此操作。 尽管iOS设备运行速度非常快,并且无论它们有多老,它们都可以正常运行,但是您的应用程序无法降低它们的速度。 您可以通过以下方法提高应用程序的性能和可维护性: 尝试避免使用外部UI库 尽早确定最低iOS版本-记住检查旧系统上新的iOS API是否得到正确处理 集成崩溃报告工具 使用这些框架可以使您的工作更轻松,更快和更好。 联网 AF网络 Alamofire 楷模 对象映射器 披风 依赖注入 弹射 台风 专卖店 钥匙串访问 领域 通过逻辑结构来开始您的项目。 它的结构应反映您存储库中的目录结构。 关于文件夹名称-它们应该为小写字母,并且空格应替换为“ _”。 使项目的层次结构反映您的体系结构,即: UI:包含对自定义UIView,UIViewController和容器的引用: 视图:自定义UIView,UITableViewCells等 View_controllers:UIViewControllers 应用程序:AppDelegate Supporting_files:info.plist和其他描述应用程序的文件 […]

使用Swift在iOS中构建通用框架

我已经搜索了很多可靠的资源,这将有助于我在iOS上构建自定义通用框架。 我尝试实现多种技术,但它们并没有帮助我完成任务。 寻求和阅读很多东西有助于我了解更多有关它的知识,最终我建立了一个通用框架。 我想分享我如何轻松构建此框架, 创建可可触摸框架: 打开Xcode, 文件→新建→项目 。 在iOS下,选择Framework&Library,然后选择Cocoa Touch Framework,然后单击“下一步”。 输入您的框架名称,然后单击“下一步” 。 然后选择您的项目位置并创建项目。 选择您的项目,选择目标→项目名称→选择构建设置选项卡。 在构建框架之前,始终将“启用位码”设置为“是” 。 在项目中构建所需的功能。 如果需要,您可以维护多个情节提要。 Framework项目看起来像一个普通的SPA项目,唯一的区别是您只能编译/构建Framework,而实际上不能在同一项目中运行它们。 如果项目仅在“ Simulator”中构建,则它将生成使框架专门在模拟器而非设备上运行的体系结构。 或者,如果项目是在“设备”中构建的,则它将生成使框架仅在设备上运行的体系结构。 因此,在“ Simulator”和“ Device”上都构建项目。 该框架将在“ 产品”文件夹中生成。 该框架将在项目的产品目录中生成,该产品目录具有两个单独的独特框架文件夹,这些文件夹将分别在Simulator和Device上运行。 设备框架:它包含仅为物理设备构建的体系结构。 模拟器框架:它包含仅为模拟器构建的体系结构。 从开发人员的角度来看,开发人员希望获得一个同时在模拟器和Device上运行的通用框架 。 大多数“流行”框架都是作为通用框架构建的,例如Mixpanel,Fabric等, 我写了一个“运行脚本”来生成通用框架。 选择项目目标→编辑模式→归档→后操作→按“ +”→“新建运行脚本操作” 。 UNIVERSAL_OUTPUTFOLDER = $ {BUILD_DIR} / $ {CONFIGURATION}-通用 #确保输出目录存在 mkdir -p“ $ {UNIVERSAL_OUTPUTFOLDER}” #接下来,计算出我们是否在SIM卡或DEVICE中 xcodebuild -target“ $ {PROJECT_NAME}”-配置$ […]

注意杯子

几周前,我去了Google。 Google在苏黎世设有出色的办公室,我认为让他们组织一次技术聚会对于从内部看到它们确实是一个很好的机会。 这是美好而有趣的一天,我很高兴在一个非常友好的环境中遇到好人。 一如往常,在访问大公司时,他们给了我们一些商品。 这次,我们得到了一个带贴纸的袋子,一些电话配件和……杯子! 上周五早上我在家,我想“现在是在新杯子里喝咖啡的好时机” 所以我在杯子里装了些牛奶,然后放入微波炉中。 两分钟后,我从微波炉中取出杯子,手烧了。 像我将手伸到撒但的烟囱上一样燃烧。 杯子的把手很热,太热了…… 那时,我注意到杯子实际上是金属的,并且由于其形状,其手柄形成了一个电磁拱。 这是一个天线,它接收了微波内部两分钟内的所有微波。 最后,牛奶很冷,可能比以前更冷,并且一天余下的时间我的手都非常疼痛。 我意识到……实际上这并不是我第一次遇到这种情况。 实际上,这是一个非常熟悉的场景。 大公司,不仅是Google,都会免费为您提供很多东西,不仅免费提供杯具,还为您提供框架和工具:React Native,Realm等… 它们都是免费的,一开始看起来很酷。 您可能会像我收到杯赛时一样快乐。 但是下次,请注意杯子… 杯子实际上是一个很棒的杯子,我现在用它来喝冷液体🍻。 问题实际上不是杯子,而是在检查它是否为金属之前使用它,因此它不是喝咖啡的好杯子。 框架和工具也可能发生同样的情况。 在适当的情况下使用React Native,Realm等……它们都是很好的工具,但同时如果不使用它们,则真的很痛苦。 结论 注意杯子 如有任何疑问,请随时在github,twitter或dcordero.me上关注我。

将您的iOS应用程序网络层重构为模块

在每个项目上,总是需要改变核心服务。 这可能是由于不同的原因,对我们使用的库所做的更改,第三方/ Apple库上不推荐使用的方法,或者我们只是想迁移以开始使用新的库或API。 这种“小”变化可能会影响我们的开发速度,可能需要大量时间才能完成和/或可能会引入错误。 我们会做什么 在本文上,我们会将所有与网络相关的文件重构为一个模块。 然后,将网络服务和所有相关类迁移到动态库中,最后将使用URLSession更改为Alamofire 。 你需要知道的 要继续阅读本文,您需要熟悉以下内容: Cocoapods(您可以在此处阅读有关Cocoapods的更多信息) URLSession (很高兴知道) Alamofire ( Alamofire知) 即使您不熟悉最后两个库,您仍然可以利用本文。 初始点 您可以从这里获得本课程的起点材料。 第一 打开.xworkspace (或.xproject ,此时不起作用)并运行( command + R )。 该应用程序非常简单; 它可以让您搜索艺术家并显示其所有专辑,仅此而已。 简单直接。 现在,我们已将应用程序设为初始状态,让我们开始向项目添加动态库。 单击项目导航器顶部的项目。 现在,在“目标”窗口中,单击左下方的加号(+)。 现在一直向下滚动,直到到达“框架和库”,选择“ Cocoa Touch Framework”,然后单击“下一步”。 现在输入名称(我叫我的NetworkService),然后单击“完成”。 创建框架后,您应该在“目标”窗口和“常规”选项卡的“链接的框架和库”上看到它。 第二 现在我们有了框架,让我们将与网络服务相关的所有类移到新创建的名为“网络服务”的文件夹中(或者您将其称为框架) 太好了,现在,如果您运行该应用程序,则会在视图控制器上注意到一些错误。 修复此错误非常简单,只需在视图控制器上import NetworkService 。 再次运行该应用程序,它应该可以正常运行。 太好了,我们只是模块化了我们的网络服务。 第三 现在,该项目正在使用URLSession处理所有网络调用。 随着项目的增加或时间的推移,由于Cocoa Touch API或第三方库的更改,很有可能需要重构,更改或改编代码。 现在,让我们重构网络管理员以使用Alamofire代替URLSession 。 我们需要做的第一件事是更新Podfile […]