Tag: 应用开发

夏季应用开发

(反射) 今年夏天,通过“芝加哥一个夏天” , “午夜敲门”和芝加哥公立学校的CS4All ,该市的几名15至19岁的年轻人有机会从事应用程序开发工作。 支付给学生的费用是学习计算机编程,开发应用程序,然后将该应用程序上载到位于城市西南侧Gage Park高中的iPad或iPhone。 在整个叙述中,夏季工作的年轻人被描述为青年和学生,而员工则被描述为教师和教员,因为员工和老板所扮演的学习量往往比老师和老板的经历大得多。学生。 Swift和Xcode 苹果公司开发了自己的编程语言,称为Swift。 (https://developer.apple.com/swift/)学生学习了Swift,以及如何使用名为Xcode的Apple程序进行编码和编程。 苹果公司还开发了完整的课程表,他们称之为“每个人都可以编码(https://www.apple.com/ae/education/everyone-can-code/) ”,以使学生通过自己称之为的东西接触Swift一个游乐场。 在这种环境下,将指导学生学习一些编码概念,例如变量,常量,函数等,尤其是它们在Xcode中的工作方式。 还指导学生完成多项任务,例如创建 学生创建的应用程序是使用Swift在Xcode内开发的。 学生和教职员工 我们是谁? 我们是谁 谁参与了该计划? 二十名学生大部分来自Gage Park高中,周边的Englewood社区或更南端的学生,还有几名来自城市西侧的学生。 学生主要是非裔美国人以及三名拉丁裔学生。 在初步调查中,大约三分之一的学生以前从未做过编码。 一些人在可汗学院学习过JavaScript。 大多数人在以前的编码课程中只真正完成过Photoshop。 不用说,所有的学生都完全不熟悉Swift和Xcode,但是他们都对学习特别是与应用程序开发有关的学习感到非常兴奋。 每个人都想制作一个应用程序,进入应用程序商店并开始赚钱,或者他们一直说:“赚钱!” 该程序有两名讲师,可在出现故障排除需求时为学生提供帮助,并帮助学生浏览Apple的课程。 他们的任务是确保学生在遇到很多困难或混乱时能够解决问题并坚持不懈。 他们还必须想出办法,使这些材料更具吸引力并易于使用,特别是对于那些以前从未做过编码或要求大量阅读的学生来说,是必不可少的。 讲师发现了诸如Code.org之类的程序,该程序在CPS和全球范围内也广泛使用,以使青年人在不太繁重的文本环境下进行编码。 讲师还提供了有关演讲最佳实践的指导,并定期围绕工作场所礼仪问题提供咨询服务。 青年和工作人员一起工作了七个星期,目标是在计划结束时展示一些应用程序。 创建了一个小型数字社区,以通过应用程序开发解决现实世界中的问题。 入门 为便于教学,并跟踪日常活动和任务,创建了一个网站“ Summer App Development” (tinyurl.com/sumappdev) 。 在@summerappdev句柄下创建了一个Twitter帐户(https://twitter.com/summerappdev) ,以突出显示并跟踪我们在七个星期内的活动。 进行了初步调查(https://goo.gl/forms/Q2CtUuvPw85kKMmh2) ,以了解学生从一开始就在哪里使用编码和技术。 从这项调查中,我们发现大约三分之一的人以前从未做过任何编码。 最初的调查帮助我们意识到,在没有任何背景经验的情况下,学生将无法直接进入Xcode并使用Swift。 然后向该青年提供了Code.org的帐户。 成对学习时,学生在“加速课程”中进行配对编码 。 不久,学生开始创建循环,函数,然后将循环和函数嵌套在循环和函数中。 在此应简要说明设置。 学生可以使用iMac台式机和MacBook Pro笔记本电脑。 […]

在本地原生共享库扩展

共享扩展名:React Native和Redux。 他在西班牙干草堆上进行了现场勘查,并在西班牙的埃斯巴萨和西班牙的萨尔瓦多省的萨洛尔河之间进行了考察。 分享到以下内容:扩展名:无限制的扩展名:没有必要的扩展名: ¡阿斯奎·瓦莫斯你好! 从根本上讲,Remote Persist(empleando como storage AsyncStorage )和Obtiene Toda laInformationación中立语言是什么意思,重要的是store和其他store 。 Apple的Android操作系统保护功能可扩展到Android设备上的共享库扩展名,适用于Apple sistemas,Apple Bi estEstéculovoy和ceñirmetan solo al sistema操作Apple的扩展名zh-cn上的Androidescribiréuna segunda parte contando los pasos)。 诺塔 iOS las extensions(tanto las denominadas Share como las Action)上的Antes de comenzar es Importante destacar quesséparados,por a que no tienen acceso la carpetaprinciple laaplicación,es decirs es losdecurséscom的儿子tratadas como contenedores […]

2019年构建出色iPhone应用程序的分步过程

在本文中,您将学习MindSea团队逐步实现iPhone应用程序的过程。 没错-我们正在拉开窗帘! 这是我们今天将指导您的三步过程: 步骤1:开始制定行动应用程式策略 第2步:规划应用的UX(在编写代码之前) 步骤3:建立产品路线图 但是在我们开始深入研究之前,我们必须回答一个问题: 你为什么要听我们怎么说? 在过去的十年中,我们一直在为B2B和B2C品牌(SaaS公司,新闻媒体等)构建移动应用程序。 我们构建的应用已被数百万用户下载。 我们已经与Proposify等SaaS公司合作: 像Adam这样的B2C品牌可以帮助: 和国家邮政等新闻媒体: 我们所有移动应用程序项目中的一个常数是什么? 我们的三步过程。 我们使用称为移动应用程序蓝图的分步过程来构建这些应用程序以及许多其他成功的iPhone应用程序。 因此,让我们开始吧! 步骤1:开始制定行动应用程式策略 如果要构建成功的移动应用程序,则必须从战略入手。 在实际编写一行代码或构建第一个线框之前,您需要知道您要构建的内容以及原因。 在此步骤中,需要重点注意三点: 为您的移动应用建立主要目标 在进入开发过程之前,请先退后一步,确定您实际上在尝试通过移动应用程序实现的目标。 如果您一开始没有设定目标,那么剩下的过程将毫无目标-您将不知道自己是否朝着正确的方向前进。 确定您的目标受众-并且要具体! 产品市场契合度很高。 您以前听过这句话: “如果您想成为所有人的一切,那么您将一无所有。” 在计划移动应用程序时,请确保您不打算针对大众。 定义您的受众群体,不要太宽泛。 但是也不要在另一个方向上走得太远。 如果您定位的受众群体太小,从长远来看,您不会看到正的投资回报率。 只创造值得创造的东西 有想法是件好事—毕竟,这就是引导您构建应用程序的原因。 但… 太多的想法(和太多的功能)可能会使您拥有一个移动应用程序,该应用程序执行很多操作,而它们却做得很差。 如何避免这种情况? 专注于需求。 观众需要从您的移动应用程序中获得什么? 它应该提供什么功能? 它应该解决什么问题? 必须包括哪些功能? 立即执行工作,以避免以后必须重建整个应用程序时进行两倍的工作。 请记住:第一次迭代不一定是唯一的迭代,因此不要尝试将所有内容都放入您的第一次构建中。 第2步:规划应用的UX(在编写代码之前) 现在您知道了您的目标是什么,需要包括哪些功能,下一步就是编写代码,对吗? 没那么快。 在 编写一行代码之前…… …您需要确定应用程序的工作方式以及用户的旅程。 然后,您必须进行全部测试。 这是我们的方法: 逐个屏幕概述用户旅程 构建移动应用程序最重要的步骤之一是: 规划人们实际使用该应用程序的方式。 […]

iOS自动化测试:并行运行测试

如何通过在物理设备和模拟器上并行运行来减少测试执行时间? 如何使用屏幕截图生成测试报告并通过命令行界面运行测试? 阅读本文以了解答案。 Xcode UI测试简介 本文是5月6日我文章的延伸,我们在那里学习了如何为您的项目设置XCUI框架并开始使用Swift编写Xcode UI测试。 进行检查以使您对该主题更加熟悉。 Fastlane工具入门 Fastlane是功能强大的开源工具,将帮助我们通过命令行界面执行测试,以及为我们提供测试,构建,签名和部署库的集合。 首先,我们需要安装它们: 打开终端 执行[sudo] gem install fastlane -NV 导航到您的项目目录并运行fastlane init 输入4以选择手动设置 等待安装完成 现在,我们已经安装了Fastlane工具。 您的项目中应该具有创建了Appfile和Fastfile fastlane目录。 通过命令行执行测试 为了在Continuous Integration Server上运行测试,我们需要通过命令行界面执行它。 此任务有多种方法,在本教程中,我们将使用Fastlane Scan操作。 让我们进行设置: 导航到创建的fastlane目录cd fastlane/ 在文本编辑器(例如Atom)中打开Fastfile 根据您的项目方案名称设置方案 指定测试设备 车道:test do 扫描( 方案:“ BoardBank”,#项目方案名称 clean:true,#测试执行前清理项目文件夹 设备:“ iPhone 8”#用于测试的模拟器 ) 结束 恭喜,我们已经成功配置了项目以执行测试,而Fastlane工具将为我们完成其余工作。 要运行测试: 执行快速fastlane test 等待测试执行 您将在fastlane/test_output目录中找到生成的HTML和Junit报告。 改善测试报告 Fastlane仅允许生成简单的测试报告,其中不包括屏幕截图和设备日志。 […]

使用VIPER模式进行iOS开发的干净架构

当开始一个iOS项目时,开发人员除了要达到应用程序的目的之外,还将首先关注的障碍之一是,他们需要的Cocoapods将是如何组织代码,以及可能遵循的设计模式。 尽管大多数开发人员会坚持使用久经考验的真正的MVC(模型-视图-控制器)或MVVM(模型-视图-视图模型),但是有一种聪明的模式称为VIPER,许多人都不知道。 VIPER可能会改变您习惯用于iOS平台的开发方式,并且像大多数事物一样,它具有积极和消极的作用。 通常的嫌疑 首次开始iOS开发时,开发人员将听到很多有关MVC或Model-View-Controller的信息。 这种Apple认可的架构模式随处可见,包括Apple的UIKit,大多数教程示例应用程序以及当今App Store上的大多数应用程序。 顾名思义,MVC分为三个职责: 模型:应用程序的数据和操纵该数据的逻辑。 视图:用户操作的用户界面。 控制器:控制模型和视图之间的逻辑。 如果您正在开发第一个应用程序或在一个小型团队中工作,那么MVC可以很好地工作,但是随着应用程序的发展,开发人员开始开玩笑地将MVC称为“大型视图控制器”。随着时间的流逝,越来越多逻辑被推到控制器中,控制器变得becomes肿且不可测试。 这就是VIPER模式试图解决的问题。 什么是VIPER? VIPER模式是一种遵循单一职责原则的干净架构。 VIPER努力将应用程序的逻辑划分为不同的责任层。 与MVC相比,VIPER更进一步,它分为五个职责: 视图:显示来自演示者的信息,并将用户交互发送回演示者。 交互者:检索实体,并包含特定用例的业务逻辑。 它们与视图无关,可以由一个或多个演示者使用。 演示者:处理为显示准备的内容并拦截用户交互。 实体:简单的数据模型对象。 路由器:处理应显示哪些屏幕以及何时显示的导航逻辑。 实施VIPER时,每个功能或模块都将遵循上述结构。 由于该应用程序的逻辑将分为多个较小的组件,因此视图现在变得更明亮,逻辑也变得更具可测试性。 VIPER的流程 VIPER的基本流程非常简单。 路由器将用户带到新的视图,该视图通知演示者它需要数据,演示者向交互器询问数据,交互器检索实体(从网络请求或本地数据库),交互器将实体发送到演示者,演示者从实体创建视图模型,演示者将视图模型发送到视图,然后视图向用户显示必要的数据。 实施VIPER 为了演示以VIPER模式创建模块,让我们假设我们正在创建一个显示汽车表的应用程序。 每个单元格都会显示汽车的品牌和型号。 用户将能够点击一个单元格并查看汽车的详细信息,或者他们可以单击“创建新汽车”按钮将新汽车添加到列表中。 实施新模块时,我发现自下而上的工作会更容易,因此我们将从定义实体开始。 实体 由于该应用程序正在处理汽车,因此让我们创建一个简单的struct对象,该对象将包含一些基本信息: car对象。 car对象是我们的API服务将返回给我们的东西。 它包含基本信息,例如汽车的ID,品牌,型号和内饰。 但是,当我们要显示有关汽车的信息时,由于表格单元格仅需要显示汽车的制造商和型号,因此不需要包括所有信息。 因此,我们可以创建一个快速视图模型来仅代表汽车的制造商和模型。 快速视图模型将在Presenter中创建,并传递回View。 互动者 现在我们的实体已经建立,让我们为其创建业务逻辑或“用例”。 我们的表格视图将需要使用API​​服务中的汽车填充。 因此,我们将创建一个Interactor,用于处理从API检索汽车并将其发送到Presenter。 为此,我们声明了一个名为getCars的协议方法,该方法将使用我们的API服务获取汽车并将其返回。 由于我们的应用程序非常简单,因此我们不需要其他用例(尽管大多数实际应用程序都有多个用例)。 主持人 有了Interactor,我们现在有了一种方法来检索最终将要显示的汽车。 如前所述,演示者负责对用户的输入做出反应并为显示准备内容。 我们的应用程序描述中提到需要显示汽车(制造商和型号),显示汽车详细信息的能力以及创建新汽车并将其添加到表格中的能力。 接下来,我们将创建一个Presenter,使我们能够做到这一点。 为了展示汽车,我们添加了showCars方法,该方法使用我们先前创建的Interactor检索汽车,然后从这些对象创建简单的视图模型,这些对象将用于视图中特定类型的单元格。 接下来的两个方法showCarDetail和showCreateCarScreen将使用Router(将在下面创建)来将用户导航到正确的屏幕。 我们的视图将使用以下三种方法来启用功能。 […]

让您的应用讲述您的故事

2017年9月1日 我们刚刚将iOS应用的新更新发送到App Store。 这是一个大版本,其中包含Content Extensions,iOS 11兼容性和许多技术改进。 内容扩展:讲述您的品牌故事 如您所知,品牌营销完全是讲故事。 当然,品牌商希望将这些故事告诉最好的客户:下载您应用程序的客户。 我们新的Content Extensions可以轻松地将品牌内容添加到与您的产品和类别无缝集成的应用程序中。 客户在您创建并添加到应用程序的网页上阅读您的故事。 并且,当您在这些页面上列出产品或类别时,这些产品或类别将在该内容的顶部无缝打开。 去年,我们已经在阿姆斯特丹的Scotch&Soda的Misguiding Guide进行了试点。 可能的新内容扩展的一些示例: Marlies Dekkers:在网页上发布了她的新“ Signature Collection”,其中包含个人YouTube视频和产品背后的设计思想。 介绍了实际产品。 现在,Marlies Dekkers团队可以将该内容添加到应用程序中,当客户阅读并点击产品时,本机产品详细信息视图即被加载到故事的顶部。 碎片:为Muuto品牌创建品牌页面。 该页面讲述了品牌背后的设计愿景,并列出了其顶级产品和产品类别。 同样,此页面现在可以轻松添加到应用程序中,而点击Muuto类别的客户将直接进入本机类别视图。 可能性是无止境。 最好的部分是,您可以很容易地将现有内容适应应用程序,并且可以独立于Highstreet常规版本进行操作。 今天,我们正在为所有客户提供此功能。 iOS 11兼容性 在不到两周的时间里,iOS 11将对所有Apple用户可用。 在我们以前的博客文章中,我们已经向您展示了期望的内容(例如,重新设计的App Store,AR购物等等)。 在此版本中,我们确保这些应用程序与iOS 11完全兼容。 技术改进: 解决了隐藏帐户编辑中“状态”字段时显示额外分隔符的问题。 从细节视图到另一个细节视图上的关联产品列表的改进动画。 修复了Peek Pop内存泄漏。 修复了在加载新内容之前在Web视图中可见旧内容(HTML)的问题。 某些品牌外观书中改进的产品单元:该单元现在使用了不同大小的上下文,从而导致更小的注释(仅适用于iPhone)。 修复了“重置密码”按钮。 修复了iOS键盘覆盖iOS 11上的输入字段的问题。 更多即将推出 我们每几周发布一次平台的新更新。 随时关注我们的博客以保持最新状态。

将SOLID应用于UIApplicationDelegate

作为iOS开发人员,您一定熟悉AppDelegate类及其遵循的协议。 那是一切*开始并有时结束的地方。 App委托托管了大量有用的方法和回调。 与您应用的生命周期,后台传输,后台获取或连续性相关的所有内容。 更不用说用户和远程通知了。 确实功能强大,但是……对于一个很小的班级来说,这不是太多吗? 那么单一负责原则呢? 它只有一个改变的理由吗? 当您的应用程序增长时,您会添加更多服务,例如社交登录,分析,崩溃报告。 所有这些好东西都有它们自己的库,当然需要在AppDelegate中进行设置。 这就是您的代表开始看起来和闻起来像一些旧的意大利细面条代码的地步。 对于我的一些旧AppDelegates增长了多少行,我将不为您提供令人尴尬的细节。 不要误会我的意思。 Apple Cocoa上存在的代表模式非常好,而且一定会成功。 但是,这是一对一的关系,显然不适合这种情况。 如何将代表变成更适合这份工作的代表? 这就是我最喜欢的一对多设计模式之一,即观察员。 让我们尝试一下。 将此数组作为实例变量添加到您的AppDelegate。 私人 var观察者:[UIApplicationDelegate]? 现在,在需要转发给观察者的每个委托方法中,添加此简单循环。 func 应用程序 ( _应用程序:UIApplication, didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any]?)->布尔{ 观察者?.forEach { _ = $ 0.application?(应用程序,didFinishLaunchingWithOptions:launchOptions) } 返回 真 } 而且…就是这样。 您(可能)永远不会再触摸AppDelegate。 太好了,但是我需要在AppDelegate中设置的新炫酷服务呢? 让我们设置Firebase。 导入UIKit 导入Firebase FirebaseObserver类 :NSObject,UIApplicationDelegate { func应用程序 (_应用程序:UIApplication, didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:任何]? = nil)->布尔{ FirebaseApp.configure() […]

沙发2018:年度回顾

我于2017年11月发布了Sofa 2.0。此后,我一直专注于理解和创造产品的核心体验。 在整个2018年,我已经发布了更新,进行了研究并介绍了许多新功能。 我认为回顾一下2018年取得的成就可能会很有趣。 我也很幸运今年也去了WWDC。 我为之工作的公司Think Company对每位员工都有一份培训预算,我可以在这次旅行中使用该预算。 我永远感激不已 我通常不是喜欢开会的人。 闲聊的人群很多。 WWDC根本不是那样。 我经历了一个非常真实的“这些是我的人民”时刻。 我从会议上学到了很多东西,并与Apple工程师,设计师和App Store人士进行了交谈。 再次,我很幸运能经历到这一点。 如果有机会,那就去做。 沙发不是我的专职演出。 我在Think Company担任高级体验设计师。 平衡全职工作,这个项目有时会很棘手。 在过去的一年中,我发现了一个对我,我的妻子和猫都适用的系统。 要知道的一件事是我是一个工作狂。 不受限制,我将把自己的空闲时间用在工作上。 这不好,实际上是我创建沙发的背后驱动力之一。 我不想工作主宰我的生活。 我妻子的想法是“工作之夜”。 每个星期一和星期三晚上,我每天都要花很多时间在沙发上工作。 我可以利用这段时间来研究新功能,市场营销,思考,研究以及撰写这样的博客文章。 工作之夜使我与妻子在一起花费的时间更多,疲倦,心情更好,实际上我也做了很多事情。 您花在某件事上的小时数不一定能改善结果。 我发现工作之夜的限制使我可以专注于正确的事情。 Sofa 2.0最初是一个免费应用程序。 对此没有任何深入的思考。 我只是想运送并让人们使用它。 只是在运输热潮之后,我才开始更深入地思考如何赚钱。 如您所知,有很多方法可以从应用程序中赚钱:预付费,订阅,应用程序购买,广告等。在考虑这些选项时,我在权衡实施的可行性和努力程度之间取得了平衡。 考虑到它易于解释和实施,我从付费的前期应用开始。 2月份,我将沙发的价格从免费更改为4.99美元。 在沙发是付费应用的六个月中,我学到了一些东西: 对于应用程序,4.99美元的价格被认为“昂贵” 即使有人对沙发真正感兴趣,价格也立即将他们拒之门外 甚至朋友和家人都不愿意向我收取费用。 这很自相矛盾,因为他们希望我成功,但发现5美元的投资太多了。 付费的预付款没有用,六个月后我的收入不足$ 150。 是时候做出改变了。 八月份,我将Sofa改回了免费应用。 我有其他赚钱的想法和计划,但核心应用很可能会保持免费。 2018年的重点是了解和构建沙发的核心体验。 2019年将专注于加倍理解。 什么是核心经验? 人们雇用Sofa的主要工作是收集有关如何度过停机时间的想法。 如果我们将其变成一个即将完成的工作故事或“工作故事”,它将看起来像这样: 当我遇到一种花费我的停机时间的方法时,我想抓住它,这样我就可以记住以后会喜欢它。 […]

带有快速枚举的简单音乐音调值

我从事的乐器应用程序通常包含音乐理论部分。 这可能是一个简单的大尺度或更复杂的算法。 通常,我最终只使用MIDI音符编号来获取音高值。 结果最终看起来像: let cMajor = [48, 50, 52, 53, 55, 57, 59] 我决定做一些工作来制作一个可以在项目中重复使用的简单模式,以使代码更易于阅读。 代码很短,所以我将从此开始: enum Pitch: Int { case C = 0, Cs, D, Ds, E, F, Fs, G, Gs, A, As, B } 现在我可以写: let cMajor :[Pitch] = [.C,.D,.E,.F,.G,.A,.B] [Pitch]的显式类型允许我只键入.G而不是Pitch.G ,我认为它看起来更好。 概念 理想情况下,我将能够将音高作为偶然的音符名称来编写。 这些值看起来就像C♯或D♭ 。 这些值将是类型安全的,并且像原始类型一样起作用,如果我错误地输入了假间距,则会导致编译器抛出错误。 设计决策 当我经历一些选择时,我意识到我将不得不做出一些妥协。 没有Unicode意外情况: ♯和♭不在Swift支持的Unicode范围内。 有替代符号,但默认字体未包含这些替代符号,因此代码可移植性成为一个问题。 我为竖琴选择了一个简单s后缀。 […]

嘿,Siri,我的下一趟电车是几点?

自WWDC以来已经过去了两个星期,我们中的许多人都在尝试iOS 12的新API。到目前为止,对我来说最有趣的是Siri Shortcuts 。 通过快捷方式,您可以使用新的Siri Intents API将应用程序的主要操作公开给Siri。 在本文中,我将向您展示如何为我的应用《电车时代》实现它。 意图定义文件 输入意图的标题和描述。 您可以在此处决定是否要让用户确认意图(对订单有用)。 定义要在意图中使用的参数 。 在这里,我选择了工作站的自定义模型类型。 这是用户要查看其电车时刻的车站。 如果您有多个参数,则可以定义以下支持的组合。 然后,您可以定义意图的标题和副标题 ; 当Siri建议您使用快捷方式时,这些信息将显示给用户。 如果您的操作可以在后台运行,则需要选中“支持后台执行”选项。 定义了意图之后,您需要在Target成员资格中选择选项,以使Xcode为您生成您的意图类。 现在,您可以在设置的Siri&Search页面中为此快捷方式添加自定义短语。 在iOS12 beta 1中,它似乎对我不起作用; 我必须等待beta 2才能保存快捷方式短语。 用户遵循您的快捷方式后,您将需要在应用程序委托中对其进行处理。 在第一部分中,我向您展示了如何使用新的Siri Intents API。 在下一篇文章中,我将展示如何使用Intent Extensions和Custom Intent Responses来以Siri内联方式响应用户。 在这里查看我的完整实现: 小熊90 / TFGMLive 通过在GitHub上创建一个帐户为TFGMLive开发做出贡献。 github.com 我仍将继续进行整理,并使用Siri表盘进行更多工作。 谢谢阅读! 如果您受到启发,这里有一些有用的链接,可帮助您在遇到困难时提供帮助: Siri快捷方式简介– WWDC 2018 –视频– Apple Developer Siri快捷方式是iOS 12中的一项强大新功能,可让您的应用向Siri公开其功能。 这个… developer.apple.com 通过快捷方式加速应用程序交互 […]