Tag: iOS应用开发

Swift中的VIPER设计模式,用于iOS应用程序开发。

设计模式是上帝给软件开发人员的礼物。 这些技术可最大程度地减少代码重复,防止高度耦合并标准化编写代码的通用方式,从而为开发软件时的重复出现情况提供了通用解决方案。 在这个故事中,我们将熟悉用于iOS开发的称为VIPER (视图,交互器,演示者,实体和路由器)的设计模式。 先决条件:在开始学习VIPER之前,请确保您了解建筑设计模式和委托模式。 什么是毒蛇? 毒蛇是一种实现“关注分离”范式的设计模式。 与MVP或MVC一样,它通常采用模块化方法。 一种功能,一种模块。 对于每个模块,VIPER具有五个(有时是四个)不同的类,具有不同的角色。 任何课程都不能超出其唯一目的。 这些课程如下。 查看:具有所有代码的类,用于向用户显示应用程序界面并获取他们的响应。 在收到响应后,View会提醒演示者。 演示者:模块的核心。 它从视图中获取用户响应并相应地工作。 仅用于与所有其他组件进行通信的类。 调用路由器进行线框图,交互器以获取数据(网络调用或本地数据调用),查看以更新UI。 交互器:具有应用程序的业务逻辑。 主要进行API调用以从源中获取数据。 负责进行数据调用,但不一定来自其自身。 路由器:进行电线成帧。 从演示者那里收听要演示的屏幕并执行该屏幕。 实体:包含交互器使用的普通模型类。 下面显示了VIPER的简单示意图 毒蛇的例子 我创建了一个简单的项目来解释毒蛇。 可以在GitHub上找到。 这是一个非常基本的应用程序,它显示了从外部API获取的新闻标题。 (:p没用)。 Viper是委托驱动的体系结构。 因此,不同层之间的大多数通信都是通过委派执行的。 一层通过协议调用另一层。 调用层从协议中调用函数。 侦听层符合该协议并实现该功能。 下面,我将解释如何在我的一个示例项目中实现VIPER。 我建议您在github中打开项目并阅读说明。 通讯协定 我为所有协议创建了一个单独的文件。 遵循命名约定来命名协议。 例如,“ viewToPresenterProtocol”。 因此,这是一个“协议”,将由“演示者”实施以收听“视图”必须说的内容。 PresenterToViewProtocol:演示者调用,View侦听。 演示者从该协议接收引用以访问View。 视图符合协议。 ViewToPresenterProtocol:查看呼叫,主持人收听。 InteractorToPresenterProtocol:Interactor调用,Presenter监听。 PresentorToInterectorProtocol:演示者调用,Interactor侦听。 PresenterToRouterProtocol:演示者呼叫,路由器监听。 应用流程 View具有对“ ViewToPresenterProtocol”的引用以访问“ Presenter”并符合“ PresenterToViewProtocol”。 […]

2017年iPhone App开发的新兴趋势

增长是技术必不可少的部分,该规则也适用于移动应用程序。 移动应用程序空间在Android和iOS之间共享,每个平台之间都存在激烈的竞争。 尽管Android应用程序在市场份额方面占主导地位,但iOS在收入创造方面起了蛋糕的作用。 苹果用户在忠诚度方面击败了Android用户,因为他们宁愿保留其操作系统而不是改用其他操作系统。 因此, 移动应用程序开发人员 必须确保iPhone应用程序遵循最新趋势,以使其达到最大用户数量并保留它们。 以下是将在2017年塑造iPhone应用程序的新兴趋势: 迅捷突破 从Objective-C到Swift编码的过渡是iPhone应用程序开发领域的最大突破。 该开关为开发人员打开了全新的Xcode工具范围,使他们能够为应用程序编写可靠的代码。 除此之外,Apple还提供了Swift 2,它具有许多对开发人员友好的功能。 Swift可用于开发iOS,tvOS和WatchOS的应用程序。 信标 iPhone应用程序的另一个流行趋势是位置跟踪,它以iBeacons的形式出现。 应用将被设计为提供基于位置的服务,以便它们可以提供增强的用户体验并最大程度地利用商机。 云技术 今年,云技术将成为iPhone应用程序开发人员必不可少的一部分。 通过将该技术集成到应用程序中,他们将使它能够跨多个设备同步。 同样,应用程序的大小将减小,从而释放设备空间。 物联网 iOS应用最有可能在2017年受到物联网和大数据的积极影响。由于重点将放在利用IoT技术实现企业移动性和家庭自动化上,因此这些应用将走在前列。 移动商务 随着越来越多的企业上线,移动应用程序的趋势也将转向支持iPhone的移动商务应用程序。 整合信标和移动钱包等创新功能将改善购物者的体验,并为卖家带来更多业务。 此外,这些应用程序还具有快速简便的结帐和安全付款的优势。 应用程式安全性 今年出现的另一个趋势与iPhone应用程序的安全功能有关。 根据2015年Gartner应用程序安全报告,这些应用程序因忽略安全性而臭名昭著。应用程序开发人员现在将做出更多努力来保护数据安全性和用户隐私。 由于云技术的集成,这变得非常重要。 采用这些创新趋势已成为每个应用程序开发公司的必要条件 以便他们可以为客户提供未来解决方案。 那些落后于这些趋势的人可能会迷失,因为他们精通技术,这会增加他们的声誉。 最初发布于: http : //orange-mantra.blogspot.in/2017/03/emerging-trends-in-iphone-app.html

Swift中的单向数据流架构(Redux)

我非常喜欢使用Swift的可重用和干净的架构。 在我的上一个项目中,我实现了MVVM和面向协议的体系结构,这有助于将关注点分开。 我也曾按照MVC方法从事过几个IOS项目。 在开始新项目或适应旧代码的同时选择正确的体系结构很重要。 我必须找到有关iOS体系结构模式的综述,如果您也感兴趣的话,可以介绍常见的体系结构。 iOS架构模式 揭秘MVC,MVP,MVVM和VIPER medium.com 但是有一种更好的方法(以我的拙见)主要是在我的经验中,MVVM在保持轻巧的同时做得很好,并且我确实在Swift中使用MVVM实现了单向数据流(Redux)方法,这产生了巨大的变化。 它使干净的体系结构稍微好一点,健壮且可测试 ,因此很重要 在本文中,我试图解释为什么将Redux与Swift结合使用是更好的主意。 首先,我们需要了解该概念的基础。 因此,让我们开始吧! 什么是Redux和单向数据流? Redux是一种流量实现,但实现略好一些,它使您的应用程序状态更加可预测。 它首先以强大的javascript库React作为JavaScript应用程序的可预测状态容器出现在Javascript世界中。 Redux,仅使应用程序的状态位于单个存储对象中。 因此,从应用程序/视图的生命周期状态触发操作会发生变化,而针对该操作的化简器会生成新状态。 关于Redux的另一种解释,您可以阅读Redux的卡通指南介绍 Redux的卡通简介 导致比Flux更加混乱的一件事是Flux和Redux之间的区别,这种模式以前是… code-cartoons.com 让我们开始; 在本文中,我使用了benjaminencz的ReSwift,后者在Swift上创建了Redux实现。 ReSwift是Swift中单向数据流架构的类似Redux的实现。 ReSwift可帮助您将应用程序组件的三个重要方面分开: 重新浏览参考 ReSwift正在快速发展,超越了核心库,它提供了用于路由和时间旅行的实验性扩展… reswift.github.io 状态:在ReSwift应用中,整个应用状态都明确存储在数据结构中。 这有助于避免复杂的状态管理代码,实现更好的调试,并具有许多其他好处…… 视图:在ReSwift应用程序中,当状态更改时,视图也会更新。 您的视图成为当前应用程序状态的简单可视化。 状态更改:在ReSwift应用中,您只能通过操作执行状态更改。 动作是描述状态变化的小数据。 通过极大地限制状态改变的方式,您的应用程序变得更易于理解,并且可以与许多协作者一起工作。 从ReSwift网站剪辑 用法 在这个简单的示例中,我声明了一个BaseState,因为struct带有两个状态。 BaseReducer已注册其减速器。 LoadingState struct处理显示正在加载微调器视图或隐藏视图的状态 ,是否具有isLoading属性知道当前正在加载? 它是在视图中旋转或在状态中旋转的类型。 然后,声明的LoadingAction具有两个结构, LoadingShowAction将类型传递为有效负载,而LoadingHideAction不包含任何有效负载。 最后,LoadingReducer采取操作( LoadingShowAction或LoadingHideAction )和当前状态,并生成一个新状态。 简单。 因此,此时我们可以调度一个动作,即; store.dispatch(LoadingShowAction(type:.Normal))显示微调器 store.dispatch(LoadingHideAction())隐藏微调框 。 […]

开始在Xamarin中构建增强现实应用程序

为Dootrix工作的最大好处之一就是可以花时间在新技术上工作。 几个月前,我接到了一项激动人心的任务,即构建功能演示程序,以在iOS上使用增强现实技术向新老客户展示。 只是在寻找代码? 本文的源代码在这里🍷 什么是增强现实? 增强现实 ( AR )是物理现实世界环境的直接或间接实时视图,其元素被计算机生成的感知信息“增强” 增强现实应用程序的一个著名示例是Pokemon Go。 此移动应用程序将增强现实技术吸引了成千上万的年轻人。 此应用程序的前提是您可以前往不同的地方,并从字面上捕获移动设备上的Pokemon。 宠物小精灵看起来好像正站在地面上的前方。 然后,您将向上滑动以向其扔Pokeballs。 您如何在iOS中构建增强现实应用程序? 为iOS构建增强现实应用程序的技术被称为ARKit。 ARKit扩展了设备相机的功能,并允许您检测平面并将3D对象添加到虚拟世界中。 在线上的大多数示例向您展示了如何使用Objective-C或Swift进行此操作,但是此演示程序的要求之一是使用Xamarin和.NET进行此操作。 你是如何开始的? 您将需要一些入门知识: 运行macOS的计算机,例如MacBook Mac版Visual Studio 苹果设备(很遗憾,您无法使用模拟器进行测试😅) 您可能遇到的问题 无法部署到您的设备 在Visual Studio for Mac中首次构建项目时,它可能无法部署到设备。 要解决此问题,您需要: 在XCode中创建一个空白应用程序 让它自动为您生成发布配置文件 将其部署到您的设备 之后,您应该可以从VS for Mac deploy部署应用程序了 启动AR会话时,您的应用程序崩溃 这会吸引很多人。 我认识一些开发人员,他们花了一段时间研究为什么他们的应用程序崩溃时,如果他们想查看一切是否正常,却没有有意义的消息。 该解决方案将为您节省大量的时间和挫败感。 一旦知道,它就会被刻在您的大脑中😉 问题是您需要允许权限访问设备上的相机。 因此,您需要修改Info.plist文件并启用“隐私–摄像机使用说明”权限。 使用应用程序请求访问设备相机时将显示的值进行设置。 设置完之后,您的应用程序将不再崩溃。 不客气😎🎉 创建项目 如前所述,您将需要Visual Studio for Mac。 打开它,我们将选择iOS> […]

使用iOS上的设置包制作环境管理器

例如,大多数使用云服务的在线应用程序都需要为开发,Beta测试和生产阶段的不同服务使用不同的环境。 开发人员使用不同的策略,例如使用Plist文件在简单的布尔值或PCH文件中的常量(在Objective-C应用程序上)中的开发或生产之间进行切换。 当我开始从事大型金融应用程序项目时,我注意到与以前从事的大多数项目相比,处理这类事情要复杂一些。 除了诸如开发,认证和生产等原始环境外,后端开发人员团队还创建了一些不同的开发点,以在某些罕见的情况下进行连接以满足特定需求。 这些点可以具有不同的URL和端口,因此移动开发团队需要一种可配置的列表。 使用Plist解决方案似乎是使事情顺利进行的好方法,除了一个非常令人不舒服的原因:在这样的大项目上进行构建可能需要长达10分钟的时间。 如果您只想更改环境,则必须等待很多时间。 我研究了一种新的解决方案,在这里我想分享一种简单而优雅的方法。 它使用“设置捆绑包”机制,使您可以通过iOS设置访问属性并更改首选项,而无需再次运行该应用程序。 该解决方案消除了在编译应用程序以发送到TestFlight或App Store时访问它的可能性。 在此处找到创建的示例项目。 Allanalves /环境管理器-iOS Environment-Manager-iOS –使用“设置捆绑包”简化管理环境的解决方案。 github.com 创建Settings.bundle文件 设置捆绑包文件用于添加UI元素,这些元素用于配置应用程序使用的首选项。 创建项目后,在“资源”部分的“设置捆绑”类型的项目中添加一个新文件。 您可以使用默认名称。 在项目导航器上,展开Settings.bundle文件以查看其文件。 “ en.lproj”文件夹用于本地化字符串,因此您可以完全本地化它。 “ Root.plist”(您可以在此处找到示例文件)包含所有首选项。 在Root.plist文件中,找到标题为“服务器”的组。 有一个多值类型的项目。 在其中,我们可以添加将标题放置在Titles数组中的项目,并且对于Values数组,对于Titles的每个项目,应在Values数组中存在一个具有相应索引的项目。 在这种情况下,我添加了4个项目:生产,认证,开发和自定义。 我们将使用这些值来标识代码中选择的选项。 为URL添加Service.plist文件 有了值列表,我们可以创建一个Plist文件来存储链接到Root.plist上使用的相同值的所有URL。 分开它们可以使修改URL时更干净,更安全(避免输入错误)。 服务助手 使用帮助程序,我们可以识别在首选项上选择的选项,以获取其URL并获取该选项的URL。 从任何类中,您都可以获取首选类型: 隐藏它以释放 启动到App Store时,这种首选项屏幕不太适合使其可见。 为了避免这种情况,您可以使用Shell脚本,添加类型为“运行脚本”的新构建阶段,并粘贴以下代码: Shell脚本,避免在启动存储时显示环境首选项。 该脚本标识当前构建配置是否为Release,以删除Settings.bundle文件。 另一个应用 首选项机制可以通过多种方式促进和加快例行开发和测试,例如自动记录日志或显示测试帐户(当应用程序使用帐户列表进行选择时使用)。

Swift World:设计模式-代理

今天,我们将讨论代理模式。 在这种模式下,代理是一个对象,可以帮助我们访问另一个对象。 它只是将实际工作委托给该对象或更改其行为。 下图描述了角色及其关系。 从代理模式开始— Wikipedia 代理模式在Cocoa中广泛使用,它甚至具有特定的NSProxy类。 另一个示例是UIApperance协议和其他相关类型。 我们将继续使用我们的汽车系统。 protocol Car { func drive () } class Sedan : Car { func drive () { print (“drive a sedan”) } } 自动驾驶汽车现在是热门话题。 因此,让我们构建自己的。 实际上,它不是从头开始构建的,而是通过自动驾驶系统增强了我们当前的汽车。 因此,它具有内部汽车实例,并将驾驶委托给汽车。 但是作为自动驾驶汽车,它会自动控制汽车。 委托和变更是代理在此模式下的工作。 class AutonomousCar : Car { var car: Car init (car: Car ) { self. car = car } […]

iOS Huddle#2

2016年10月26日星期三 iOS Huddle是我们每月在Black Pixel iOS团队的Slack频道中共享的最佳链接的摘要。 从BPXL Craft 如果您错过了它,这是BPXL Craft最近以iOS为中心的系列: iOS上的事件交付:第1部分,第2部分和第3部分 布兰登·亚历山大(Brandon Alexander)完善了活动交付方面的出色系列。 第1部分介绍了触摸事件,命中测试和手势识别器。 第2部分完成了UIResponder中定义的其余事件, 而第3部分则说明目标动作模式。 从水冷却器周围 调试魔术 有时,要找出错误的根本原因可能确实具有挑战性。 幸运的是,我们发现了一些隐藏的宝石,这些宝石可以简化此过程。 Apple提供了有关iOS和macOS的“秘密”调试的技术说明。 只需确保不要使用以下任何一种方法来发布您的应用,因为它们可能会被拒绝。 最近,Shaps出现了很多有用的推文。 使用私有API _viewControllerForAncestor爬上超级视图层次结构以查找父视图控制器。 还要了解如何转储打印功能以美化控制台输出。 可摘枚举 将可保存的选项列表映射到表或选择器视图是一件很麻烦的事情。 为什么不引导您的内部Tom Sawyer并让PickableEnum协议扩展代替您呢? iOS 9中的NSNotificationCenter更改 在对NSNotificationCenter的一个可喜的变化中,基于非块的观察者现在将弱引用归零,因此无需注销它们。 阅读有关这些更改以及调试通知的其他提示。 (要获得加分,请深入研究Mike Ash的记忆,以详细说明为何将弱引用归零很重要。) 先进的Swift运算符 鉴于Swift偏爱安全性,它的算术运算符默认情况下不会溢出,而是会引发错误,这也就不足为奇了。 我们发现Swift有第二套算术运算符,在极少数情况下需要此功能时,它们会溢出。 在Swift文档的Advanced Operators部分中获取详细信息。 应用启动时间慢 用户可能是善变的,而启动缓慢的应用是许多人的祸根。 速度慢的应用也可能会被“应用评论”拒绝。 使用DYLD_PRINT_STATISTICS环境变量可以获取有关加载,绑定,设置和初始化所花费的时间的非常详细的数据。 绘制细线 当视网膜显示器发布时,iOS开发人员和设计师不得不开始不同的想法。 从设计转到代码可能导致意外行为,因为系统将从点转换为像素。 了解如何在设计需要时调整Core Graphics以绘制细线。 一个真正的从不学习C的程序员 对于许多Objective-C开发人员而言,学习C是通过的权利。 威尔·希普利(Wil Shipley)分享了一个有趣的故事,讲述了一个真正的从未学习过C的程序员。 恢复到tvOS 由于焦点引擎的工作方式,为tvOS进行开发需要转变思维。 […]

所有关于Swift中的数组

简介:在iOS开发中,我们每天都使用Array。创建数组的方法有很多。我认为了解Array是什么以及为什么我们可以通过多种方式创建它更重要。在本文中,我将解释什么是array和我们如何通过许多方法创建它以及修改数组中的更新和删除元素。 什么是数组: swift中常见类型的数组。数组可以是Int,String,bool,Class或struct之类的任何时间,也可以是任何类型类似于data type的数据。 示例:如果我们需要存储我们日常购物的5个名称,我们将使用Array来存储以下内容: 这是5个可以这样存储的项目名称。所有通过其索引.index短接的项目都从零到项目数减一。 数组可以是任何类型的元素,例如Int,String,Class,Struct以及Any 数组是Swift中常见的遗传结构类型,用于存储相同类型数据的集合 阵列可变性: 数组可以像var和let一样是可变的或不可变的。如果它的var我们可以更改,则可以更改它。 那么我们如何创建数组: 有很多方法可以创建数组,例如使用默认的初始化程序,带有空元素等。但是Swift是类型安全的语言,在创建数组时我们必须分配类型。将类型提供给swift编译器的两种方法是隐式或显式的。我们将发现所有办法 。 创建空数组: //隐式定义的空数组 let arrayOne = Array ()//隐式定义的空数组 let arrayTwo:Array = Array()//空数组 让arrayThree:[Double] = [] //短于 let arrayFour = [Double]()//短于 我们在这里看到,需要指定类型,因为Array结构是泛型类型: struct Array :RandomAccessCollection,MutableCollection { //确认所有协议方法 //初始化器 //方法 //下标 } 因此,这就是为什么我们需要向Swift Compiler指定什么是Element。 使用初始化程序创建数组: //带有初始化程序的数组 1.let arrayFive = Array([1,3,4,5,6]) //使用数组文字 2.let arraySix = Array(arrayLiteral:1,2,3,4,5) […]

如何在自己的应用程序中使用iOS工具提示菜单

您可能已经在某些Apple的默认应用程序中或在iOS上编辑文本时看到了此工具提示控件。 该工具提示实际上有一个名称UIMenuController ,并且可以自定义并在您自己的应用程序中使用,尽管该API可能很难理解。 成为FirstResponder() 与应用程序具有源自UIWindow的UIView层次结构类似,它也具有UIResponder链,因为视图本质上是响应者。 为了在自定义视图上使用UIMenuController ,该视图必须首先成为应用程序的第一响应者。 在应用程序中,首先接收多种事件的响应者对象称为第一响应者。 它接收关键事件,动作事件和动作消息等。 这并不需要花哨的东西,但是在处理多个UIResponder子类时,了解响应者的层次结构很重要。 尽管UIView基类继承了UIResponder接口,但它不会自动赋予UIView实例成为第一响应者的能力,这就是为什么您只能在UIView子类上调用.becomeFirstResponder() 。 默认情况下,某些iOS控件(如UITextField可以成为第一响应者,但是对于自定义视图,您需要覆盖canBecomeFirstResponder变量。 现在, ResponsiveView任何实例都可以调用.becomeFirstResponder()并成为其超级窗口的第一个响应者,并且由于UIView基类默认将其UIResponder变量canResignFirstResponder为true,因此我们也可以在ResponsiveView上调用.resignFirstResponder() 。 。 UIMenuController 现在我们有了一个自定义视图,可以将其设置为应用程序的第一响应者,让我们在其上显示一个工具提示! UIMenuController具有一个单例实例,您可以在您的应用程序中使用它来轻松地使用多个视图-这样可确保您不会一次显示多个菜单。 请注意,在显示菜单之前,我们必须指定responsiveView View的框架。 这是因为UIMenuController使用此信息将自身适当地放置在窗口中的适当位置。 默认情况下,菜单将显示在第一响应者上方,其箭头指向下方。 您当然可以通过设置箭头方向,指定与第一响应者不同的帧,甚至为目标矩形计算指定不同的超级视图来自定义此行为。 UIMenuItem 在显示菜单之前,我们想要设置一些选项以使其首先显示在菜单中。 例 这是上面的代码示例。 我更喜欢使用minimumPressDuration为0.3的UIMenuController来触发UIMenuController ,因为它模仿了iOS中的默认行为。 如果您对Twitter @sdrzn有任何疑问或想法,请告诉我!

iOS移动架构-第一部分

开发人员使用软件体系结构设置应建立应用程序的模式,项目的整体结构,对象的创建方式以及对象之间的关系建立和维护。 但是为什么这很重要? 软件体系结构很重要,因为它会限制开发人员在其代码中使用某种模式和结构来确保以下各项: 代码干净,模块化,因此可重用 对象的关注点是分离的,这确保了我们不会以“神类”结束一切。 需求变更可以在更少的地方快速完成,从而加快了开发速度。 清单还在不断增加,但是请相信我…良好的体系结构可以节省您的时间! 我会推荐哪种架构? 我提出了一个非常简单的体系结构,这使我开发功能和整个项目变得更加容易,这是MVP模式的产物。 它是如何工作的? 这是有关其工作原理的快速概述。 代码被分成更多的文件, 更小的文件! 将所有代码写入接口,以允许快速更改并提高代码的可测试性。 使用了依赖注入,它并不像听起来那样可怕! —只需将依赖项传递到构造函数中,就很简单。 ViewController只做相同的建议,它们控制视图。 所有其他功能都委托给另一个对象。 ViewControllers中不再有API调用和数据操作! 在ViewControllers中也没有导航。 控制器 (.NET男孩/女孩会将它们称为服务)用于繁重的工作。 例如一个UserController处理用户数据。 将创建一个AppContainer来保存对Controller的单个强引用,并在需要时将其注入 。 没有更多的静态信息 —认真地说,如果您想要可测试的代码,则不要理会这些。 我们需要设置应用程序的流程,以便我们创建Director来为我们处理该流程,例如,EntryDirector会确定是将用户带到登录屏幕还是直接进入应用程序。 如果您喜欢这篇简短的文章,请给它一些鼓掌,如果它引起足够的兴趣,那么我将写一篇关于如何实际实现此模式的文章。