Tag: 开源

PMAlertController:Apple的una mia(nuova)图书馆开源软件警报控制器

Spesso un sacco di progetti开放源代码的部分质量合格证书,不适用introdurre piccole soluzioni dirette的lodevoli inciziative,che semplicemente funzionano。 Negli anni passati durante la mia carriera da sviluppatore ho preso talmente tanto dal mondo开放源代码的所有dell an an dell’anno scorso ho deciso che a mia volta age venuto il momento di iniziare utilutilare il mio profilo Github per protribuire a progire aprogétiprog Mi sièaperto un […]

使用FunctionalTableData构建应用程序(第1部分)

Shopify构建的FunctionalTableData库采用另一种方法来解决先前的问题。 通过创建我们所有元素必须遵循的可重用的封装CellConfigType协议。 我们可以在UITableView和UICollectionView显示这些项目,而无需更改其中的任何一行代码。 使用CellConfigType 名为HostCell,的库提供了CellConfigType即用型实现HostCell,我们将在这些文章中使用它来降低学习难度。 当使用FunctionalTableData时, CellConfigType实例化实现是您唯一关心的问题,其余的工作将为您完成。 如果您感到好奇并想在内部进行窥视,欢迎您深入研究代码库。 HostCell由给定视图的UIView,状态和布局组成。 如果我们以应用预览(图1)为例, LabelCell的HostCell实现将类似于以下内容。 它可能看起来很多,但是一旦我们开始阅读代码,它就非常简单。 我们将State定义为表示视图的信息,在此示例中,UILabel可以具有文本,字体,以及是否为多行形式的State 。 图1的顶部单元很容易用此State表示。 我们可以利用LabelState初始化程序中的默认值,并创建一个LabelCell如下所示:

我2018年最好的第三方iOS库

在过去的几个月中,我接受了挑战,将我的理论ios技能付诸实践。 我们有一个仅在Android平台上存在的应用程序,我们需要创建一个iOS应用程序,以便迎合使用iOS设备的客户。 与往常一样,在构建应用程序时,使用由其他开发人员构建,尝试和测试的第三方库是有意义的。 Github是我发现iOS很棒的开源库的最佳去处。 不要重新发明轮子,只需重新调整轮子即可。 —安东尼·安格洛 因为我不想重新发明轮子,所以我决定使用一些第3方库。 与我决定自己编写其中一些库相比,这减少了我的开发时间,并可能节省了一些调试时间(是,几天days)。 以下是一些帮助我构建iOS应用程序的库: Alamofire 大多数移动应用程序都与后端服务进行通信,而我们的服务也不例外。 我发现Alamofire是一个易于使用的Swift网络库。 感觉就像是iOS开发生态系统的翻新。 我还能够快速将插件功能添加到库中,因为其他开发人员已经构建了与Alamofire交互的出色库。 一些示例包括:AlamofireLogger和AlamofireJsonToObjects。 图表 Android开发人员熟悉MPAndroidChart。 该库与iOS / tvOS / OS X平台的Swift等效。 使用此库可以轻松创建精美的图表/图形。 我还喜欢每种图表类型的示例项目都易于理解和定制。 Firebase库 Firebase附带了许多可用于构建应用程序的库。 我主要使用性能库,Crashlytics和Firebase消息传递。 性能库有助于跟踪网络通话和屏幕渲染的质量。 Crashlytics可帮助您确定应用中的问题(严重和非严重错误)。 它有一个漂亮的仪表板,显示了相关信息,可以帮助修复开发人员来解决问题。 Firebase Messaging用于处理我们应用中的推送通知。 IQKeyboardManager 来自Android世界。 我真的不认为我会为软件键盘而烦恼,所以我很惊讶iOS默认键盘上没有简单的手势。 这样的图书馆让我很高兴。 使用IQKeyboardManger,我不必编写代码就可以在完成TextField编辑后关闭键盘,也不必编写代码以移至表单中的下一个字段,也不必编写其他代码来确保虚拟键盘不会显示时覆盖一个字段。 最好的部分是,我不必为此输入太多代码。 我刚刚添加了库和一行代码,所有这些开始工作。 SwiftValidator 只要您的应用程序中有像TextField这样的开放式字段,输入验证就很重要。 我使用SwiftValidator是因为它易于设置和使用。 当我开始使用该库时,有20条预定义的规则。 规则用于确保只有遵循验证规则,才能将TextField中的文本视为有效。 可可豆 不,这不是图书馆。 它是Swift的依赖项管理器。 我也必须潜入,因为它也很重要😉。 这就像Android世界的gradle 。 它帮助我简化了添加这些第三方库的过程。 如果不使用此依赖项管理器,则需要将依赖项(框架)作为嵌入式二进制文件添加到我的项目中,与使用CocoaPods相比,这不是一个简单的过程。 感谢您的阅读,并请让我了解其他可以简化iOS开发的开源库。 干杯👋🏻。

开发人员聊天:Andyy Hope

自我介绍! 你是谁? 你在哪里工作? 嘿,我叫Andyy Hope,我是一位澳大利亚iOS工程师,即将在Facebook工作。 我还是墨尔本Playgrounds Conference的组织者,也是新创建的慈善计划Wu-Tang Clang的创始人。 在业余时间,我喜欢写一个技术博客,在其中我想提供一些使用Swift语言和Apple框架的技巧,并且有时我会在聚会或会议上进行演讲。 是谁或什么让您参与编程的? 在90年代后期,我被介绍给互联网,从那时起我就非常着迷。 不久之后,我遇到了AngelFire虚拟主机,它为想要创建自己的个人网站的人们提供免费服务,他们为像我这样的初学者提供了不错的模板,我利用了这些模板。 有一天,我偶然发现了一项功能,该功能使我可以编辑网页的HTML,我记得当初看到该代码时,绝对感到震惊。 自然地,我对其进行了调整并破坏了很多东西,但是它使我想学习HTML,因此我遇到了一个网站HTMLGoodies.com,该网站每天都成为我的首选,很快我就学到了一些用于编辑网页的基本HTML 。 我想从那时起我所做的一切都源于那段时间。 高中时,我一直与编程网站保持联系,制作Pokemon和Dragonball Z粉丝页面。 但是到了20年代末/ 20年代初,我就退出了编程领域,开始从事酒店业。 我花了好几年的时间才意识到这不是我想要追求的东西,最终我回到了专注于技术和编程的领域。 举办Playgrounds Conference对您的职业有何影响? 我会说它做了很多。 我记得在2015年12月的墨尔本CocoaHeads聚会上。 当时没有人认识我,我想通过与当地社区的更多参与来改变这种状况。 他们正在为房间里的人们做介绍,我举起手来做自我介绍,我向每个人提到我想成为社区中更大的一部分,但是我不知道我会继续为他们一年后。 游乐场帮助我结识了很多新朋友,结识了许多新朋友,在我们的行业中,拥有一个庞大的网络对于大多数人来说通常是一件好事。 我的许多发言人来自旧金山的公司,所以当我问他们是否可以推荐我接受采访时,他们很乐意为我提供帮助。 六个月后,我在Facebook找到了工作。 同样,在Medium上撰写大量精彩内容对您的职业有何帮助? 在Medium上写博客是一种自我学习以及向他人教授的好方法。 我发现我在写作时发现读者几乎一无所知。 做出这个假设迫使我对这个概念产生了深刻的理解,因此我可以用更简单的术语将其传达给其他人。 我写的越多,我学到的就越多。 “如果您不能简单地解释某些内容,那么您将无法充分理解它” –艾伯特·爱因斯坦 让人们给我发送评论或推文,感谢我写一篇文章,这也是一种很棒的感觉。 很高兴看到我所做的工作可以帮助他人,这确实是帮助我撰写更多内容的驱动因素。 我想这与您对博客帖子的处理类似,对吗? “如果您要教别人做比萨,请假设他们不知道奶酪是什么。”-我 我看到您最近一直在申请新工作,包括一些有关算法和CS的研究。 您为什么认为这项研究很重要? 有帮助吗? 绝对是 我不建议任何人至少在不掌握其计算机科学(CS)知识的情况下申请在美国的职位。 在美国,面试是一个漫长而艰巨的过程,应试者将在从通用CS知识到实际领域经验的所有方面对候选人进行测试。 我最近决定,我想搬到旧金山(SF),这样我就可以接近行动了,而且我不想冒险失败,而不必再等待6或12个月才能重新申请。 所以我离开了工作,回到家乡珀斯,连续学习了六个星期。 每天我都会做多个白板,在YouTube上观看众多算法视频,并且对我的CS知识有很多了解。 许多现场访谈的时间从4到6个小时不等,几乎所有您学到的知识都对您构成了质疑。 我认为,最好绝对做好准备,并全力以赴,这样您就不必冒着日后重复该过程的风险,有可能您在重新申请时会忘记很多东西,并且不得不花了几个星期再次增加。 到目前为止,您在软件行业中最难学的一课是什么? 毫无疑问,成为团队领导。 在我的整个职业生涯中,我一直都是独立开发者或与其他人一起工作。 […]

苹果拒绝了我的应用程序,因此我决定将其开源

在 此处 阅读原始文章 。 今年早些时候,我有一个项目,每月创建一个新应用程序,尝试从中获利或将其作为副项目/业务来运行。 我以解决我遇到的问题的想法开始。 我想要一种非常简单的方法来仅使用表情符号创建购物清单。 只是, 只允许使用表情符号 。 检查存储库! 我玩得很开心,从头开始探索iOS的新项目架构,并尝试了一些不错的开源库,例如Realm和Spring。 我什至计算出我花在创建它上的时间,这样我就可以计算出我在工作时间上投入了多少,因此我可以得出一个基准,即通过出售它我可以获得多少回报。 拒绝 一切都很好,我很高兴发布它,生成了所需的屏幕截图,并将二进制文件发送给Apple进行了审查。 令我惊讶的是,该应用因为使用了Emojis而被拒绝了: 首先,令我惊讶的是他们正在执行这样的政策,对我而言这是没有意义的:他们已经在商店中收取了很大一部分销售额(占30%),我希望至少可以免费使用至少他们在整个平台上都流行的表情符号。 开源项目 但是除了观点,我将不得不绘制许多图标来获得重新提交它的机会,而且我认为我的时间最好投入到其他方面(例如学习Node.js和React.js)。 因此,我决定将该项目开源,以获得社区的反馈,并可能从中创建其他东西。 对于初级开发人员来说,尝试了解如何从头开始构建应用程序可能是一个不错的入门者。 不幸的是,由于版权,我不得不删除我使用的图像。 但是除此之外,其余的都是在Apache 2.0许可下分发的。 可以通过签出GitHub上的存储库来尽情享受,并告诉我!

实用标记—服务器端Swift研讨会

这通常会提高自动化,代码生成和工具支持的水平。 它还会生成更稳定的代码。 开源社区 开源社区一直在努力使用Swift for Server构建库。 在撰写本文时,顶级服务器端Swift框架(在GitHub上按星标列出)是: 完美 (12271⭐) 蒸气 (11406⭐) Kitura ( 6019⭐ ) 泽沃 ( 1718⭐ ) Ryan Collins的这篇有用的文章测试了所有这些Framework的性能,并将它们与Node.js进行了比较。 他的结论是,所有这些框架的性能都非常好,并且在每次测试中,Node.js都被其中至少两个击败。 这意味着swift在发球方面表现非常出色。 汽 尽管每个框架都有其独特之处,但研讨会的主题是由纽约市的美国软件工程师Tanner Nelson(@ tanner0101)创建的Vapor 。 在2016年9月正式发布Vapor 1.0之后,团队一直在努力工作,当前可用的版本是Vapor 2.2.2。 他们已经在研究Vapor 3。 为什么要蒸气 ? 蒸气有许多优点: 巨大而活跃的社区 非常简单的语法 纯粹用Swift编写 易读易懂的API,不依赖第三方库 成为Swift可以使他们专注于保持API的简单性,可读性,并使其命名和其他约定与该语言保持一致。 唯一的缺点是:他们牺牲了一点速度和性能,以求成为纯Swift。 链接 https://github.com/vapor/vapor https://docs.vapor.codes/2.0/ http://vapor.university 在结束本文时,我同意Ryan Collins所说的话,即Server-Side Swift有望成为编程领域的一个有力竞争者。 谢谢你的时间! 希望本文对您有所帮助。 在Twitter上联系: stefanofrosoni

与Cocoapods共享框架

完成框架后,您可能希望与Cocoapods共享它,以便每个人都可以轻松安装您的框架。 您的框架可能包含图像,gif或某些捆绑文件,本教程将显示如何通过pod.spec将资源包括到Cocoapods中。 顺便说一句,处理Cocoapods可能涉及一些基本的终端命令,如果您不熟悉终端,我建议您去找一些有关它的教程,因为在本教程中,我将不做详细解释。 在本教程中,我们将从头开始,创建一个GitHub存储库并编写一个名为SAProgressHUB的框架,最后,与Cocoapods共享它。 首先,让我们创建一个名称为SAProgressHUB的GitHub存储库。 不要忘记创建许可证。 现在,只需git将此存储库克隆到本地文件夹即可。 $ cd〜/ Documents / Hank_Private / $ git clone git@github.com:bbkaf / SAProgressHUB.git //下载成功后$ cd SAProgressHUB / $ ls -al 我们将创建.gitignore。 只需使用vim创建.gitignore和过去的gitognore https://github.com/github/gitignore/blob/master/Swift.gitignore $ vim .gitignore $ git add .gitignore $ git commit -m“添加.gitignore” $ git push 好的,现在让我们启动Xcode来创建我们的框架。 文件新项目选择“ Cocoa Touch Framework”。 使用GitHub存储库的名称来命名项目,使用不同的名称可能会给您带来混乱,我认为您不喜欢这样做。 现在让我们检查框架路径并进行提交,然后将其推送到GitHub $ ls -al $ git […]

本周GitHub上的10种趋势化Swift仓库

这篇文章由IssueHunt策划, 它是一个开源项目的众筹和采购平台。 任何人都可以在GitHub上资助任何问题,这些钱将分配给维护者和贡献者。 https://issuehunt.io/ Schedule是一种现代且示例性的轻量级任务计划程序快速计时器。 它使您可以使用人性化的语法来操作定时活动。 功能包括:日程安排规则,人类可读时间段分析,基于标签的标签管理,cake child-action添加/删除以及对生命周期的完全控制。 使用计划的原因:有效的基于间隔的计划,基于日期的计划,任务管理和寄生 时间表/时间表 a这就是快速计时器的外观。 通过在…上创建帐户来为jianstm / Schedule开发做出贡献 github.com DifferenceKit是Swift集合的快速且灵活的O(n)差异算法平台。 该算法是根据Paul Heckel的算法进行编程的。 功能:自动计算用于UITableView以及UICollectionView的批处理更新的命令; 分段线性收集; 计算差异,甚至包含重复元素的差异。 优点:计算线性时间中的所有差异类型。 文档是由爵士乐产生的,因此令人赞叹。 DifferenceKit产生更好的性能。 ra1028 / DifferenceKit for用于Swift收集的快速灵活的O(n)差异算法框架。 – ra1028 / DifferenceKit github.com Penc是窗口管理器,它是针对macOS的触控板。 代替键盘的复杂快捷键,可以对Penc进行编程以使用触控板。 用法:要激活Penc,只需双击并按住Command键(⌘) 使用当前的dmg文件完成下载和安装 该框架支持macOS High Sierra(10.13)。 杜古卡纳克 适用于macOS的基于触控板的窗口管理器。 通过在GitHub上创建一个帐户为dgurkaynak / Penc开发做出贡献。 github.com iina是macOS的当前视频播放器。 功能:现代macOS(10.11+),可自定义的用户界面,画中画,缩略图预览,MPV配置文件以及脚本系统,可自定义的键盘,独立音乐模式。 构建:使用预编译的dylib,或者您可以使用最新的mpv。 lhc70000 / iina 适用于macOS的现代视频播放器。 通过在GitHub上创建一个帐户为lhc70000 / […]

在iOS 12+上检测Internet访问

我最近写了一篇有关iOS如何在显示允许用户登录或注册的Web视图之前如何检测连接到新Wi-Fi网络的强制门户的文章。 对于大多数在酒店,酒吧或咖啡厅等处连接到公共Wi-Fi网络的人来说,这种情况很熟悉。如果您还不了解其工作原理,请 在iOS上解决强制门户问题 提供了这篇文章的有用背景。 多年来,Apple的Reachability示例代码一直被用作检测第三方iOS应用程序中网络访问的实际起点。 在Cocoapods.org上进行的快速搜索将显示一长串库,这些库重写了此代码时考虑了许多因素,例如ARC支持或Swift兼容性。 WWDC在2018年6月推出了从iOS 12起可用的Network框架,其中包括NWPathMonitor类。 此类为我们提供了一种监控网络状态变化的方法,而不必包含第三方库/ Apple示例代码。 为了利用NWPathMonitor类,只需导入Network框架,然后创建一个NWPathMonitor实例: 让监视器= NWPathMonitor() 如果仅对特定网络适配器(例如Wi-Fi)中的状态更改感兴趣,则可以使用init(requiredInterfaceType:)初始化程序并提供NWInterface.InterfaceType作为实例来指定要监视实例化NWPathMonitor对象的网络适配器。参数例如 让监视器= NWPathMonitor(requiredInterfaceType:.wifi) 您需要确保在某个地方保留对该对象的引用(例如使用强属性),否则您可能会发现,当ARC释放NWPathMonitor对象时,分配给您的回调将停止调用。 可以监视的接口类型包括: cellular loopback other (针对虚拟或不确定网络类型) wifi wiredEthernet 要通知状态更改,您需要为pathUpdateHandler属性分配一个回调,只要网络接口中发生状态更改(例如,您的电话从蜂窝网络移动到Wi-Fi网络),就会调用该回调。 然后,无论何时发生状态更改,都会返回一个NWPath实例,可以查询该实例以确定我们是否已连接,如下所示: monitor.pathUpdateHandler = { 如果path.status == .satisfied { 打印(“已连接”) } } 使用无参数初始化程序与使用指定网络适配器的初始化程序会影响是否satisfied.返回的NWPath对象的status属性satisfied. 例如,如果您选择监视蜂窝网络适配器,但是Wi-Fi适配器发生状态更改(例如,您的电话连接到Wi-Fi网络),则您的回调将不会被调用,并且路径的状态将unsatisfied (可以使用currentPath属性随时访问NWPathMonitor的路径),因为未使用指定的接口连接设备。 因此,如果您只是想知道是否存在连接,无论是Wi-Fi还是蜂窝网络,那么最好坚持使用无参数初始化器。 有趣的是-虽然NWPath对象是iOS 12中作为Network框架的一部分而新增的,但实际上,自iOS 9起, NWPath对象已作为NWPath一部分使用(有一些细微差别)。 可以查询返回的NWPath对象,以了解有关设备网络适配器状态的大量信息。 更有趣的属性之一是isExpensive ,它返回是否认为网络接口使用昂贵(例如,蜂窝数据计划)昂贵。 我们还可以找出该路径是否支持DNS,IPv4或IPv6。 如果我们需要找出哪个接口更改了状态并触发了回调,则可以调用usesInterfaceType方法: let isCellular:Bool = path.usesInterfaceType(.cellular) 使用NWPathMonitor与使用其他iOS API(例如CLLocationManager […]

为什么何时以及如何开源iOS组件

我们都为不同的iOS项目做一些特定的UI控件,有时甚至看到可以在其他项目或将来的项目中重复使用的部分。 这是一个很好的机会,可以为我们节省一些时间,并学到新的东西并变得更好。 本文基于我以前发布的iOS控件CircleProgressBar的经验,它在GitHub上有350颗星,安装了2k多个独特的应用程序,下载了254k多个下载,并且此控件仍按预期运行。 我相信这是由于我在将控件公开之前做出的初步决定以及不定期的支持和存储库管理。 为什么要开源? 我确实相信开放源代码,我们所有人都看到许多强大的图书馆和背后的强大社区。 我们大多数人每天都使用许多此类库,例如AFNetworking / Alamofire或SDWebImage。 无需实施自己的解决方案(即使它是“轻量级”的),然后在每次您需要支持新协议或功能(例如缓存)时对其进行扩展,则可以更有效地利用成千上万其他开发人员使用和现场测试的现有库。 但是除了这个伟大的事业之外,我只是想分享自己的代码,我认为这是一次很棒的新体验,一次新的冒险。 我的控制很简单,我认为没有什么可以解决的,不能改善。 我想:“我会把它放出来等待。” 但是我对获得的成果和所学到的东西感到非常惊讶! 这就是为什么我鼓励您自己尝试一下的原因,因为起初很难理解我们可以从中得到什么,但是只有当您开始给予您更多的响应时,您才可以尝试。 何时开放源代码? 我们创建的某些内容并不意味着要共享或很难共享。 我相信您应该问要共享的组件的第一个问题: 为什么有人要使用它? 就像SOLID原则中S代表“单一职责原则”一样,最好是您的库仅解决一个主要问题:处理http请求,管理ftp连接,显示日期选择器等。 像许多Utils库这样的多功能库通常不经常使用,因为大多数开发人员只需要使用“一个字符串操作”,该操作比添加其他依赖项更容易复制粘贴。 只需向任何前端开发人员询问有关JQuery的信息,以及他们如何喜欢它。 尽管它在某些具有特定元素查询的繁重项目中可能非常有用-一些开发人员非常懒惰,以至于他们将其添加为对微型项目的依赖,但是当他们需要的只是简单的getElementById函数时, getElementById可用纯JavaScript。 另外,使您的库尽可能独立也是非常重要的,因为您拥有的依赖关系越多–每次主要iOS版本更新后,人们希望依靠您的库并花费大量时间修复所有内容的人就越少。 当您最终决定要对代码的某些部分进行开源时,无论是控件还是库,都一定要准备一些额外的时间,以便为类和代码最终确定和准备清晰的接口。 如何开源? 现在我们到了最有趣的地方-终于做到了。 依存关系 尽可能删除所有依赖项。 与遵循一系列依赖关系来修复某些问题然后再次更新您的存储库以更新所需的依赖关系版本相比,某些问题更容易在您的存储库中内联修复。 我见过很多次,当某些控件依赖十六进制颜色库获取2-3个默认颜色常量时。 如果使用它来定义常量值,那么具有这种依赖性是没有意义的。 只需将其替换为简单的UIColor(R:G:B:A:)调用即可描述相同的颜色。 为了控制自己,我决定避免任何依赖关系,并且在主要的iOS版本中,我不需要进行任何更新。 该控件只是按预期工作。 因此,除非确实有必要-删除依赖项,并使控件尽可能独立。 我还看到了依赖于某些特定架构(例如MVVM)的不同控件。 控件的创建者在他的项目中使用MVVM或VIPER真的很酷,但是尝试考虑标准的Apple控件库,他们会强迫您使用其MVC吗? 您可以将任何标准的Apple Control与任何体系结构一起使用,那么为什么要为您的控件添加这种依赖关系并减小库的可能客户端的范围呢? 类接口 要为您的库或控件中的类创建一个清晰的界面,请尝试将其视为一个新用户,只希望解决您的控件正在解决的问题。 尝试以这个新来的新用户接触您的图书馆,这个新用户对您需要解决的所有问题一无所知。 尝试考虑什么是最适合此类用户的界面,它将阻止他进入您的代码来学习什么以及为什么。 这可能是一个非常有创意的步骤,我可能无法提供太多有关此信息,而不是分享我的经验。 在我的库CircleProgressBar中,我只想拥有一个进度条,而不是水平填充条可以以圆形方式围绕中心移动。 我假设用户期望可以使用一些熟悉的界面,所以我决定将标准UIProgressView用作类界面的基础。 我实现了相同的方法setProgress:animated:和只读属性progress 。 这里的想法是,您可以简单地用UIProgressView替换InterfaceBuilder中的现有UIProgressView ,而无需更改使用它来更新进度或检查状态的任何代码。 客制化 当您的控件解决了开发人员的问题时,并不需要与每个UI / […]