Tag: api

增强现实(AR)iOS应用开发

对于我们在Makers Academy的最终项目,我们的团队提出了一个想法,即创建一个用于检测空气污染水平的增强现实应用程序。 基本思想是学习一种新语言和新技术,这促使我们在第一天进行探索,看看是否更适合开发增强现实应用程序的Android Studio或Xcode。 由于Cindy和我都是Android Phone的忠实用户,因此我们在Android Studio上开发了一个演示Android App。 作为iOS用户的Noelle和Somayeh使用Xcode开发了演示iOS应用程序。 事实证明,Xcode拥有ARKit,可将数字对象和信息与您周围的环境融合在一起,使应用程序远远超出屏幕范围,并释放它们以全新的方式与现实世界进行交互。 第2天,我非常兴奋能在Xcode中对ARKit进行更多的探索,并开始在Xcode中构建我的第一个AR App,它看起来像这样。 我对第一个AR演示应用程序感到非常满意,然后用3D Globe替换了它,为此我基本上在项目中更新了View Controller文件以显示Globe。 当我们进入第3天时,我们对MVP有了一个更好的了解,并且对Xcode中的ARKit有深入的了解。 当我们遵循Makers的测试驱动开发(TDD)时,第3天更多地是要弄清楚Xcode中的单元测试和UI测试。 经过一些研究发现,Xcode具有内置的测试框架XCTest。 我在Xcode上找到了一个有关FizzBu​​zz测试的非常有用的博客,然后继续为iOS构建FizzBu​​zz游戏,以便在Swift中练习TDD。 Swift 3中的TDD入门 已针对SWIFT 3和XCODE 8更新 通过上面的博客可以帮助我理解XCTest框架的基础。 我们的MVP包括拥有AR iOS应用程序,该应用程序可以检测给定GPS坐标下的空气污染水平。 基本上,我们计划通过添加不同的表情符号以显示不同程度的污染,将有趣的元素引入我们的应用程序。 我将在我即将发布的博客中向您发布有关我们项目进度的信息。

如何构建iOS消息传递应用程序:第3部分,标签栏控制器

SendBird的第三篇教程将带您逐步构建用于消息传递应用程序的开放频道,组频道和设置的选项卡栏控制器。 如何构建iOS消息传递应用程序:第3部分,标签栏控制器 在本文中,您将在… blog.sendbird.com 上连接到SendBird后,学习如何实现标签栏控制器。 如果您错过了SendBird的前两个教程,请在这里找到它们: 如何为iOS Messaging应用程序构建自定义UI,第2部分 本教程将引导您完成为iOS消息传递应用程序构建自定义UI所需的步骤。 它修改了… blog.sendbird.com 如何构建iOS消息传递应用程序:第1部分–基本登录视图 本文为iOS消息传递应用程序实现了用户界面,并开发了功能来支持与…的消息传递 。blog.sendbird.com – 对建立聊天和消息传递狂喜不已? 我们也是! 给我们发送消息,给我们留下评论,申请工作! 如果您有兴趣阅读SendBird上的更多文章,可以查看我们的博客,并在Twitter和Facebook上关注我们。 并且,如果您发现自己对阅读的内容感到不满,请在下面给我们一些掌声。 我们都喜欢鼓励。

内置于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” […]

Swift中的函数命名

在本文中,我们将面临一个问题,即编写函数时应始终问自己: 我应该如何命名这个功能? 尽管这个问题看起来很简单,但正确回答它却决定了我们作为软件开发人员的职业生涯中至关重要的方面。 正如我们将看到的,它使我们的代码库更清洁,更易于使用。 如果要使用第三方库中的函数,那么可以说创建了精美标签,您会发现以下两个选项: // 一种 静态函数makeLabel(withTitle标题:String)-> FancyLabel // B 静态函数configure(_ text:String)-> FancyLabel 您会更喜欢哪一个? A还是B? 如果您仍在犹豫,我会给您一个线索:常识也使我想到了选项A。 那么为什么选择A? 首先,让我们分析一下为什么B不那么好:选项B不能告诉我们我们到底在配置什么。 它是否存在? 它会创建一个新的吗? 它会返回新事物吗? 它也没有告诉我们它期望的String的含义是什么。 我们可以事先告诉我们的是,它接收一个String并返回一个FancyLabel ,但我们FancyLabel知道它的作用。 存在歧义和缺乏信息,这是我们应该避免的事情。 另一方面,选项A 对于这三件事完全是明确的 : 工作需要什么 -标题 它的作用 *- 使其成为标签 结果如何 – 创建的标签 *我们关心它做什么 (或应该做什么),而不是它如何做那件事。 我们不在乎函数的内部工作原理。 封装就是这样工作的。 仅需清楚这三点, 就可以很自然地使用此函数,因为这样我们就可以毫无误解地知道函数的作用。 就这么简单。 当我们看一下这些函数的调用方式时,将会更加清楚: let labelA = FancyLabel.makeLabel(withTitle:“ Hello world”)// clearlet labelB = FancyLabel.configure(“ […]

可编码—改进解码JSON的4种方法

Swift 4中引入的Codable提供了一种方便,轻松的方式来编码和解码JSON。 但是,并不是所有的东西都开箱即用。 Swift 4中引入的Codable提供了一种方便,轻松的方式来编码和解码JSON。 但是,并不是所有的东西都开箱即用。 例如,让我们看一下Twitter中的JSON文件。 作为JSON解码器工作方式的结果,我们看到: 引用和标准推文使用相似但不完全相同的字段。 转换为属性名称的键不遵循Swift约定。 日期不是采用标准的接受格式。 颜色的格式不受任何Color类 (UIColor,NSColor等)接受。 因此,我们将学习如何为某些特殊情况设置您的Codable类型。 具体来说,我们将研究: 对可编码类型使用协议 不同的属性名称和键 属性值中的日期 自定义类型的属性值 要继续学习,您可以在GitHub上查看本文的Xcode游乐场。 JSONDecoder的工作方式 这些是JSONDecoder如何将JSON转换为结构化类型的基本规则: 属性名称按原样转换。 默认情况下,简单属性值将转换为String , Int或Double 遵循正确格式的属性值可以解码为URL , Data或Date 。 任何属性值都可以认为是Optional 方括号[]值将转换为Array 花括号{}值将转换为Dictionary或自定义类型。 所有需要解码的类型都需要实现Decodable协议。 同样,需要编码的类型需要实现可编码协议。 如果需要同时对类型进行解码和编码,则可以简单地实现Codable。 在这种情况下,我们将查看为一条推文返回的Twitter JSON数据。 因此, 我们要做的第一件事就是为每种返回的数据类型创建一些基本结构 。 结果,您可以在仓库的此分支上查看解码工作的第一步。 即使数据相似,我们也会创建单独的结构以提供更大的灵活性。 但是,这并不意味着我们不能使用协议来简化功能中这些类型的使用。 将协议与可编码一起使用 例如,在Twitter API中,始终使用tweet的概念。 举例来说,他们的JSON有一条主推文和一条引号 。 因此,可能倾向于对两者使用相同的结构。 但是,更好的方法是两个单独的结构: public struct Tweet:可编码{ public […]

设置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/开发环境端点。 […]

在API级别应包括测试自动化的3个原因

质量保证和测试变得无懈可击,尤其是在API测试的情况下。 开发团队可以从API级别的自动化集成测试中受益,因为它可以帮助他们轻松集成应用程序并提高产品采用率,最终帮助公司提高利润。 在开发和执行自动化测试时,经常会忽略API层,并且大多数情况下会执行端到端用户界面驱动的测试,以检查集成后最终应用程序是否正常运行。 API层不容忽视,为了使质量保证策略成功,它应该将API测试视为整体测试策略的基本组成部分。 让我们了解一下API测试的含义: 应用程序编程接口(API)是一组程序,它们允许两个或多个软件相互通信并能够顺利交换数据。 在测试领域,测试API与其他类型的测试不同。 UI和功能测试通常被重视,而API测试则被忽略。 测试人员的首要责任是通过验证应用程序,系统,数据库和网络之间的交换和通信,确保执行API测试,以实现不同数据驱动的应用程序和系统的无缝功能,性能和可靠性。 自集成测试诞生以来,它一直是测试自动化金字塔的组成部分,但它也是功能测试自动化中受破坏最大的一层。 通常,所有超出单个单元范围并且不能被单元测试覆盖的测试都是通过用户界面驱动的端到端测试场景执行的。 但是,虽然端到端测试可以看作是最终的集成测试,但是所有组件都组合在一起,但是太多的组件会导致测试套件的执行时间不必要,而且难以维护和保持稳定。 通常可以通过API测试应用程序的技术和业务逻辑的重要部分。 为了更深入地了解API测试的重要性 ,让我们了解自动API测试的以下好处: 比单元测试的范围更广: 单元测试通常在单个应用程序层中的一小部分组件上运行。 在一个应用程序层结束而下一个应用程序层开始的分布式应用程序中,通常不会检测到问题。 为了验证组件是否按期望进行通信,设计了API级别测试。 因此,在集成级别尤其是在与外部组件集成时,非常需要强大的API测试策略。 管理测试环境是执行一项关键任务,尤其是当组件位于不同团队中时。 与端到端测试相比,具有更高的稳定性和速度: 诚然,端到端测试的范围比API测试更大。 它们涵盖了应用程序的所有层和组件,但是API测试弥补了它的稳定性和速度上的损失。 API测试肯定比以前更快。 端到端测试需要更长的时间来加载浏览器和屏幕,而API测试则基于单独的请求-响应交互(例如JSON或XML格式),这使得执行速度更快,反馈周期更短。 而且,由于各种用户更改请求,用户界面趋于频繁更改,并且就产生更少错误和需要更少维护的界面而言,对高级前端框架API的遵循趋于更加稳定。 更加认真地引入API级别测试-自动化测试中的重要决定 API级别的集成测试应该是任何自动化测试议程中必不可少的方面。 对于那些在此领域没有专门知识的人来说,这可能是一个令人不安的举动。 由于它可以超出组件或应用程序的范围,因此与开发人员相比,它更多地是测试人员所需要的。 没有用户界面可能会阻止访问和测试API。 但是您可以选择市场上提供的各种自动API测试工具。 最喜欢使用RestAssured,SoapUI和Postman之类的工具。 结论 在人工智能和物联网时代,对API测试的需求变得日益迫切。 自动化的API测试策略是最有效的策略,可加快交付速度并减少人为错误。 借助这些工具,可以满足更多API测试要求,并使API测试在更短的时间内对移动应用程序的安全和高质量部署更加有利。 您为什么不使用pCloudy的API集成自动化框架,并使您的应用发布更快? 立即免费试用pCloudy 。 移动应用测试,移动应用测试,Android应用测试,iOS应用测试,移动响应测试,移动测试,自动化测试,移动设备实验室,移动测试实验室,XCUITest,移动应用测试平台,移动应用测试工具

创建自己的UICollectionView API

在本文中,我们将创建一个外部框架,该框架将公开一些单元格,背景线和水平线装饰UICollectionViewFlowLayout以及一个垂直的自定义UICollectionViewFlowLayout ,该UICollectionViewFlowLayout管理单元格之间的边距和填充。 为什么要使用UICollectionview? 根据您的应用程序,使用UICollectionView来构建屏幕可以节省大量时间,主要是在您的屏幕是面向数据和上下文的情况下。 在两个其他对象之间添加一个单元比更新约束来显示或隐藏UI元素要容易得多。 UICollectionView的强大功能是DecorationView 。 在不增加单元格复杂性的情况下,您可以在其中一些背景后面添加背景,并在整个应用程序中重复使用它们。 最后, UICollectionView允许仅用几行代码即可对屏幕中的更改进行动画处理。 为什么要使用API​​? 大多数情况下,应用程序屏幕的设计是相同的:在许多屏幕中,相同的按钮,相同的元素只是内容不同但布局相同。 创建API的目的是以最简单的方式使用这些元素。 UICollectionView API的主要目标是花费更少的时间在构建屏幕上,并花费更多的时间来实现和测试逻辑,改善细节并拥有更易于维护的代码。 另一个优点是在应用程序中提供总体UI一致性,并尽可能与您的设计师提供的模型相似地创建屏幕。 科洛尔 Apple提供的用于实现UICollectionView的API是面向indexPath的。 在oui.sncf,我们创建了一个名为Collor的顶层,以实现面向数据的实现。 该库的主要目标是在一个文件中描述UICollectionView的结构。 在继续阅读本文之前,您应该看一下这两篇文章: Collor:UICollectionView的面向MVVM数据的框架 我们已经建立了一年的框架,以简化和加速我们的UICollectionView的开发。 UICollectionView:如何轻松处理更新 当您使用CollectionViews或TableViews时,困难的部分是当您需要添加,删除,移动一些单元格时… medium.com 我们走吧 1)创建自己的框架 为了优化编译时间并最小化依赖关系,最好的方法是在工作空间中创建一个框架。 我们将其命名为CollorAPI 。 如果您打算在其他项目中使用此框架,则建议您创建一个私有容器。 我们在这里不解释创建框架的过程,如果需要,您可以找到很多教程: 模块化iOS应用程序 “只要离开您的计算机去喝咖啡,应用程序就会编译!” medium.com 2)唯一的节描述符 大多数时候,唯一可定制的节描述符足以满足我们的需求。 4)垂直空间 必须对每个通用单元进行边缘到边缘设计。 然后,将在collectionView的布局中以及带有部分插图的地方处理边距和填充。 通过应用此规则,无需增加单元格的复杂性或添加空白单元格来填补空白,就更容易遵守设计屏幕。 首先,我们在builder实现此功能: 最后,collectionData如下所示: 在oui.sncf处 ,有11种装饰类型。 它们使您可以添加票证背景或建立旅程时间表。 对于时间轴,我们在部分构建器内部创建了一个嵌套构建器。 通过这种方式,角色可以很好地分离,并且其他开发人员可以轻松使用该API。 单元在布局中向右移动,以便重用它们,而不是使用内部偏移量创建新单元。 timeLineBuilder 继续,在本文中,我们介绍了您未来框架的基础。 现在就取决于您的需求了! 感谢您的阅读,并让我知道您在Twitter上的想法。

Swift 5的基本API请求

大家好,今天的文章是有关如何使用Swift 5执行API请求的基础教程。我目前是一名自由职业的iOS开发人员,已完成Udacity的iOS开发纳米学位,并且出于教育目的而编写。 让我们首先在Xcode中创建一个新的单视图项目: 我已经将此项目命名为playingWithRequests 。 让我们看看这个项目的目标: 了解如何使用Swift 5向API发出请求。 了解如何使用URL和URLSession。 了解请求在Swift中的工作方式。 显示来自互联网的图像。 现在,我们已经创建了项目,接下来将图像拖放到情节提要中。 展开图像以覆盖整个视图,然后将内容模式更改为适合方面的外观,如下所示: 通过将图像放在情节提要中,我们可以创建IBOutlet以便在Swift代码中管理图像: 现在,我们已经准备就绪,可以开始我们的项目了。 对于此示例,我将使用在Google上找到的土星图像。 我们所有的代码都位于viewDidLoad()函数内部。 我们将要使用的第一类称为URL ,它使我们可以表示一个URL。 创建此类的实例,然后粘贴我们的Saturn URL的字符串: 现在我们有了URL,我们将要索取数据。 URLSession类可以管理网络请求,让我们使用它向该网络发出请求 。 我们可以使用自己的设置创建URLSession ,但是在本示例中,我们将使用包含默认设置的类调用共享来执行简单的GET请求。 在开始编码之前,我想再介绍一件事。 当我们使用URLSession类时,网络请求称为task 。 记住这一点很重要,因为每次需要与API交互时,我们都会处理任务(请求)。 我们准备创建指向URL的任务,我们将使用类调用dataTask: 我们正在使用URLSession发起对存储在常量imageURL中的URL的请求 。 使用此方法,我们有一个完成处理程序,该处理程序将在遇到错误时帮助我们处理数据,首先检查错误变量是否为nil。 现在,我们可以在视图中显示图像: Swift 5更新:到目前为止,所有代码对于Swift 4都是相同的,但是在继续之前,我想提一下,随着对Swift 5的更新,该库现在包含了一个称为 Result Type的 东西 。 结果类型的工作方式与 可选类型 一样, 但是在这种情况下,结果类型被实现为枚举。 这对于异步任务非常有效,因为在获取数据之前,我们甚至要求成功或失败。 我们不会在这里看到这个,以后我将为此主题编写一个特定的教程。 如果我们现在运行项目,您将不会在应用程序中看到任何内容。 我们具有请求的代码,但是我们需要使用方法调用resume()来运行任务: 现在,如果我们运行我们的应用程序,您将看到一个空白页。 按下cmd + shift […]

使用Swift进行实验

JoséAlejandro Cuffia在“ Unsplash”上发表的“棕色表面上的白色和绿色纸张” 我已经尝试过Swift一段时间了,至少可以说,语言很好。 您需要了解的警告,例如闭包,弱变量(无主变量),强变量,转义闭包以命名其中的某些变量,对于初学者来说是很复杂的。 但是,一旦习惯使用,构造本身就很简单(来自Ruby和Java背景) 我尝试了一个简单的应用程序,该应用程序从API中获取JSON,并以表格形式显示结果。 挑战本身就是结构。 我已经做了一段时间的Objective-C,问题始终是构建项目时没有标准。 有些人这样做非常复杂,例如使用响应式代码,键值编码和键值观察。 和其他人以更简单的方式。 我想说,从简单开始很容易,但是一旦复杂性开始,就必须考虑拆分和观察事物。 该应用程序本身具有一个主表视图,该表包含6个静态单元格,每个单元格使用不同的参数调用API。 我也尝试过缓存结果,但是似乎API本身没有返回正确的缓存头(返回无缓存)。 单击静态单元格时,将调用API,然后将数据填充到文章的结果列表视图中。 生成的表视图具有动态单元格,这有些复杂。 我尝试了一个集合视图,但是那似乎没有用。 看看https://github.com/dinks/MyNews 参考文献 自调整表格视图单元格 在本教程中,您将学习如何启用自动调整大小的表格视图单元,以及如何使它们按需调整大小。 www.raywenderlich.com https://newsapi.org/v2/top-headlines