Tag: iOS应用开发

井井有条的项目是一个清晰的文件结构加上一个标记的代码。

我们尝试组织生活,因此时间表是一个很好的工具。 当我们要清洁桌子时,我们将所有东西整理好了。 这些想法我们可以应用于我们的代码,因为它是我们日常生活的一部分。 第1阶段-项目文件结构 我希望您没有一个包含.xcodeproj文件之类的文件列表的项目。 有数十个没有任何功能分类的文件。 您可以说:嗯,所有文件都应组织在项目文件中。 让我们打开百宝箱。 我们能看到什么? 像这样: 请不要说您以相同的方式进行操作。 最后一个示例由Apple提供,但是当您应该为具有大量类和职责的真实项目提供支持时–与以前计划相比,您将花费更多的时间进行搜索和准备。 此示例来自MVC范例,在该范例中我们按类型创建了分组。 结果,我们开发了一个快速的基础和难扩展的结构。 解决方案1: 我为自己找到的最好的体系结构之一是按功能分组。 Andrew Cherkashyn在他的文章:以xCode组织iOS项目文件的最佳方法中对此进行了描述。 所描述的结构更加复杂,但易于扩展。 此外,我们可以轻松地将其修改为其他架构:MVP,MVVM,VIPER…在下面提供的示例中,我们的项目结构如下所示: 阶段2 –类或文件中的结构 仅当M不代表Massive时,我才喜欢MVC模式。 苹果将​​其用作基本概念,并且效果很好。 如果要在模型/视图/控制器/等中更好地组织代码,该怎么办? 它们为我们提供了来自Objective-C的#pragma mark的极大可能性。 在Swift中,我们将其称为// MARK: note。 不幸的是,一些开发人员跳过了此功能。 他们使自己的代码变得肮脏,并且不将其分离为不同类型的功能。 作为示例,它可以像这样: 我们在那里: 在文件的顶部,存在方法addAlbum(_:) -一个动作方法; 在中间,有两个枚举: SegueIdentifier和CellIdentifier ; 在CellIdentifierds.下声明的变量CellIdentifierds. 完全没有标记。 我的第一意见: 解决方案2: 1.您应该在指定的具体区域内组织枚举/属性/方法/扩展/等。 另外,不要将代码放在任何需要的地方。 如果使用多个枚举,最好将其描述在一个位置,例如在文件或类的顶部: 2.使用// MARK: -仅几行代码可更快地在文件中查找内容。 快速示例: 班级成绩 恢复: 井井有条的项目加上相同的代码样式,可让您和您的团队更好地理解项目及其所有组件。 我坚持认为,清晰的代码可以提高生产率并缩短问题解决时间。 例子: […]

在iOS 10.3中对App Store评分和评论进行简单更新

iOS 10.3已于今天发布。 它引入了SKStoreReviewController,它带来了新的App Store评分和对应用程序用户的评论方式。 在此之前,开发人员使用自己的或第三方组件将用户带到App Store。 我们将通过一个简单的示例介绍这种新方法。 首先,我们需要最新的Xcode 8.3并启动一个新的Single View Application。 然后在ViewController.swift中,导入StoreKit并在ViewDidLoad中添加一行作为以下代码片段。 import StoreKit … override func viewDidLoad() { super.viewDidLoad() SKStoreReviewController.requestReview() } 构建并运行 评分 有关更多详细信息,请转到参考页面进行请求审查。 我们开发人员的另一个优势是 当iOS 10.3交付给客户时,您将能够以所有客户都可以查看的方式在App Store上回应客户评论。 John Gruber的这篇文章解释了有关新的App Store评论的一些详细信息。 谢谢你的时间。 请单击❤按钮以使更多的人看到此文章。

iOS中的复数形式

我在多语言应用程序中总是遇到复数形式的问题。 用英语来说问题不是那么大,可能是因为只有两种形式。 我是波兰人,我们的语言稍微复杂一点。 这是带有指导原则的多种语言的列表,我将向您展示如何轻松地在Swift中使用它。 首先,我们必须为“复数化器”创建协议。 没有这个,我们将无法轻松地更改语言。

使用Appium Mobile测试自动化管理质量检查难题

随着无数移动应用程序,操作系统,设备平台,网络的兴起,对质量测试的需求变得至关重要。 自动化的移动测试在质量保证行业中仍然是一个独创的概念。 在Appium成为用于测试Android和iOS应用程序的最可靠的开源移动测试自动化工具之前,移动应用程序测试人员面临着严峻的挑战。 它减少了测试人员面临的许多挑战,并成为自动化移动应用程序测试的测试人员友好工具。 根据《 2017-18年世界质量报告》,质量检查团队面临的最常见挑战是缺乏内部测试环境的时间,测试专业知识以及缺少测试移动应用程序的正确工具和方法,集成测试的难度大为了克服这些问题,必须在更深层次上改变策略和方法,以改善客户体验。 以下是根据自动移动应用程序测试中移动应用程序测试人员面临的经验指出的一些挑战: 在多个设备上执行测试:很难在不同的设备环境上部署和运行测试。 在较少数量的设备上购买和运行测试很容易,但是当数量更多时,在所有设备上运行自动化测试会变得困难且耗时。 在测试大量设备时,最好考虑使用诸如pCloudy之类的云服务。 pCloudy Appium集成体系结构使开发人员的工作变得更简单,代码更改更少。 您只需要提及一些所需的功能即可,而不是调用API或更改代码以运行Appium脚本。 您可以在500多个设备上并行运行测试。 想知道是什么! 它使您节省了50%的应用测试时间。 a) 设备连接性:设备具有不同的功能。 某些设备在安全性,可访问性和驱动程序方面具有某些限制。 一台设备上运行的应用程序某些功能可能无法在另一台设备上运行。 因此,用于测试的设备在功能上会有很大差异,因此可能会在此级别出现问题。 b) 测试性能:在真实设备上进行测试是最有效的,因为所有内容均已在实际情况下得到验证,尤其是在不同网络条件下测试性能和测试应用程序的情况下。 GPS,接近传感器,生活传感器等许多手势无法在模拟器上进行测试。 在模拟器上测试的应用程序在实际设备上可能无法始终正常运行。 同一操作系统在不同设备上可能会不一致,更不用说其他操作系统了。 在需要进行大规模设备测试的情况下,也可以考虑进行设备云测试。 c) 访问网络:为了使功能更流畅,必须易于访问网络,数据库和Web服务。 如果使用远程服务,则需要配置设备隧道和VPN连接以轻松访问资源。 pcloudy的设备隧道为开发人员提供了对云上设备的完全控制。 这样,可以通过计算机中安装的Android Studio或Eclipse IDE访问云设备。 这已帮助开发人员和测试人员输入托管在云中的任何类型的设备,以运行快速评估和应用程序调试会话。 以上是移动应用程序测试自动化的一些挑战,但是Appium如何解决这些问题? Appium支持大多数测试人员都熟悉的Selenium Webdriver API 2.无需修改正在测试的应用程序的代码。 3. Appium支持主要的编程语言,例如JAVA,RUBY,PYTHON,C#等。 4. Appium支持IOS和Android移动平台 5. Appium具有庞大的用户社区,并且是一个开放源代码工具。 但是,它的某些版本确实存在其自身的挑战。 像这样的挑战不支持图像识别,并非所有功能都同时在Android和IOS上可用,某些API没有实现,等等。尽管有这些缺点,Appium仍然是测试人员的最佳选择。 真实设备和云上的APP的性能。 哪种环境最适合Appium性能? 是在真实设备上还是在云上? 1. 在Real Devices上 –在提供实时用户体验方面, […]

我回到东京

例行 目前东京办事处有20人。 这是一个温暖友好的环境,每个人都在大型办公室所无法达到的水平上彼此了解。 延伸和演讲 Tigerspike Tokyo有一个独特的早晨活动:早上11点,办公室经理邀请所有人参加简短的体育锻炼,例如俯卧撑,瑜伽伸展或木板运动(后者在许多Tigerspike办公室很常见)。 练习后,工作人员分成几小组,并从一小盒便条纸中随机选择一个主题。 经过一会儿的思考,小组中的每个成员必须与小组中的其他成员讲话一分钟。 主题从“你昨天做了什么?”到“你最喜欢的书是什么?”和“最近的生活中什么是幸福的时刻?”一直到“你的父母总是说些什么?” 。 这样,每个人都可以轻松地工作,并与同事一起学习和笑。 午餐时间 Tigerspike办公室的重要部分是星期五午餐。 在东京,每两个星期都会选出几个人做饭,他们从不会失望! 东京办公室午餐文化的一个不寻常的方面是,每周两次,有两个人(来自外部公司)带着精选的便当盒运抵,摆在桌上,任何人都可以选择购买。 当然便宜又好吃! “午餐与学习” 尽管大多数Tigerspike办事处的午餐和学习讲座都与最近完成的工作有关,但东京的版本可能已经在翻译中有所遗漏……但更好! 每隔第二个星期五,两个人就会被选择谈论他们感兴趣的事情,无论是音乐,过去的经历还是最喜欢的温泉。 这是每个人练习公开演讲的简便方法! 下午茶 最近出差回来的人带来的桌上总是有有趣的食物。 东京办公室的人们通常在下午3点左右聚集在一起喝咖啡和小吃。 同样,这使每个人都有时间刷新并清理思路,然后再回到工作中。 星期五饮料 东京Tigerspikers喜欢在星期五晚上在办公室闲逛,喝一杯并大笑。 每月一次,办公室举办一次公开活动,让其他公司的人们一起玩耍,体验Tigerspike文化–喝酒,聊天,甚至一起观看TED演讲。 午餐剩余的食物被重新加热或转变为新菜肴,并由所有人共享。 技术差异 日语字符 使用另一种语言/字母有其自身的特殊挑战。 日语字符在字符串中被编码为“两字节字符”。 与第三方API进行交互时,确保兼容性非常重要。 这可能很简单,例如在将用户键入的搜索字符串发送到API或符合Shift JIS的要求之前,将两个字节的空格字符替换为“普通”空格。 键盘处理 另一个不寻常的挑战是更改“ henkan”突出显示的颜色-使用日语键盘键入时经常出现的文本建议的突出显示。 我们的项目经理知道此功能称为“ henkan”,但是对于像我这样无法过滤日语google结果的人来说,几乎不可能研究如何更改颜色。 幸运的是,我的联合开发人员是日语,因此他很快找到了解决方案-我们已在此处记录了该解决方案,供下次使用英语搜索Google的人使用。 用外语工作 当然,当要开发的产品中的文本不仅使用完全不同的语言,而且使用完全不同的字母时,最大的挑战就是完成工作。 所有软件工程师都知道,必须通过代码告诉屏幕上显示的所有文本。 当设计使用外来字母/语言时,很难决定用什么命名变量! 最初,我发现自己不断地将设计文档中的日语文本复制到Google Translate中,但是不断寻找浏览器选项卡非常耗时。 另外,Slack上的消息通常是日语的,这意味着又需要浏览翻译浏览器标签。 因此,本着以非凡的方式解决问题的真正精神,我花了几个周末来开发Mac应用程序以帮助进行日常翻译。 您可以从AppStore下载它! 翻译 翻译这是翻译PDF,图像,Slack,网站中文本的最简单方法-实际上,如果您可以在屏幕上看到文本,则可以对其进行翻译。 itunes.apple.com 工作之外 借调意味着要在Tigerspike租用的公寓中,在外国办事处的合理距离内。 […]

iOS中的MVC方法

MVC是一种将代码分为三个不同部分的体系结构模式。 模型视图控制器。 这是一种流行的体系结构,因为它将用户界面代码与逻辑代码分开。 因此,可以更轻松地在错误发生时进行更新,扩展和查找错误。 三个不同部分的简要概述。 模型 -模型是处理大多数逻辑和数据过程的地方。 视图 -您的UI元素将位于此类内。 由于它不包含任何逻辑,因此也称为伪类。 控制器 -这是模型和视图之间进行交互的地方。 控制器管理这些交集。 在iOS开发中,将所有代码编写在ViewController可能是诱人的; 实际上,如果您是一个自学成才的开发人员,您可能会实践过。 在本文中,我将演示如何在应用程序的简单注册功能上执行此操作。 我喜欢以编程方式执行此操作。 因此,如果您关注以下内容,请删除Storyboard文件,并确保在项目设置中将“ Main Interface选择保留为空白,并在AppDelegate.swift初始化rootViewController 设定 我将创建三个文件: Register RegisterView和MainController 。 我们的Register类将充当我们的模型,其中将包含我们的所有逻辑。 RegisterView将充当我们的View,并将包含我们的所有用户界面元素,并且MainController将托管RegisterView 。 注册—模型 在本课程中,我们将使用用户名和密码。 我们想对密码的格式化方式添加一些限制。 首先,我希望密码长度至少为6个字符,并且在继续操作之前,密码和确认密码必须相同。 我们没有使用数据库来保存任何信息。 首先,让我们设置初始化程序,该初始化程序将使用用户名,密码和确认密码。 在那之后,我想要三个功能。 validatePasswordLength() validatePasswordAndConfirmPassword() completeRegistration() validatePasswordLength()少于5个字符时将引发错误。 如果validatePasswordAndConfirmPassword()不相等,也会抛出错误。 completeRegistration()函数将在try块中同时调用validatePasswordLength()和validatePasswordAndConfirmPassword()函数。 因为我们正在使用try块进行错误处理,所以我们需要一个enum不同的错误。 枚举验证:错误{ 案例密码太短 案例密码 } 完成后 您的代码应如下所示: RegisterView —查看 如前所述,此类将包含我们的UI元素。 对于此注册页面,我们想向用户询问用户名和密码。 我们还希望另一个密码字段来确认密码。 因此,我们总共需要三个UITextField。 我们还需要一个按钮来执行注册操作。 […]

XCUITest的机器人模式测试

在iOS上使用机器人图案 我最近在iOSDevUK上发表演讲,概述了我们如何在Capital One测试我们的旗舰iOS应用程序。 我被问到的最常见的跟进问题是关于使用机器人图案 。 我在幻灯片中简要介绍了机器人模式,但显然这是其他人有兴趣了解的更多信息 机器人图案是由Square的Jake Wharton设计的,用于在Kotlin进行测试。 结果,许多可用信息都集中在Kotlin和Espresso测试上。 在线使用iOS的机器人模式的知识很少。 但是,Capital One UK Mobile团队选择使用机器人图案,因为这意味着我们的Android和iOS测试之间采用一致的方法。 这是iOS应用程式的运作方式。 为什么要使用机器人图案 编写XCUI测试时,使用机器人模式的三个主要原因。 易于理解 我们来自Calabash的XCUITests,我们的测试是用Cucumber编写的。 黄瓜接近自然语言。 这意味着您可以快速,轻松地阅读和理解所测试的内容,而无需确切了解测试的工作方式。 用本机代码编写测试,知道要测试的内容和没有测试的内容已经有了一条学习曲线。 重用代码 通过将我们的测试分为多个步骤,每个实现步骤都可以根据需要重复使用多次。 如果您的应用在执行任何操作之前具有登录屏幕,则每个测试的设置很多。 取而代之的是,您只需每次调用​​login(),然后继续进行测试的更具体区域。 如果确实需要做一些不同的事情,可以将参数传递给函数。 隔离实施细节 无论您的应用程序使用哪种架构,您的目标都是单一责任原则。 坚持这样做可以使您以新的实现将对象切换为新对象,同时仍保持对象的核心功能。 这使得代码更易于维护,测试和改进。 那么,为什么您的测试应该有所不同? 杰克·沃顿(Jake Wharton)将其描述为将“内容”与“方法”分开。 您的测试仅应关注“什么”,这意味着,如果您的视图改变了事物在屏幕上的显示或发生方式,则无需更改整个测试套件。 编写一个XCUITest 假设我们正在为Apple的内置Messages应用程序编写UI测试。 如果您从暂停状态加载应用程序,则会在屏幕顶部看到一个大标题“消息”和一个用于创建新消息的按钮。 假设我们正在测试点击此按钮,然后使用iMessage向用户发送新消息。 我们的XCUITest可能看起来像这样: func test_sendNewiMessage(){ 让app = XCUIApplication() app.launch() app.buttons [“ new_message”]。tap() 让newMessage = app.staticTexts [“新消息”] let谓词= NSPredicate(格式:“存在== […]

为什么仍然称其为“关闭”? 快速的概念外观。

名字叫什么? 如果编程语言带有命名功能,则可以肯定地以某种方式命名了它。 可以肯定的是,语言设计师的命名目的是有目的的,因此,如果您能找到一个至关重要的“他们为什么要这样命名?”的问题,那么您可能就更了解该功能或概念了。 为什么要“关闭”? 现在的挑战是:真正找出“为什么?”问题的答案。 Swift是在公开场合开发的,通常它使人们好奇地洞悉诸如命名决策之类的事物。 但是,Swift中的闭包比Swift开源的时间更长。 既然如此,在关于为何将闭包命名为“闭包”的对话中,我真的找不到很多。 闭包语言还存在其他语言,因此也许Swift只是借用了这个名字。 但这并不能帮助我们回答将闭包命名为“闭包”的底线原因。 打开“封盖”的包装(感谢thesaurus.com!) 所以……我开始冒险一词,以帮助阐明“封闭”一词的含义。 知道“闭包是可以包含并在您的代码中使用的自包含功能块”,这是一回事。(Apple Developer Docs)但要认真地讲-为什么不直接将它们称为“函数”? 如果可以的话,让我们打开这个词。 我将“ closure”放入thesaurus.com,我认为在编程语言中最能阐明“ closure”一词的同义词包括: 从这个意义上说,“封闭”似乎传达了将某物保持在…… 封闭状态的想法。 好吧,封闭的内容是什么? 好问题! 简短的答案? 变量 。 不可避免地,如果仔细研究互联网的含义,就会遇到与上面引用的Apple类似的定义。 在我发现的各种定义中,通常会出现“捕获变量 ”或“结束变量 ”之类的短语。 这些短语似乎总是使水变得浑浊(无论如何对我而言)。 尚不清楚“捕获变量”或“结束变量”是什么意思。 直到我看到同义词,“ plug”,“ seal”,“ cork”。 然后它点击了… 想象力的例子 我希望您在Swift中使用某个功能,并且希望您将其想象为一个空游泳池。 进入您的脑海了吗? 游泳池。 空(暂时)。 在运行时,您的Swift程序会愉快地执行。 然后,在程序中有片刻会调用函数。 它开始执行,突然,水涌入池中。 一打跳水硬币也被扔入水中! 硬币代表函数创建以执行其工作的局部变量和常量。 您的函数一直执行到return关键字,并在函数返回的确切时刻开始排水。在几毫秒内 ,用巨大的力将所有水从池中吸出。 您认为池中的所有硬币会发生什么? 对于此示例,我们只说答案是“他们会费尽心机”。 这将与函数返回时在函数中声明的变量和常量通常发生的情况很好地关联。 每当函数返回时,都会从内存中清除在函数内部创建的所有变量和常量……如果可以的话,请尽一切努力。 Unleeeees… 如果在某个时候池中仍然有水,您能够潜入水中,拿走几枚硬币并将其装瓶怎么办? […]

在iOS 11中的Files App中下载文件

构建一个将来自网络的文件保存到本地存储的iOS应用程序可能很棘手。 经过一周的反复试验,我弄清楚了。 所以这是解决方案。 准备好保存文件或在“文件应用程序”中创建目录之前。 我们需要在应用程序的info.plist中获得一些权限。 启用文件共享-添加UIFileSharingEnables,此键(应用程序支持iTunes文件共享)将使iTunes共享“文档”文件夹中的文件。 确保将布尔值设置为YES。 声明此内容后,/ Documents目录的内容可用于用户根据需要从iTunes移入或移出该目录。 就地打开支持-添加LSSupportsOpeningDocumentsInPlace,此密钥(支持就地打开文档)将提供对应用程序文件提供者的访问,以读取或写入“文档”文件夹中的文件。 确保如上所述将布尔值设置为YES。 现在,让我们使用一些代码。 让我们在“文档”文件夹中创建一个目录,该目录将存储在设备中。 我创建了一个名为Chemdoc的应用程序,并在Chemdoc文件夹中创建了一个目录(Chemdoc SDS)。 在上面的代码中,我在/ Documents / Chemdoc SDS中创建了一个目录。 我已经打印了Documents Directory文件夹路径,以便在模拟器上工作时可以跟踪该路径。 您将在“文件”应用程序的“在我的iPad / iPhone上”部分中看到正在创建的应用程序文件夹目录。 您可以看到我们现在已经成功创建了一个子目录,并且现在我们可以通过访问子目录的路径将文件添加到该子目录中。 有很多方法可以从Web下载文件,但是我们仅使用扩展名,该扩展名以url和目标路径作为参数。 上面的扩展名将下载任何文件并存储在给定的目标位置。 在这里,我们的目的地将是Chemdoc SDS的目录。 运行上面的代码后,我们将看到文件已下载到/ Chemdoc SDS / Sample.pdf下的Files目录中。 删除档案 如果要从该位置删除文件,则只需知道文件的确切路径并使用以下代码即可。 我们可以通过访问文件路径并创建一个附加了导航控制器的子视图来在Web视图中查看“已下载的文件”,这样当我们从子视图中按回去时,我们将定向到该应用程序。 下面是带有应用程序后退箭头的“模拟Web视图”。 希望对您有所帮助。 使用下面的Clap欣赏博客。 以后再接你🙂

简而言之,iOS远程推送通知

什么是远程推送通知? 好吧,如果您问苹果公司的人,他们可能会将您定向到他们网站上的以下页面,该页面描述了以下通知: Apple Push Notification服务 (APN)是远程通知功能的核心。 对于应用程序开发人员而言,它是一项强大,安全且高效的服务,可以将信息传播到iOS(以及间接地通过watchOS),tvOS和macOS设备。 我只是说“这是在提醒用户有关其在手机上安装了您的应用程序的事实”,这听起来有些怪异。 我在那里也看到:“更好地利用这个强大的功能,伙计/女士!”。 这正是我们在本指南中要做的! 推送通知可以做什么? 我将把“推送通知”称为“推送通知”,“ PN”,“ APN”,“通知”,“远程推送通知”,“远程通知”,我将始终牢记相同的概念。 这几天您可以使用APN进行以下操作: 显示讯息 播放声音 在您的应用上设置徽章图标 提供用户在打开或不打开应用程序时可以执行的操作 显示图像或其他类型的媒体 保持沉默,但要求应用程序在后台执行一些操作 方式可能太多,但全部有用。 尽管如此,随着文章标题的发展,我将专注于显示消息,媒体和动作 。 没人喜欢知道吗,对吧? 但是,在看到任何APN魔术发生之前,需要完成一些配置! 这将帮助我们保护珍贵的远程通知免遭可能的入侵者的侵害-定义确实“ 健壮,安全且高效 ” ,现在听起来确实很吓人,但您不用担心! APNS配置开始之前需要准备的东西 真正的iOS设备。 模拟器无法接收通知。 我将在装有iOS 11的iPhone 8 Plus上进行测试。 Apple开发人员计划成员资格 -是的,您需要最终支付自己一直避免的费用。 将通知有效负载发送到设备的一种方法是一种简便的安装和使用Pusher应用程序的好方法。 APNS配置和初步分步实施 步骤1,项目设置:与这些天您可能正在学习的有关iOS应用程序的其他任何事情一样,这一切都始于创建项目。 是的,我的名字叫独角兽。 这个想法很简单-当同一个独角兽用户看到独角兽并拍照时,每个用户都会在通知中收到该图片。 第2步,启用APN:在Xcode中,转到“ 目标” ,在应用名称下,选择“ 功能”,然后在列表中找到“ 推送通知 ” ,然后切换 到ON : 步骤3,获取APNs证书:转到您的Apple Dev […]