ReSwift — Redux风格的单向数据流

ReSwift是Swift中redux哲学的实现。 如果您不熟悉Redux,那就是管理应用程序的状态。 这样它总是可以预测的。 让我们看一下下面的架构以更好地理解它。 存储 -这是应用程序整个状态所在的位置。 状态可以只是查看状态,甚至可以是数据库状态,应用程序状态等,具体取决于您要如何使用ReSwift。 我建议仅将其用于视图状态,因为ReSwift在主线程上执行。 视图 -视图部分是整个视图层或应用程序的外观 。 简而言之,视图是状态的函数,在任何时候它都只是应用程序状态的一个很好的表示。 动作 -动作是通过用户交互通过视图分派的,并且由商店使用,然后商店会更新应用程序的状态。 这里还有其他两个部分– 减速器 —减速器是纯函数。 他们消耗一个状态,一个动作并产生一个新状态。 中间件 -上面的图中显示了中间件,但是中间件在还原器之前起作用。 每个动作都必须经过中间件,并且它可以对该动作起作用。 它们对于事件记录和操作计划非常有用。 如果您能想到更多案例或想讨论中间件的用例,请在下面的评论中发表。 在普通的iOS应用程序中,ViewController倾向于承担比任何其他组件更多的责任。 随着屏幕复杂性的增加,在我们的视图控制器中维护干净的代码变得越来越困难。 您可以将其与用例联系在一起,在这些用例中,我们最终向视图控制器添加标志和枚举,以使其适用于不同的状态。 记住很难重现的错误,因为只有当您以特定组合执行某些操作时,这些错误才会浮现出来。 ViewController已经承担了很多责任。 跟踪标志,枚举和查看数据是它应该担心的最后一件事。 想象一下,每当您看到与视图相关的错误时,如果只有一种检查方法,这将是多么容易! 使用ReSwift时,View只是状态之上的皮肤。 这意味着,只要您发现视图有问题,就可以随时检查状态以检查不同的值。 同样,状态只能通过调度动作来更改,因此您可以轻松找出导致该状态的动作。 如果预测不是很简单,则可以使用中间件来记录所有已调度操作的日志。 我们知道iOS中出现了许多架构,例如MVVM,MVP,VIPER等。ReSwift以非常独特的方式将自己与这些架构区分开。 如果仔细观察,所有其他架构都将重点放在责任分离上。 ReSwift可帮助您管理应用程序的状态。 这也意味着ReSwift可以轻松地与同一应用程序中的所有这些架构共存。 基本原则 所有视图数据都应以某种状态存储。 在任何时间点-整个应用程序(如用户所见)都是该状态的“很好的表示”。 只能通过调度动作来修改状态。 对于每个视图控制器,只有一个类(通常是演示者)将侦听并响应状态更改。 与MVP并肩作战 代码示例 以下是图像库应用程序中的代码片段,展示了ReSwift框架中的语法片段。 有关完整的代码,请访问https://github.com/amreshkumar/ReSwiftDemo

如何将照片上传到社区

您是否知道您还可以与我们在线社区中其他志趣相投的“数字”艺术家分享您的照片? 就是这样! 1.点击共享图标 完成新杰作的编辑后,点击“ 共享 ”图标。 Android:右上方共享图标 Windows:左上方菜单图标 iPhone:底部三点图标 2.选择社区选项 3.字幕并允许重新过滤 现在,向您的照片添加描述性标题,然后选择其他用户是否可以重新过滤*。 * 要了解有关允许其他用户重新过滤您的照片的更多信息,请单击 此处 。 4.登录或注册 如果您已经在我们的社区中创建了用户,请登录您的个人资料,您的照片将被上传。 * 我们所有应用程序的用户配置文件都会生成一次,因此,如果您拥有Painnt,Photomontager或其他Moonlighting应用程序的配置文件,则其余部分可以使用相同的配置文件。 如果您还没有用户,请单击“我没有帐户”,然后继续执行创建新个人资料的步骤。 完成后,您将可以分享您的第一本杰作! 此外,社区中最令人惊叹的作品将出现在Moonlighting的主页上。 上传您的照片,并成为精选!

为什么我爱Apple MVC

声明:我仍在学习iOS编程,因此请将此作为学习笔记而不是教程。 干杯! MVC摇滚。 不严重,这是我见过的最干净的架构。 让我们看一下这张图: 现在告诉我这种三组分结构如何变得更清洁。 也许MVVM? 它也仅由3个组件组成。 但是,等等,现在我们有了另一层称为binding ,而不是普通的事件驱动的MVC体系结构 。 是的,绑定有其优点,但是恕我直言,它不必要地使事件流难以理解。 因此,它是比Apple MVC更复杂的体系结构。 我认为人们之所以如此讨厌Apple MVC,是因为用它编写大型视图控制器很容易。 但是首先, 大规模视图控制器有什么不好? 我的意思是,如果视图控制器职责明确且结构合理,因此非常易于维护,那么编写大型视图控制器是一种不好的做法? 对我来说,更少的代码并不等于更好的代码。 易于理解对代码而言更为重要。 可以在一种方法中配置表视图(可能是viewDidLoad() ),并带有一些UIKit closurising扩展,并使代码比将经典的委托和数据源协议应用于视图控制器本身要少得多,但实际上,维护该视图非常容易具有协议扩展的代码,而不是单一方法中的一堆多层代码。 想一想。 委托扩展是这样的: extension MyViewController: UITableViewDelegate { // Protocol implementations } 它基本上意味着MyViewController在说“我可以管理UITableView ,这就是我要管理的方式”。 换句话说, 所有与 UITableView 相关的代码都在此extension中 。 这真太了不起了。 即使您的视图控制器具有数千行代码,您也可以轻松地在此扩展中查找任何表视图问题。 对我来说,如果视图控制器过于复杂,可能是因为 一个视图控制器的职责过多。 该方法设计不良。 视图控制器中存储的属性过多。 那么如何改进呢? 确定何时使用视图控制器(而不是仅使用视图) 通常,人们认为视图控制器代表一个场景 ,因此仅在出现新场景时才应使用视图控制器。 这不是真的。 每当场景过于复杂时,都应将其分解为几个子场景-或子视图控制器。 像UINavigationController一样。 它的职责仅是管理其子视图控制器的转换 […]

仅使用iPhone对React Native应用进行编程

我是工作狂 我不会轻易说出来。 暂停开发我的应用程序对我来说是令人难以置信的压力和困难,尤其是在有很多事情要做的时候。 因此,当我发现与父母和女友进行为期10天的欧洲之行时,我非常担心牺牲宝贵的工作时间。 那应该是我对欧洲假期的最初反应吗? 可能不会。 但是我对自己下定决心,只要有空闲时间或每个人都入睡后,我仍然可以完成一些工作,因此我仍然可以取得一些进步。 这是双赢! 我仍然可以在意大利和法国旅行并享受我们的郊游,而且我仍然可以完成一些工作。 但是出现了一种新的并发症。 乘飞机的早晨,我发现无法携带笔记本电脑。 现在我们有一个问题。 我知道我必须适应。 您可能会猜到我根据标题决定尝试的内容。 没错,我可以想到的处理任何代码的唯一方法是,如果我在iPhone上找到了一种相对有效的编码方法。 这是我的方法。 进行设置 几次Google和App Store搜索后又经过几次反复试验,我确实在飞机起飞前几个小时就整理好了设置! 我需要的第一个也是最重要的应用是Github客户端,它允许我执行以下操作: 访问我的应用的私人Github存储库。 在其上添加和编辑任何文本文件。 拉,推和提交我对其所做的任何更改。 我发现有很多应用程序可以让您查看项目,但是只有少数应用程序支持编辑。 在尝试了一些选项之后,我决定使用工作副本。 它满足了我的所有要求,拥有一个性感的用户界面,拥有157个评分,平均评分为4.8星,而且我什至可以免费试用! 我非常喜欢它,我觉得值得为专业功能付费。 为了使事情变得更好,开发人员仍然非常活跃,并定期发布更新! 感谢您提供出色的移动Github客户端Anders Borum。 您值得一枚金牌! App Store链接:https://itunes.apple.com/us/app/working-copy/id896694807?mt = 8 我的移动设备设置中唯一缺少的部分是自定义键盘,可让您尽快输入代码。 物理智能手机键盘之所以售罄,是因为我们没有时间停下来购买,因此唯一的选择是下载自定义iOS键盘。 虽然我经常下载并尝试新的有趣的应用程序,但我并没有探索许多自定义键盘。 我从未感到有必要冒险超越Google的GBoard(这是最好的)。 我试用了一些开发键盘,并认为CodeKey Pro是适合该工作的键盘。 用最少的偶然键盘按键,对我来说感觉最好。 它还根据您设置的语言提供自定义快捷方式。 就我而言,我使用Javascript是因为我的应用程序是基于React Native构建的。 感谢您在我的移动开发设置上的精采,Abhinav Dimri! 应用商店链接:https://itunes.apple.com/us/app/codekey-pro-custom-keyboard-designed-for-programmers/id1054647516?mt=8 和繁荣,我准备在旅途中编写代码! 温馨提示:虽然没有必要,但在旅途中带上外接电池很方便。 “但是阿明! 您是如何测试代码的?” 我没有 这不是最佳实践,但是我所能做的就是编写代码,仔细检查拼写错误,并在回来时进行调试。 也许可以使用Expo的移动应用程序来运行该应用程序(我不使用Expo,所以我不知道),但是我的React […]

内部来源

这有什么不同? 在Impala Studios,我们从拥有共享维护权的两个团队待办事项到通常由模块化和微服务件组成的包含我们所有产品的单个待办事项。 您会看到我们的产品由应用程序,框架,第三方模块和后端服务组成。 每个模块都可以设置为特定产品。 例如,Alarm Clock HD的iOS应用程序内部具有Alarm Clock Framework。 它使用多个SDK和3rd Party模块在应用程序营销和新闻中显示广告,收集数据,并使用我们自己的气象服务来获取新气象。 在我们当前的设置中,整个应用都有一个监护人和一个产品负责人,但是没有一个模块具有特定的所有权。 基本上每个人都拥有内部维护的代码,没有人拥有由外部各方维护的代码。 由于集成产品由其每个模块(不断更新)的最新版本组成,因此创建了相当复杂的依赖关系集。 随着模块的更新,诸如App之类的集成产品将会崩溃。 我们通常也不知道有没有损坏,因为应用程序中的大多数集成都不受自动化测试的影响。 当前,查看已经存在于存储库中一段时间​​的App是否仍然有效的唯一方法是制作和测试当前版本,然后修复发现的内容。 借助Innersourcing,Alarm Clock HD将拥有一个“所有者”(即产品所有者),但是监护权现在将进入每个模块。 现在,团队将负责团队中具有监护人的所有模块。 每个人仍然可以更改这些模块,但是拥有该模块监护权的团队拥有最终批准权。 监护团队确保它使用自己的模块(例如Cocoapods)的依赖处理程序来制作其模块的新版本,然后可用于新版本。 从例子中学习 Google — 20亿行代码 使用内部外包的单个产品的最大示例可能是Google的实现。 Google的所有25,000名工程师都可以在一个存储库中访问几乎所有20亿行代码! 我们可以从Google中学到的东西: 他们将代码保存在团队拥有的“目录”中。 除目录外,任何开发人员都可以进行任何更改,您的更改必须经过所有者的批准。 分支-它们具有“基于主干”或“发布分支”的模型。 尽可能晚地制作master分支的快照,并在此基础上开发新功能。 如果主服务器上已更新了开发所需的内容,则可以将其“放入樱桃”到发行分支中(由于其大小,他们甚至没有选择与主分支保持同步)。 发布分支是生产的基础。 我们可以考虑使用GitLab Flow,当然也可以考虑使用CocoaPods冻结版本。 它们具有每次提交时运行的单元测试的代码覆盖率。 他们使用拉取请求和自动部署进行代码检查。 贝宝(Paypal)-开源和内部源之间的优势 有许多公司一直活跃在开源社区中,而不是从专有或内部源码,甚至是开源方面发生变化的公司。 Google和Facebook在开放源代码许可下拥有部分代码,Apache基金会和Ubuntu / Canonical拥有完全基于社区的软件。 Paypal是后来者,但自2014年初以来,他们在kraken.js项目上开始从Java过渡到JavaScript和Node.js时,就采用了Inner Source。 他们注意到,要为许多项目做出贡献,就必须采用一种新的工作方式。 一个重要的变化是迁移到GitHub和使用Git。 另一个是就质量标准达成共识,例如单元测试。 最后,他们注意到开放源代码贡献者的工作是分散的,而他们正在迁移到同一地点的团队。 面对面交流的缺点是,对于不了解该软件的人而言,没有文档记录,他们必须学习使用readme.txt,changelog.txt并在git中进行文明的在线公开讨论注释。 由于kraken.js是开源的,因此与外部贡献者的通信在某种程度上迫使了这一点。 O’Reilly上提供了对Paypal内源的深入了解。 […]

React Native —使用fetch()的陷阱

使用fetch()时,您是否曾经被卡住?由于某种原因,尝试从第三方API提取数据时会不断出错? 即使您按照该教程进行操作,您仍在按照作者编写的方式进行操作? 我最近陷入困境,直到2016年12月的某个时候才发现这不是问题。这就是我所发现的。 Apple默认为与iOS 9.0或OS X v10.11 SDK链接的应用程序启用应用程序传输安全性(ATS)。 在本机中,这些设置在ios / {您的项目名称}文件夹下的info.plist文件中。 0.28之前的react-native版本默认将info.plist中的命令默认为允许使用以下代码的非安全请求(即http): 上面的代码允许您的fetch()命令使用http或https uri。 但是,Apple宣布,在2016年12月之后,所有将此键的值设置为True的应用程序都会触发App Store的自动审核,并且需要证明其合理性。 请参阅此处的Apple ATS文档:https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33。 结果,react native更改了默认的info.plist代码以使其与Apple的ATS策略保持一致,并对该代码进行了结构化,以专门标识将允许进行非安全访问的每个域。 因此,现在info.plist中的默认代码如下所示: 该应用仅允许在没有安全连接的情况下访问localhost ,必须通过https访问所有其他域。 当您要访问未使用https提供服务的第三方API时,会出现问题。 为此,您必须在NSExceptionDomains下添加另一个。 例如,假设您的API位于testapi.com。 您需要打开info.plist并将其添加到异常域列表中,如下所示: 现在,您的应用应该停止引发安全错误,并且fetch()命令应该可以正常工作。 请记住,每当您的应用程序需要访问不使用安全连接的第三方URL时,请确保通过在info.plist文件中添加域来解决该问题。

为我们的iOS 360视频库开放源代码:DDDKit

https://github.com/team-pie/dddkit 在Pie,我们正在开放资源库以显示360个视频。 自2016年11月推出以来,我们一直在我们的应用程序中使用它,对我们来说一直很好。 因此,我们很高兴将其开放给他人使用,从中获得启发,并提出更改和贡献的建议! 现在可以作为可可豆荚使用: pod ‘DDDKit’ 我们的重点是360视频,360图像和滤镜。 因此,我们设计了DDDKit来简化这些部分。 用法 DDD360VideoViewController 这是一个预烘焙的便捷视图控制器,可以处理大多数逻辑,以便您快速入门。 当您对此更加认真时,您将需要在DDDKit中进行更深入的研究: 我们希望为他们提供超级简单的支持,而又不会失去我们可以创建的所有过滤器范围。 因此,我们将它们留在了着色器程序级别,但受SceneKit的着色器修改器的启发,使它成为易于使用的API 还记得着色器代码吗? 这里有两条注释行// header modifier here和// body modifier here它们是我们可以插入的代码块的占位符。 为了做一个简单的黑白过滤器,我们将程序定义替换为: 完整的代码在这里。 为什么不使用SceneKit? SceneKit是Apple的3D渲染框架。 它具有广泛的关注点,并且在很多方面都非常强大且设计合理。 但是,我们决定建立自己的替代产品,因为: SceneKit在iOS 10.0中引入了内存泄漏 对视频的支持不是自然的,而是通过Apple的2d渲染框架SpriteKit完成的。 我们发现SceneKit的在线文档在与视频和着色器修改器相关的功能方面非常差。 当您遇到问题时,没有代码需要看,只有一个很小的SO社区可以使用,也没有人及时响应您的错误报告。 苹果!=开源! 我们的关注点小于SceneKit的关注点,我们认为我们可以在更严格的范围内提供更好的解决方案。 期待 我们想到了以下几点: 完善我们自己的文档。 调查金属支持 添加单元测试 你怎么能帮忙 使用DDDKit,打开带有错误和建议的问题。 我们会及时回应。 让我们知道您如何使用或计划使用DDDKit以及是否缺少某些功能。 给我们一颗星星 !

创建生产证书

在使用iOS Apps时,生产证书过期听起来很可怕,但从用户的角度来看不会受到任何影响。 我们的应用仍在App Store中,用户仍可以下载和使用。 唯一会受到影响的是我们对应用程序进行签名的能力,换句话说,我们无法创建新的生产版本并不再提供更新。 以下是分步说明,可帮助您创建适当的生产证书。 第1步:登录Apple开发中心,网址为: 使用您的Apple ID登录– Apple Developer 使用您用来注册或立即注册的Apple ID。 developer.apple.com 然后在左侧面板的Certificates下选择生产: 第2步:选择 App Store and Ad Hoc ,然后继续 然后,您将看到此页面: 步骤3:向CA请求证书。 请按照上述说明从CA申请证书。 请根据您自己的情况填写文本字段。 Save to disk您的CA Email Address为空,并且选中“ Save to disk选项。 NOTICE:请保存此CertificateSigningRequest.certSigningRequest确保安全! 步骤4:将 CertificateSigningRequest.certSigningRequest 上传 到Apple开发中心 现在您将能够看到此生产密钥已准备就绪,可以下载此密钥并将其发送给移动开发人员。 当心这个到期日,我们需要创建一个新的或在到期后进行续订。 参考 https://needone.app/create-production-certificate/

我对MAC OS中的UI自动化的第一次体验

我很惊讶地知道MAC在其操作系统中具有默认的Automation。 当我开始探索更多有关它的信息时,我开始开发一个小型的iOS应用程序,该应用程序继续使用自动化,在这里,我们开始….. 要创建示例应用, 步骤1 :从MAC最右上角的Spotlight搜索在Mac中打开Xcode。 步骤2 :在Xcode中,单击“文件”->“新建”>“项目”>“单一视图应用程序”。 步骤3 :单击Next(下一步),并为Project(例如样本)分配一个名称。 步骤4 :单击下一步,该项目将在Xcode中打开,现在在您的左侧将拥有文件夹,单击Storyboard,其中显示了您的Iphone 6s视图控制器。 步骤5 :您的设计从这里开始,我们将在此处放置两个按钮,在您的右下角,有“过滤器,搜索按钮并将其拖到视图控制器中, 将这些按钮命名为“按钮1”和“按钮2”。 步骤6 :点击Xcode最右上角的“显示助手编辑器按钮”。 步骤7 :现在,助手窗口在视图控制器的右侧打开,现在按住视图控制器中的第一个按钮,并将其拖动到助手编辑器窗口中的“ @interface ViewController()”,现在将弹出一个窗口,如下图所示,填写详细信息, 对Button2也重复同样的操作,完成后,您将获得以下代码, @interface ViewController() –(IBAction)Button1:(id)发送方; –(IBAction)Button2:(id)发送方; @结束 步骤8 :现在,从窗口左侧的文件夹中单击“ Viewcontroller.h ”, 步骤9 :将以下代码复制到“ –(IBAction)Button1:(id)sender {} ”中,在此我们定义按钮的操作, “ UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@“ Button 1”消息:@“ Pressed Button 1”代表:无cancelButtonTitle:@“ ok” otherButtonTitles:nil]; [警报显示]; ” 步骤10 :也对Button […]

适用于iOS应用程序的Bitrise Fastlane集成

有关如何将fastlane(iOS和Android的CD工具)集成到Bitrise中以及如何在 Bitrise 上运行相同命令的 逐步指南 。 Moses Kim的来宾帖子。 原始帖子出现在 Shakuro博客上 。 本文基于对移动开发人员Sergey Laschuk和Ruslan Krohalev的采访。 摩西是Shakuro数字产品代理商的作家。 他喜欢研究技术,体验设计和武术。 在自动化测试以及构建Web和移动应用程序的部署方面,有几种完善的持续集成服务。 然而,Bitrise在2017年获得了广泛的宣传,并拥有在2018年获得更多关注的所有好机会。 什么是Bitrise Bitrise是一个主要致力于移动开发的持续集成平台。 持续集成(CI)是在特定的时间表上将开发人员构建副本合并到共享主线的一种普遍接受的做法。 换句话说,这是一个用于版本控制和复制部署的工作流,而不会失去对开发过程的跟踪。 Bitrise允许创建包含构建步骤的多个工作流程。 一个应用程序可以为其定义多个工作流程,还可以使用webhook来指定为哪个触发器(webhook)选择了哪个工作流程。 映射到工作流程的触发器使用预定义的工作流程启动构建。 对构建步骤进行编程,以执行由命令行脚本实现的各种功能。 记录所有虚拟机构建步骤,以保留工作流每一步的信息。 我们与Bitrise合作的项目 Bitrise允许Jira集成,这对我们来说是个不错的选择,因为要实现的所有功能,时间跟踪和估算都是由我们公司的Jira运行的。 构建自动化 到目前为止,我们已经在两个主要的移动开发项目上使用了Bitrise,其中一个是已经在App Store上运行的iOS应用程序。 凭借每天生成的新版本,Bitrise可以自动将主版本更改货件自动交付给App Store测试。 工作流还配置为仅在实施更改后才交付新的版本。 因此,产品负责人仅收到有关已发货的重要产品的信息。 测试自动化 新功能会自动进行测试,如果发现错误,则不会提供任何构建。 最新的Bitrise功能之一允许在设备模拟器上运行功能用户测试。 如果这些单元测试中的任何一个失败,则通知将直接发送给开发人员。 对于我们的一个iOS应用,每天都会从项目GitHub存储库上的提交收集所有消息。 在本周或冲刺结束时,或在具有里程碑意义的情况下,产品负责人(客户)提出了对修补程序的描述以及添加到内部版本的新功能。 提交随附的文件中列出了所有功能和修复。 这些描述的组合由Bitrise自动化。 总而言之,每次上传到TestFlight最多需要1个小时。 但是,由于它是由Bitrise虚拟机完成的,因此对我们来说不算什么。 什么是快车道 Fastlane是适用于iOS和Android的持续交付工具。 Fastlane是用红宝石编写的工具,可以通过红宝石宝石安装。 与Bitrise一样,Fastlane也有构建步骤,称为“动作”。 每个动作都是必须执行才能获得某种结果的任务。 可以将所有Fastlane动作收集到称为Lanes的单个实体中。 泳道就像Bitrise中的工作流。 当在Fastlane中运行通道时,如果任何一个操作执行不正确,则会执行该通道中的每个操作,并且构建失败。 通道在称为Fastlife的文件中定义。 在所有类似方面,Bitrise和Fastlane并不冲突且彼此重复,但是正如我们发现的那样,Fastlane可以大大补充Bitrise在移动开发项目中的参与。 […]