Tag: iOS应用开发

为iOS应用程序处理多个数据源

在移动应用程序上管理多个数据源的一种优雅方法是使用存储库模式。 构建基于iOS客户端-服务器的应用程序很容易。 您可以在3步中完成。 (1)只需将Alamofire pod倾斜度插入到您的项目中,然后(2)从UIViewController调用API,然后(3)在View上显示其结果。 例如,您有一个api端点来请求Todos,比如说www.localhost/api/todos ,它将返回一个JSON对象。 { “待办事项”:[ { “ is_completed”:“ 0”, “ tempId”:“ 710BBEC4-8A7B-486F-9329-412DFD5FB738”, “ title”:“编码”, “ id”:“ SJcbh6mtb” }, { “ is_completed”:“ 0”, “ tempId”:“ FAF6D1D3-A8B6-4E46-B25F-484B783EDD99”, “ title”:“ goto futsal”, “ id”:“ SyXOu_utb” } ] } 现在从UIViewController一侧,导入Alamofire倾斜度,然后在View完全加载后使用Alamofire.request()进行调用。 进口Alamofire 类TodosViewController:UIViewController { func viewDidLoad(){ Alamofire.request(URL,method:.get).responseJSON { 如果response.result.isSuccess { var todos:[Todo] = [] 让数据= JSON(rawValue:response.value!) […]

iOS上的事件传递:第1部分

如果您的iOS应用程序可以处理轻击,滑动,平移或任何其他外部交互,则它使用的是幕后事件。 这些事件采用的路径是一个定义明确的过程,我们将研究它的工作方式。 当调试一些棘手的问题(涉及文本输入或远程控制事件)时,了解此过程的工作原理很方便。 您甚至可以使用此知识使自定义数据流通过您的应用程序。 这是有关事件传递的系列文章中的第一篇。 它将涵盖触摸处理,如何将简单的触摸转变为通过应用程序传递的事件以及如何为组件提供处理该事件的机会。 触摸处理 触摸事件是iOS应用程序处理的事件的主要形式。 我们每天使用的API隐藏了许多如何处理触摸的细节。 了解如何在应用程序中传递这些事件可以帮助确定应用程序的构建方式。 您甚至可以使用此基础结构传递自定义事件。 命中测试 在讨论事件传递时,要讨论的第一件事是系统如何处理触摸事件以及这些事件通过应用程序的路径。 一旦用户点击屏幕,事件就会开始。 在适当的组件可以处理触摸之前,系统需要确定在何处发生触摸以及谁在响应该触摸时首先遇到裂缝。 这是命中测试起作用的地方。 命中测试过程中涉及的方法是hitTest:withEvent:和pointInside:withEvent:。 hitTest:withEvent:使用pointInside:withEvent:来确定要命中的测试点是否在其范围内。 如果不在边界内,则返回nil并跳过视图层次结构的整个分支。 如果测试点在范围内,则在每个子视图上调用pointInside:withEvent:。 对于从pointInside:withEvent:返回YES的子视图,将调用hitTest:withEvent:。 原始hitTest:withEvent:调用的最终结果是子视图之一或self的结果(如果其所有子视图均返回nil)。 采取以下视图层次结构: 假设用户在View E中轻按。该过程从View A中的hitTest:withEvent:开始 。 pointInside:withEvent:对于视图A返回YES ,因此在视图B和视图C上调用pointInside:withEvent:。视图B返回NO 。 视图C返回YES,因此将其调用hitTest:withEvent:。 视图C与视图D和视图E遵循相同的过程。视图D在pointInside:withEvent:上返回NO 。 视图E返回YES ,然后在hitTest:withEvent:上返回自身,因为它没有任何子视图。 假设视图D是视图C的子视图,那么如果用户在视图D超出视图C的范围内点击,会发生什么? (当clipsToBounds为NO时,可能会发生这种情况。)视图A启动上述过程。 视图B和视图C的pointInside:withEvent:均返回NO ,因此视图A最终获得了触摸。 现在,我们有了hitTest:withEvent:的视图。 该视图称为“命中测试”视图。 现在,它与触摸相关联,在触摸处于活动状态时,将获得第一个机会以响应任何触摸事件(稍后会详细介绍)。 如果没有针对给定触摸的自定义实现,会发生什么? 这取决于。 如果视图是由视图控制器管理的,则视图控制器将有机会做出响应。 如果该视图控制器没有响应,则为命中测试视图的超级视图提供响应的机会。 一直重复此过程,直到称为“响应者链”为止。 响应者链 响应者链是责任链设计模式的一种实现。 响应者链中的每个参与者都继承自UIResponder。 UIResponder包含处理各种类型事件的离散方法。 除了触摸事件外,UIResponder还声明用于处理输入视图,运动事件,按下事件和远程控制事件的方法。 对于许多此类事件, firstResponder很重要。 firstResponder是第一个获得处理事件机会的对象。 […]

自学系列| iOS Swift | 第二课:介面开发(UIKit)第1部分

前言:为什么会有「自学系列」 当我还是程式初学者时,觉得自学最麻烦的就是:那些课程大纲,专有名词我根本看不懂。如果有个已经会的人直接跟我说要学什么,给我一个概述,可以省下很多时间。 关于iOS App自学系列我已经写了两篇,有兴趣可以去看看。 自学系列| 斯威夫特| 用免费的线上学习资源入门iOS App 初学者到底有什么基本东西要学? medium.com 自学系列| iOS Swift | 第一课:开发工具+ App基础观念+基础UI 用AVFoundation做一个简易变声App medium.com 简介文章是Udacity iOS应用程序Nanodegree第二课的导读,透过做成这个影片中的App,熟悉介面开发常见的几个元素。 第二课连结在此 ,我们将学会底下几个主题。 UIKit基础知识:了解iOS用户界面库| Udacity 了解iOS UIKit框架,这是在所有iOS应用程序中创建用户界面的基石,对任何其他应用程序都至关重要。 www.udacity.com 1.重点观念 代表 Delegate对初学者而言是一个逃不掉的魔咒,记得自己初学Delegate时,不懂为什么要有这种东西,只会一个案例,一个案例照抄。三个月后大概可以不再参考案例,顺顺地自己写出Delegate,直到最近写这篇文章,我才觉得有点理解它了。 先帮大家打个预防针: 有时候学东西是这样:先照抄➙会自己写➙练习很多很多次之后,终于理解为什么要这样写。 Delegate是代理人的意思,在上一篇有提提过,它是一种写程序的方法(设计模式),用于当A想叫B做事情的时候。还记得MVC吗?View(介面)负责呈现画面给用户,Controller则是负责处理逻辑,例如Controller会根据一些逻辑,告诉查看现在要变成什么画面。 所以,很多时候查看会分配控制器为Delegate(代理人),问Controller现在要如何呈现自己。 举凡为呈现多种资料的UITableView,UICollectionView,呈现文字的UITextView,UITextField,选择日期,数字的UIPickerView …等等,都会用到Delegate。 协议就是这样的东西,遵从Protocol的代表就会有要执行的功能。底下用UITextField视为示例。 UITextField UITextField用于输入文字(如左图红色框局部)。 在第二课的范例中(右图),三个TextField的文字呈现都不同,表示这三个TextField是不同的代理人(代表): 第一个Delegate可以把动物的单字变成表情符号(例如cat变成🐱) 第二个Delegate会根据单字改变句子的颜色(例如红色) 第三个Delegate会算出句子的字数 这三个Delegate都遵从UITextFieldDelegate这个协议,所以当我们输入文字时,三个代理人就要执行该协议 func textField(UITextField,shouldChangeCharactersIn:NSRange,replaceString:String) 这个功能,差异只是功能里的逻辑要写什么,决定文字会怎么变。就像外交官出席活动一定要发新闻稿,但新闻稿内容要写什么,则因人而异。 2.资料呈现 UITableView / UICollectionView 仔细观察的话,你会发现多数的App都用到TableView或CollectionView。 TableView就是一行一行排下来的,像iPhone内建的设定(左图),Line,Messenger,邮件,备注,YouTube,Facebook …等等,CollectionView则是一格一格的,像instagram(右图),照片,旅行青蛙购买道具和放明信片的页面…等等。 TableView跟CollectionView都要用到Delegate(所以Delegate真的逃不掉!),以TableView来说,就有UITableViewDelegate,UITableViewDataSource这两个。UITableViewDelegate负责处理使用者产生的行为,例如当使用者点选表格,编辑表格时,要怎么回应; […]

苹果代码符号简化图

Apple文档似乎并不擅长简化开发人员的工作。 因此,为了使我清楚什么是代码签名,我提出了这些。 iOS应用程序需要通过Apple开发者团队资料中的证书进行签名,然后在指定设备上运行。 供应配置文件包括所有这些信息。 具体来说,在Xcode构建过程中,使用私钥对应用进行了签名。 供应简档包括公共密钥,该公共密钥是私有密钥的某些加密功能。 在新设备上安装该应用程序后,使用公钥解密来自该应用程序的某些消息可以验证该应用程序是否已被修改。 通常,构建iOS应用程序可满足以下两个目的之一:开发或发行。 用于两个目的的相应设置,命令和必需的配置文件如下:

保护iOS应用程序

我们喜欢开发使用户满意并花费大量时间来计划UI / UX,功能,提高性能的iOS应用程序。 但是在大多数情况下,安全性和隐私是一个经常被忽视的方面。 通过本文,我想强调一些要点,这些要点可以解决应用程序中最常见的漏洞。 免责声明 :这里提到的这些点绝不是详尽的。 还有许多其他方法可以保护应用程序安全。 在给定的时间和资源的情况下,可能会忽略上述要点。 保存数据: 收集所有保存在应用程序中的数据的详细信息。 重新考虑保存数据的需求。 在某些情况下,我们需要处理数据并仅存储结果,而不存储实际信息。 关键审查领域: 使用钥匙串 :这是Apple提供的用于保存敏感数据的安全容器。 但是,如果设备遭到破坏(越狱),则可以将项目转储到钥匙串中,从而使存储的数据可见。 因此,存储在钥匙串中的数据也必须进行加密。 此外,请继续阅读。 数据存储 :如果在应用程序中使用SQL Lite或Core Data来存储数据,请考虑使用诸如SQL Cipher或Encrypted Core Data之类的解决方案对其进行加密。 必须对加密和解密所需的密钥进行管理,例如,可以将其保存在钥匙串中,也可以对其进行混淆。 使用可靠加密技术的应用程序有义务遵守App Store中的发行规定。 代码中的机密字符串 :避免在代码库中为机密密钥,用于Web服务的Eg API密钥,社交平台令牌等使用纯文本字符串。使用混淆处理可以隐藏这些文本,以免对应用程序二进制文件进行逆向工程显示。 此外,请继续阅读。 在应用程序中创建的文件 :使用NSFileManager API的NSFileProtectionComplete键。 在Xcode中启用数据保护功能。 此外,请继续阅读。 无论如何,都不应该使用NSUserDefaults来存储任何机密信息。 保护传输中的数据: 几乎每个移动应用程序都通过网络进行通信以提供丰富的用户体验。 Apple通过设置默认值来强制通过HTTPS通过网络进行所有通信,从而推动了通过网络安全传输数据的要求。 强烈建议不要在info.plist中禁用此功能。 安全API :所有API均应使用HTTPS和基于标准AES 256的加密。 让我们加密是一个免费的证书颁发机构,可以帮助您免费切换到HTTPS。 此外,每个API都需要在需要时进行标识,认证和授权。 证书固定 :我们使用SSL固定的目的是确保应用仅与指定的服务器通信,并防止基于MITM的攻击。 可以通过在应用程序包中保存目标服务器的SSL证书来完成。 在会话配置中定义固定证书时使用此证书。 诸如AFNetworking,Alamofire之类的第三方框架使此操作变得容易。 此外,请继续阅读。 用户身份验证/登录 […]

持续的iOS学习-第1部分(文章)

我想与大家分享我所订阅的网站,博客和新闻通讯 ,每天我都会学到有关iOS , watchOS , tvOS和OS X应用开发的新知识。 随意添加自己喜欢的。 http://swiftsandbox.io http://www.cimgf.com http://ios-goodies.com http://en.swifter.tips https://littlebitesofcocoa.com https://iosdev.tools https://www.natashatherobot.com http://appcoda.com http://iosdevweekly.com https://www.objc.io http://swiftdevweekly.co http://realm.io http://useyourloaf.com http://nshipster.com http://nsscreencast.com http://www.pomo.tv http://www.cocoawithlove.com https://www.skilled.io https://www.weheartswift.com http://www.sososwift.com https://www.mikeash.com/pyblog/ http://swiftdeveloperblog.com http://jamesonquave.com http://www.learnswift.tips

如何使用AppToolkit.io上的Screenshot Builder制作出色的截图

您希望全世界下载您的应用程序,因此需要确保您有一些精美的屏幕截图来讲述您的故事。 Apptoolkit.io是帮助您制作这些屏幕截图的一种工具。 (Apptoolkit是以前使用Launchkit.io的人们的替代工具。) 首先,了解您的价值主张。 您的应用程序做什么? 它为您的用户解决了什么问题? 哪些功能在您的潜在用户中创造了“啊哈”时刻? 考虑到这一点,请从您的应用中找到5个截图(可以在设备上或在模拟器上)回答这些问题。 分辨率越大越好,AppToolkit.io将生成iTunes,Google Play或任何其他用途可能需要的所有大小。 这是GoLocalApps提供的培根使一切变得更好的应用程序的初始屏幕截图。 一天中的每一餐都包含200种出色的培根食谱(包括健康食谱和饮料,谁知道呢?) 首先,创建一个帐户并登录。不需要信用卡,并且每个服务都有免费的层级。 接下来,选择您要为其截图的平台。 iOS将为您提供iPhone框架,Android将为您提供Android手机框架。 您可以从此处上传屏幕截图,可以从itunes帐户获取现有屏幕截图,也可以从图像网址添加屏幕截图。 然后选择您要使用的设备颜色。 您可以稍后更改。 某些设备是专业版功能的一部分(每月19美元)。 然后,您可以自定义屏幕截图。 在手机上方或下方添加文本,更改字体,背景颜色或图像,并使屏幕截图完全符合您的要求。 完成第一个操作后,您可以执行第二个操作,依此类推。 完成所有5张屏幕截图后,您就可以将所有不同大小的iTunes导出为zip文件并上传。 现在就可以了。Apple允许您使用一个集合,现在可以调整它们的大小,但是如果出于其他原因需要其他大小,现在就可以使用它们。 在这里,培根的最终屏幕截图使一切变得更好。 现在饿吗? Apptoolkit.io 是面向应用程序开发人员和营销人员的一组工具。 制作精美的屏幕截图集,应用登录页面并跟踪您的评论。 AppToolkit.io是GoLocalApps提供的一项服务 ,该 服务 自2010年以来一直在开发应用程序,并且多年来拥有一些畅销和下载的应用程序。

在iOS上使用dev dev编程器可以使用Swift吗?

Android的实际运行状况,iOS的交互运行情况,iOS的运行状况存在差异。 在iOS上的编程程序中,像以前的程序一样,在iOS上编程的程序是:在程序设计程序中,例如:quesãoqueséemdo do lado,a lado dasédificuldadesapenas nos vedam de ver。 安装Xcode(免费); Um iPhone(opcional,pois o xcodejápossui simuladores); Estar注册服务商(免费)。 苹果公司负责人,苹果公司负责人。 Mas por outro lado,解决方案,Mac OS的安装和PC的存在,以及互联网的便利性。 Android的程序参赞者和Android的协作者: Android系统; Em MoitosPaísescomoMoçambique,Android商店和PlayStore发行人; 初创企业和经验丰富的开发商都对iPhone和iPad的Android应用程序进行了深入的研究。 在iOS设备上运行时,受益人包括: 在iOS上存在存在的问题。 苹果在Google Play上的应用商店,商店,商店或应用商店中的苹果均未注册,请在App Store上直接下载(下载文件)。 iOS的发行量证明了Android的正式授权。 iPhone的最终购置权,公用事业的购置权,以及iOS的公开发行权。 Desde os anos 1990 muitos desenvolvedores,desenvolveram Software para asplataformas da Apple usando Objective-C,uma linguagem deprogramaçãobaseada na na linguagem C.Mas as […]

您的意见不够愚蠢吗? —一种无需模拟器即可运行测试的方法

嗨! 如您所见,这篇文章的标题由两部分组成。 “ 您的观点足够愚蠢 ”是指在项目中的类之间管理代码,这确实是一个有趣的话题,但是还有第二部分-“ 一种无需模拟器即可运行测试的方法 ”。 管理代码是非常简单的主题,您可能知道这部分的内容,但是我如何在没有模拟器的情况下运行测试? 我们不是真的需要模拟器来测试应用程序吗? 原来不是! 您的意见不够愚蠢吗? 这是一个简单的模型,将存储有关一个人的信息。 这里的问题是我们的观点对正在发生的事情了解太多! 我们如何改变它? 让我们看一下MVVM模式,它将使我们可以将这些知识转移到另一个地方。 您可以在此处找到有关架构模式的更多信息 使视图变得愚蠢是获得更易于测试的更干净代码的好方法。 现在,我们可以轻松地测试ViewModel,以查看它们是否按预期工作。 由于我们的业务逻辑与布局分离,这一切皆有可能! 一种更快运行测试的方法! 您可能已经注意到,每次为iOS应用程序运行测试目标时,也会启动一个模拟器。 一段时间后您就习惯了,没关系。 只需要更长的时间。 而且我们还是必须运行模拟器……还是我们? 为什么每次运行测试都会启动模拟器? 好吧……我们需要UIKit ,它是我们应用程序中的依赖项。 UIKit是iOS特定的库。 但是我们的逻辑代码中不再有UIKit了,对吗? 这是否意味着我们应该能够在无需启动模拟器的情况下测试应用程序逻辑? 答案是肯定的! 最近,我开始考虑将大型项目介绍给许多较小的框架。 如果我的逻辑没有紧密结合,那么这应该不是什么大问题,如果您有这种区分,那么代码编写的可能性就很高。 如果我的小框架不依赖UIKit怎么办? 我可以轻松地在不同的平台(如iOS,MacOS等)上重用它们。这也是一种可用于测试这些框架的方法。 如果可以在MacOS上使用框架,那么您也可以在那里进行测试! 这意味着您不再需要模拟器! 我们如何准备针对iOS和MacOS的框架? 在下面,您将找到有关如何创建跨平台框架的文章。 这是Anthony Colangelo的“ Xcode跨平台框架”的链接 使用逻辑创建框架之后,剩下要做的是: 创建OSX单元测试套件的目标 作为要测试的目标,请选择以MacOS为目标的框架 做完了! 通过为应用程序的业务逻辑建立单独的框架,我们获得了: 无需启动模拟器即可测试逻辑的能力 不同平台之间的可重用代码 更清晰的代码,在部分中更易于理解 结论 我相信,这种结构化代码的方式可以使您受益匪浅,并且可以使代码和测试更加简洁,而无需花费很多时间来运行。 我想与您分享的一种在没有模拟器的情况下运行测试的方法对我来说是一种“概念证明”。 我愿意在战场上尝试更多,并观察其适用性。 您如何解决这些问题? […]

NSFetchedResultsController问题

编者注:本文最早在iOS 10发行之前发布。Apple自那时以来对CoreData进行了重大更改: NSPersistentContainer现在可以用作标准的Core Data堆栈。 您可能已经注意到的另一个更改是对本文所述的NSFetchedResultsController的长期问题的修复。 尽管iOS的采用率很高,但某些设备仍在运行存在NSFetchedResultsController问题的iOS 9版本。 因此,本文仍然与今天的iOS开发人员相关。 NSFetchedResultsController NSFetchedResultsController是iOS核心数据开发的主要内容。 在iOS 3中引入的此类负责有效管理Core Data实体的集合。 在过去的六年中,我在所有类型的Core Data堆栈配置中都使用了该控制器。 在针对Black Pixel顶级客户之一的最新项目中,我们决定使用标准的“兄弟”核心数据堆栈配置: 一个 NSFetchedResultsController用于从主UI上下文中的商店中获取对象。 此主要上下文仅用于从商店读取。 用于从服务器检索实体的后台上下文已连接到持久性存储协调器,作为主UI上下文的同级对象。 设置主上下文时,只要后台上下文将其更改保存到存储中,就会自动合并来自后台上下文的更改。 令我惊讶的是,我最终遇到了一些奇怪的问题,即NSFetchedResultsController有时与商店的内容不同步:某些与NSFetchedResultsController的谓词匹配的现有实体将永远不会被获取。 如此基本和预期的事情将如何发生? 一些解释和修正 快速的Google搜索产生了很多答案。 特别是其中一个详细说明了NSFetchedResultsController如何进行。 这是给出的说明(注意:FRC = NSFetchedResultsController ): 1.使用与所有对象都不匹配的谓词设置FRC(从而防止将与谓词不匹配的对象注册到FRC上下文中)。 2.第二个上下文更改了一个对象,这意味着它现在与FRC的谓词匹配。 保存第二个上下文。 3. FRC的上下文处理 NSManagedObjectContextDidSaveNotification 但仅更新其注册的对象。 因此,它不会更新现在与FRC谓词匹配的对象。 4.保存时FRC不会执行另一次提取,因此它不知道应该包含更新的对象。 我对第三点的发言感到不安。 这是建议的修复程序: 解决方案是在合并通知时获取所有更新的对象。 这个想法是在NSManagedContextDidSaveNotification userInfo有效内容的一部分的每个更新对象上调用refreshObject(_:mergeChanges:) 。 另一组说明(例如,文章“ Core Data Gotcha”和“带谓词的NSFetchedResultsController忽略了从不同NSManagedObjectContext合并的更改”)提到当NSManagedContextDidSaveNotification 被触发时,某些对象可能是主上下文中的故障,因此需要在调用mergeChangesFromContextDidSaveNotification()之前触发这些故障。 这里的想法是在NSManagedContextDidSaveNotification userInfo有效内容一部分中的每个更新对象上调用willAccessValueForKey(nil) 。 然后调用mergeChangesFromContextDidSaveNotification() […]