Tag: 移动应用程序开发

简单的Xcode hack可以帮助优化开发人员的生产力。

上述代码摘自我的一个iOS项目,名为“ OptimusPrime”; 这是一个质数计算器,我用作演示项目,用于演讲,研讨会和疯狂测试。 借助我的颜色编码,我一眼就能分辨出以下几点: 系统保留关键字(粉红色) :系统保留关键字不能以任何方式被覆盖,并且如果我们尝试这样做,编译将会失败。 我可能不知道Xcode中的每个系统保留关键字,因此最欢迎使用一种轻松区分它们的方法! Apple拥有的属性,类和函数(青色) 与用户定义的属性,类和函数(柠檬绿) :Apple拥有的和用户定义的对象,属性或函数以完全相同的方式工作,但是由其代码引起的错误是以完全不同的方式解决问题-尤其是因为我们可以修改实现而不是Apple的实现。 因此,有助于在两者之间进行一些定义。 硬编码的数字(紫色)和字符串(红色) :包括我在内的大多数开发人员都同意不惜一切代价避免使用硬编码。 通过为它们提供专用的颜色集,我们也许能够更轻松地发现它们,从而更快地用常量替换它们。 注释(灰色) :注释是代码的说明(或IDE屏幕文档的一部分),但不是编译或处理的实际代码的一部分。 因此,应将它们相应地着色为文件的不必要部分。 属性和框架声明,函数中的属性访问器(白色):当更多关注时,我还可以看到函数调用比属性调用更明亮。 在我的特定情况下,我什至不需要花时间自定义调色板,因为IDE中的默认调色板之一可以满足我的需求和个人喜好。 但是,在以前的Xcode和macOS版本中,我确实必须使用“ Midnight”调板作为基础对其进行自定义: 在自定义方面,由于我的视力无法应付由默认对比度和大屏幕上的小字体引起的疲劳,因此我将柔化各种颜色的对比度并增加字体大小。 对我来说幸运的是,最新的Xcode版本中提供的新的Default(深色)调色板非常合适! 其他视觉元素 在最初的屏幕截图中,您可能已经注意到了其他一些视觉元素。 这些元素虽然与颜色自定义无关,但为我提供了一些我认为在编码时有用的附加信息。 让我们回顾一下! “当前正在编辑”行标记。 源代码编辑器中的当前行被突出显示,从而提供了一种轻松的方式来知道键入时我正在编辑的行。 这也很好地表明了您是否已滚动到编辑范围之外。 行号。 左边距中当前文件行号的存在有多种用途。 首先,在We Are Mobile First上,我们不喜欢大型源文件。 它们很难调试和维护。 正如我们有关健康编码实践的文章中所讨论的那样,我们使用单一责任原则。 如果文件太大,通常意味着我们可以将代码拆分为较小的任务。 通常,我尝试将文件保存在少于150行的代码内(不包括注释)。 其次,调试时查看行号很有用,因为编译器或调试器可能会引用触发错误的代码行。 最后,当使用版本控制工具时,在合并或同行审阅代码时查看行号会很有帮助。 关于版本控制工具的更新。 有些人可能已经注意到某些行中行号旁边的蓝色标记。 这些标记突出显示了相对于我们的版本控制工具中的最后一次提交已更改的代码行。 右垂直边距。 我们在几个项目上使用短绒棉。 我们使用的最常见规则之一是“一行中最多XXX个字符”。 在这种情况下,“ XXX”通常为120。我厌倦了触发编译器警告或错误,因此我将Xcode设置为在一行中的第120个字符处自动添加此垂直边距,因此可以直观地看到该限制。 折叠标记。 行号旁边的代码文件夹使我可以轻松折叠/展开代码段。 结论 在大多数当前的IDE中,具有视觉吸引力的设置很容易实现,但是我还没有看到很多开发人员可以自定义自己的设置。 这似乎很轻浮,但只需要花费五分钟的时间,从而可以帮助您提高视力并改善性能。 […]

移动应用开发公司— Apptunix.com

在Apptunix ,我们的移动应用程序开发公司提供的解决方案不仅有助于解决他们的问题,而且还帮助他们抓住新的商机。 这里的基本区别是标准的执行方式。 我们开发的应用程序不仅可以将您的创新思想转变为现实,而且还可以通过新的机会和更好的业务解决方案来改进老式系统。 另外,在黑色星期五抢享我们的特别优惠 在Medium上关注我 ,成为第一个阅读我的故事的人。

Swift:无条件的可选

您好,我亲爱的开发人员, 在我分享了有关避免重复的无辜帖子之后,iflets和Guards难以理解,隐式的可选选项和强制转换的效果如何,我收到了来自Reddittors社区的大量反馈。 他们中的一些人甚至声称我无能,对其他人不屑一顾,强奸,并呼吁采取种族灭绝行动。 除了那些过分夸张之外,我注意到的是,大多数注释都标记为Optional作为条件语句中使用的实体或该实体,这会导致崩溃。 作为避免重复数据删除使用的语言功能的借口,我听到的另一重要立场是,代码将变得难以理解。 至少我感到有些困惑,因为条件是使用Optionals的最困难和冗长的方式。 这是因为我们在标准库中有大量的功能,这些功能专门用于可选处理。 我什至没有提到SwiftZ,SwiftX之类的工具,它们将本来就很强大的工具变成了真正令人惊奇的东西。 是的,如果您不了解其背后的基础知识,则它们是不可理解的,因为可选处理的方法源自数学。 但这不是避免使用它们的原因,而是学习新知识和改进的原因。 因此,让我们从头开始。 可选 (如果您不知道的话)是类型,它表示有无价值。 就如此容易。 现在,让我们看一下普通开发人员编写的一些常规Swift代码: 免责声明 : 这是概述方法的示例代码,其他代码段也是如此。 请原谅我,我所有的读者,他们确实理解这一点。 我的文章描述的是通用方法,而不是特定的用例,您会为没有多少人感到震惊。 函数的作用很明显,但是我仍然会解释。 您将两个字符作为边界传递,并接收到两个字符之间的范围内的1个字符长的字符串数组。 我在这里写的唯一一本很少使用的是charToUInt ,因为我想避免重复。 charToUInt是用闭包方式编写的典型函数,因为在我看来,使用func声明如此小巧且易于掌握的函数有点过头了。 您可以在我的文章中了解有关这种重复数据删除的更多信息: 没人理会的常见错误– Swift中的一阶函数 您好,我亲爱的开发人员,让我们看一看完全不同的重复案例。 假设我们… blog.idapgroup.com 亲爱的读者,你们中的大多数人都已经编写或看到了这样的代码。 但是您是否曾经想过,您可以改进该代码,使其更具可扩展性,灵活性和短时性? 现在,在我们进行下一步之前,我强烈建议您阅读这篇有关Monad,Functor和Applicatives的出色文章。 尽管我不会在SwiftZ中充分利用本文的所有概念,但是您仍然会帮自己一个忙,因为您肯定会成为更好的SDE。 而且,它将简化阅读我的文章。 作为快速参考: Monad实现func flatMap (f:(T)-> M )-> M ,其中M是Monad,包装一些值T ; 函子实现func map (f:(T)-> T)-> M ,其中F是函子,包装一些值T。 因此,考虑到所有这些知识,让我们看一下如何将这些知识应用于conditionalCharacterStrings : 如果您准备好要发誓,现在是关闭文章并写评论我多么可怕的最佳时机。 其余所有读者必须了解一件重要的事情。 […]

内置于Flex:基于视图的RESTful API

您刚刚发布了最新功能,一切进行得很好,除了要求已更改。 在您的用户界面中,需要将tableview中的所有cityName实例替换为countryName. 如果您使用的端点具有这种灵活性,该怎么办? 如果该端点允许您呈现动态,灵活且受控的服务器端视图,该怎么办? 如果此视图使您可以显示各种类型的对象或更改当前对象的值而不发布新版本的应用程序该怎么办? 好吧,坚持。 这篇文章将向您介绍一种设计模式,以帮助您完成上述所有工作。 灵活性的需求 与移动应用程序相比,在网络上部署更改要快得多,因为没有其他应用程序需要提交和审批。 即使这样,减少部署数量同时仍然能够在移动和Web客户端上进行更改将被认为是成功的选择。 这可以通过提前使端点,数据协定和UI更加抽象的努力来实现。 这种抽象将为您的UI提供更大的灵活性,并让您控制服务器端的业务逻辑,从而可以帮助减少进行这些更改所需的部署。 上面列出的场景并不少见,但是还有其他一些优势可能有助于我们朝着这种设计模式迈进。 这些功能包括: 从服务器更新/重新排列UI元素 运行各种A / B测试版本 避免在App Store审核过程中增加额外的发布时间 将业务逻辑移至服务器并具有单个控制点进行更改 典型到灵活 现在您已经确信了,让我们开始做生意,看看如何实现这一目标。 让我们以一个基本的旅行应用程序为例,该应用程序会根据您的位置向您显示飞往目的地的费用。 此视图的JSON是什么样的? 通常,数据库中会有一个destination表,该表将在端点中传递。 它可能看起来像以下内容: { “目的地”:[{ “ id”:“ 1234567890”, “ city”:“ Los Angeles”, “ state”:“ CA”, “国家”:“美国”, “ background”:“ http://www.example.com/losAngeles.jpg”, “ airportCode”:“ LAX”, “ lat”:“ 165.0987654”, “ lon”:“ 45.3456788”, “ flightPrice”:“ 180” […]

跳过并保存为Apple Watch

今年10月,我将使用了3年的0系列Apple Watch升级到了带有LTE的新3系列,我喜欢它。 我在过去三年中一直佩戴原始手表,并且发现新模型在速度和准确性(尤其是Siri)方面取得了巨大进步。 心率传感器得到了改进,电池寿命也很棒(即使在锻炼和打电话时会受到重击)。 我很被打扰,不得不为此做点事情。 自从发布我的上一款游戏,即用Swift制作的Ultra Dash之后,我便过渡到在Unity中开发所有游戏。 这是有道理的 a)我可以使用多平台 b)关于Unity的支持/教程/帮助太多了 c)它使3D开发非常容易。 但是应用程序与游戏不同,因此我觉得从技术上讲,我并没有违背自己对专注于Unity进行游戏开发的承诺🙂 那么这个程序是什么呢? 它被称为“ 跳过并保存” ( Skip and Save) ,是我习惯于放弃偶尔省钱的习惯而生的,以便以后可以购买更大的东西。 我知道,这是一种狡猾的预算方式,但对我有用。 我认为这将是一个转化为应用程序的好过程,对于Watch来说,这似乎也是完美的选择,因为最好的应用程序是基于有限的交互(不超过几秒钟)而实现的。 构建手表应用 Xcode中的Watch应用开发环境非常好。 布置一个应用程序非常容易,比布置一个iPhone应用程序要容易得多,我以后会发现。 现在,您可以将SpriteKit和SceneKit与常规屏幕混合使用。 当您成功跳过并节省金钱时,我用它来添加股票行情带效果,并在达到目标时为烟花效果增光。 我想尽可能多地使用Watch,所以我增加了Siri语音识别,Scribble支持以及对Watch的所有不同复杂功能的支持。 我还确保手表可以与iPhone版本来回通信。 该应用程序的第一个版本使用强制触摸来访问选项以设置您的储蓄目标并重置进度或撤消跳过。 根据我在其他Watch应用程序上的经验,我发现这非常不直观,并且经常隐藏关键功能。 因此,我尝试使用一个页面应用程序,用户可以滑动到其他页面以查看更多命令。 这在实践中也不是一件好事。 我决定使用一个屏幕应用程序,其中包含一个按钮来显示设置目标,撤消跳过和重置进度的选项,以及另一个信息按钮来显示目标。 我还尝试了一些按钮的图像,并选择了自己的设计和Font Awesome 5集的设计。 构建iPhone应用程序 尽管我非常喜欢Watch,但事实是,仅Watch应用程序的市场仍然很小,因此我需要制作iPhone配套应用程序。 因此,我开始了使用Xcode和界面生成器创建应用程序的有趣任务。 Watch应用的情节提要很棒。 堆栈面板的工作方式很棒,您可以覆盖控件,甚至在视图下添加SpriteKit / SceneKit场景-这使您可以创建一些出色的布局,以简单直观的方式完成出色的工作。 iPhone版本稍微复杂一些。 我无法将SpriteKit和标准视图混合使用,因此不得不依靠Core Animation来创建我以前在SpriteKit中完成的效果。 因此,我无法从制作游戏中获得的知识无法得到应用,这意味着我不得不花时间学习新系统。 我还发现创建响应式视图比在WatchKit中复杂得多,并且在一些简单的事情上苦苦挣扎,例如使堆栈视图内容保持固定大小。 我最终会遇到一堆束缚,必须删除并重新开始。 幸运的是,RayWenderlich.com发布了他们的培训视频的Udemy版本,其中包括涉及我所苦苦挣扎的部分的部分,例如堆栈视图以及如何将键盘与滚动视图一起使用。 我对iPhone应用程序所做的一件事是使用矢量图像而不是png。 它们的效果非常好,所以我回过头来更新了Watch,使其也使用矢量。 原始的iPhone应用程序具有浅色主题设计。 我要求在社交媒体上提供一些反馈,并获得了很好的建议。 […]

如何在Swift中实现自己的Optional Chaining

深入了解.map和.flatMap运算符 自从我开始使用Swift进行编程以来,我不禁在对数组执行各种操作时使用map , reduce , filter等函数。 关于它们的事情是如此令人愉快,以至于我永远不会错过将我通常的数组处理例程变成这些漂亮的函数运算符链的机会。 但是,如果我告诉您可以将这一概念的使用范围扩展到集合类型之外呢? 对于您来说,这可能不是什么大新闻,但您可以将map运算符与Optional类型一起使用。 没有什么比老的“ Hello world”更好地说明编码问题了。 这是一个接受字符串并以“ Hello”为前缀的函数: map用于将可选值转换为另一个值(可能也是不同类型)。 如果可选值中有一个值,那么它将遍历整个转换链。 如果不是,它将继续返回nil 。 简单。 map用于将一个可选值转换为另一个可选值。 nil的行为不会改变,但是对于非nil值,其他所有转换都会增加一层嵌套,例如,您将从.some(T)转到.some(.some(U)) ,然后.some(.some(.some(V)))等。 就像前面的示例一样, flatMap用于将值转换为另一个可选值。 但是,每个新层都被“展平”到当前级别,因此最后只剩下一个Optional对象。 类似于保龄球从车道上掉下来并不断滚滚落下,一旦该值变为nil所有后续转换都将被忽略,并且一直保持nil直到链结束。 希望这可以使您更好地了解这些功能的行为方式以及它们为您带来的好处。 您可能还会注意到,此概念经常针对各种数据类型实现。 例如,一种非常流行的Result类型,广泛用作来自网络请求的值和错误的容器。 许多实现(例如这种实现)也支持map和flatMap功能。 但是,等等,还有更多。 再次查看图片,特别是flatMap部分。 这种行为会让您想起某些事情吗? 执行会沿着可选值的链进行下去,直到成功完成或达到nil为止。 如果您考虑一下,“可选链接”的工作方式完全相同。 因此,必须有一种方法可以仅使用map和flatMap运算符提出我们自己的Optional Chaining实现。 假设我们不使用转换函数,而是要访问某些属性。 从Swift版本4开始,我们可以通过传递属性名称作为函数参数来使用KeyPath语法来访问属性。 然后,我们将使用flatMap读取可选属性并map以访问非可选属性。 为了模仿原始语法,我们将编写一个扩展名并使用最喜欢的某个运算符,即~> 。 扩展名如下所示: 借助方法重写的强大功能,我们在处理普通变量和可选变量时都可以使用相同的方法签名,这将导致语法均匀,因此使用这些运算符的人将不必知道底层的方法。 试试看! 此新运算符可以用作内置链接语法的替代方法。 像这样: 几乎没有区别,您可以互换使用它们! 如您所见,“可选链接”并不是什么魔术,而仅仅是一种语法糖,它是一种机制的糖,您可以使用高阶函数的功能自行实现该机制。 现在,您知道了如何利用map和flatMap来编写更多声明性代码,并且已经准备好处理RxSwift之类的功能范例。 不要忘记Swift是开源的! 如果您想了解更多信息,可以自己研究Optional类型的源代码。 编码愉快!

设置XCODE目标

在开发应用程序时,移动应用程序开发人员最经常遵循标准的开发生命周期模式- 开发,测试和生产。 对于每个阶段,我们都有不同的API环境。 例如,当应用程序处于开发阶段时,它将与development.api.com通信。 测试和生产也都有各自的API环境。 在本文中,我们将讨论如何使用Xcode目标来放置适当的iOS应用构建系统。 为开发,测试和生产创建单独的API环境,将为每个环境提供自己的数据库,代码库和其他各自的后端服务。 即使应用程序处于测试模式,这也使开发人员可以继续工作并进行更改,并确保Beta测试人员不会破坏生产数据库。 我们在项目中创建一个Constants.swift文件,并定义一个名为baseUrl的变量。 在构建用于开发或生产的应用程序时,我们会更改此变量的值,以便在构建中使用相应的API端点,如下所示。 尽管此过程既快速又简单,但是由于以下原因,它也很容易出错: 如果在每个构建环境中必须更改许多变量,则开发人员需要花费更多的精力来注释或取消注释相应的语句。 在此过程中,开发人员很可能会忘记评论或取消评论一个或多个语句,从而导致意外的行为或问题。 然后,他们必须花费时间进行调试以找到罪魁祸首。 为了避免这些问题并创建更完善的构建系统,可以使用Xcode目标。 如果您不熟悉Xcode中的目标,请先阅读此处的内容,然后再继续。 我们将需要为每个API环境创建一个新目标。 从技术上讲,Xcode不允许您创建新目标,因此我们将复制(Cmd + D)默认目标并将其重命名,如下所示。 Xcode将自动为新目标创建一个新方案。 要基于构建目标更改API端点,首先需要设置一个自定义标志。 基于此标志,您的代码可以相应地更新变量。 选择目标→构建设置。 确保选择所有和合并选项。 搜索自定义标志。 在Swift编译器-自定义标志→活动编译条件下,您可以看到Debug并双击 DEBUG值,然后会出现带有+ & -按钮的弹出窗口。 查看下图 双击DEBUG进行编辑,将其更改为DEVELOPMENT。 为什么选择这些设置很重要? 这些设置将影响您的应用在编译时如何使用相应的环境变量。 打开您的Constants.swift并使用如下所示的DEVELOPMENT标志,并相应地设置环境变量(如baseUrl 。 如上所示,您可以定义对于Development , Testing 和 Production应当不同的所有环境变量。 现在,让我们做一个简单的测试来验证基本URL是否根据构建设置进行了更改。 在任何ViewController → viewDidLoad ()方法中编写print()语句以打印baseUrl值。 从工具栏中选择Manage Schemes,将Run → Build configuration设置为Debug 如下所示。 执行该应用程序并检查控制台中的日志。 您应该看到baseUrl 作为https://dev.appitventures.com/api/v1/开发环境端点。 […]

xCode 10中的新增功能

您是否正在寻找开发人员来为世界上最著名的操作系统构建应用程序? 您想成为最佳操作系统背后的架构师吗? 您一定已经猜到我现在在说什么。 本文将介绍xCode,特别是新的xCode 10! 因此,让我们深入研究一下,让我们学习有关新xCode 10的所有知识! 支持的配置: 了解任何新功能的第一个因素是兼容平台。 同样,这是xCode 10正常运行所需的配置; 首先需要一台运行macOS 10.13.4或更高版本的Mac。 xCodes带有适用于iOS 12,watchOS 5,macOS 10.14和tvOS 12的SDK。它能够运行多个并发版本的xCode App和任何相关工具。 xCode 10的迷人之处在于它可以与以前的版本共存 xcode版本。 容易上眼: xCode 10具有一个全新的深色界面,该界面为xCode 10带来了深色模式。可以轻松地从系统偏好设置类别中打开它。 xCode 10还使您能够为macOS创建自己的深色应用程序。 您也可以在明暗视图之间切换。 您还可以在调试时将应用切换为暗模式或从暗模式切换为暗模式。 一般: 现在可以将库的内容从检查器区域的底部移动到覆盖窗口。 该覆盖窗口可以移动和调整大小。 程序被编程为一旦拖动项目就关闭。 现在也可以使用xCode 10将自定义代码段添加到库中。 源代码编辑器中的更改: 现在,可以使用多光标进行编辑,以便您可以一次快速编辑多个代码范围。 由于存在启用源代码控制的项目,因此源代码编辑器会在装订线中显示开发人员所做的更改,并显示尚未拉入项目的其他开发人员所做的更改。 资产目录: xCode 10支持在macOS 10.14及更高版本上通过亮,暗和高对比度外观来单位改变图像和颜色资产。 除此以外,xCode 10还支持CarPlay资产和ARKit 3D ARReferenceObject资产。 构建系统: xCode 10使用了新的构建系统。 新的构建系统提供了更高的可靠性和构建性能,并且可以解决传统构建系统无法解决的项目配置问题。 测试: xCode也相信测试! 它支持并行运行测试,从而减少了运行测试所需的时间。 maOS单元测试以及iOS和tvOS模拟器上的单元和UI测试均支持测试并行化。 […]

2019年和2020年iOS应用开发的十大趋势

繁荣的技术一次又一次地为移动平台带来了新的进步。 物联网,增强现实和虚拟现实是一些未来派概念,无论操作系统如何,它们都会给移动应用程序开发过程带来根本性的变化。 这些概念的集成将帮助开发人员带来具有所需功能的下一代移动应用程序。 在谈论iOS时,苹果公司已经使该平台成为进化和创新的缩影。 如何经历一些会影响iOS应用开发过程的主要趋势? 每年,库比蒂诺公司(Apple)都会在硬件和软件方面进行新的升级。 与这些更新一致,新的iOS版本具有更多改进。 物联网,AR和VR等新兴技术的出现为iOS应用开发开辟了新的可能性。 我们已经在2018年的开发过程中目睹了这些技术的实现。现在,让我们列出iOS的应用程序开发趋势,并展望未来……了解更多

CI / CD di iOS Menggunakan GitLab Runner

可实现CI / CD pada pengembangan aplikasi iOS menggunakan GitLab Runner。 BAB I-彭达卢安 Bagi sebagian 开发人员 , 开发 aplikasi adalah sebuah aktivitas yang memakan waktu dan 资源 。 Bagi sebagian lain,散文建立了 aplikasi adalah waktu yang tepat untuk menghibur diri。 泰塔皮(Tetapi),杨·耶拉斯(Jelas Jelas)散文ini mengurangi waktu pengembangan aplikasi,白杨(belum lagi ketika terjadi kesalahan)扬·迪塞巴坎(oleh)是“ 人为错误 ”。 散文使重复性得以建立 。 开发商 melakukan hal […]