Tag: Ios开发

大中央调度-Swift 3

Grand Central Dispatch或GCD是一种在我们的iOS应用程序中处理多任务的方法。 该系统的工作方式是可以将许多任务发送到调度队列,而调度队列又将在多个线程上运行,并最终由系统进行管理。 当我们尝试在其中一个应用程序中更新UI时,常常会想到GCD。 这些更新发生在主线程上,但是我们可能需要执行其他任务,并且这些任务可以在并发线程或后台线程上运行。 要添加一些上下文,队列是可以在主线程或后台线程中同步或异步运行的代码块。 使用队列时,我们可以使用Apple提供给我们的全局队列,也可以创建自己的自定义队列。 应该注意的是,全局队列应该谨慎使用,因为我们不想滥用它们。 为了更好地理解其中一些概念的含义,让我们直接进入代码并创建队列。 let queue = DispatchQueue(标签:“ queue.1”) 在这里,我们创建了一个自定义队列,并为其分配了唯一的标签。 您所说的标签完全是任意的,但最好为其命名与您的应用相关。 我们可以在这些队列上调用不同的方法,例如异步与同步。 这些关键字将告诉我们的应用程序如何执行我们的代码。 这是我们的代码在后台线程上同步运行而在主线程上运行的代码的示例。 //后台线程 queue.sync { 对于i in 0 .. <10 { 打印(“🔷”,i) } } //主线程 对于20中的i。<30 { 打印(“⚪️”,我) } 如果运行此代码,我们将看到如下所示: //打印:🔷0🔷1🔷2🔷3🔷4 … ⚪️20⚪️21⚪️22⚪️23⚪️24 … 我们的程序将在主线程上运行的for循环处停止,因为它是同步的,因此它可以在队列中执行我们的代码块。 如果我们将队列更改为异步,我们的应用程序将可以在主线程上自由运行代码,并且还将同时在队列中执行代码块,因此我们得到如下信息: //打印: 🔷0⚪️20🔷1⚪️21🔷2⚪️22🔷3⚪️23🔷4⚪️24🔷 … 尽管主线程是应用程序中的最高优先级,但是我们也可以指定队列的重要性,并让我们的应用程序知道如何确定任务的优先级。 该规范称为服务质量 (QOS)。 QOS是一个枚举,我们可以按从最高优先级到最低优先级的顺序将以下值分配给列出的队列。 .userInteractive .userInitiated 。默认 。效用 […]

MVVM + FlowControllers路径的动机–杰出发明–中

有许多种构建iOS应用程序的方法。 MVC(模型视图控制器),MVP(模型视图演示者),MVVM(模型视图模型),VIPER(视图交互器演示者实体路由),Redux……当然,您可以命名其他许多名称。 我已经编写iOS应用程序已有一段时间了,并且我注意到MVVM + FlowControllers方法对我来说非常有效。 在这篇文章中,我想重点介绍“为什么?”,而不是其他方法,以及“如何?”,我在自己的应用程序中使用了它。 为什么? 开始 开始iOS开发通常与学习基本模式有关,您可以使用这些基本模式来解决在尝试在应用程序中创建第一个屏幕时遇到的问题。 MVC很可能是第一个处理您的视图和逻辑的模式,该模式在iOS开发人员中非常流行(不仅限于它们)。 这主要是由于Apple在UIKit框架和您可以在其教程中找到的代码示例中大力推广了这种模式。 MVC不好吗? 是! 这是最糟糕的! 这会导致Massive ViewControllers出现在您的应用程序上……开个玩笑…… 不,这不对。 当我最近阅读“关于iOS应用程序体系结构的很多话”一文时,我感到非常高兴。 我不能说我完全同意那里所说的一切,但是我可以肯定地认同某些部分。 为什么我很高兴阅读这篇文章? 因为这句话: “没有人会强迫您在一个控制器中实现多个数据源。 在viewDidLoad中发起网络调用。 在UIViewController中解析JSON。 用Singleton实例硬连接View。” 许多开发人员将MVC的混乱和混乱归咎于MVC,而这实际上是由开发人员自己造成的。 如果您缺乏纪律,那么即使VIPER也无法为您提供帮助。 某些模式可能使更容易正确地构造代码并保持代码整洁,但是是否遵守纪律始终取决于您。 如果最后还不错,我应该使用MVC吗? 如果我是一名熟练的顾问,我可能应该说“这取决于”。 MVC显然有其优点和缺点,我敢打赌,您会发现许多很棒的文章将帮助您下定决心。 为什么选择MVVM? 如果MVC还不错,那么我遵循MVVM路径的动机是什么? 仅举几个例子: 它使我可以将代码的很大一部分远离UIKit (这是一种可以更快地测试此代码的功能–作为macOS框架)。 它使我能够测试驱动视图的逻辑。 它与反应式编程方法非常有效(但您无需使用它们即可从MVVM中受益) 所以现在,在采用了MVVM模式的原理之后,我能够拥有被动视图(尽可能愚蠢)和驱动视图的逻辑,这些逻辑也与UIKit分离。 为什么不采用像VIPER这样的模式真正很好地定位的划分方法呢? 好吧…你可以做到的。 我以前从未在大型项目中使用过VIPER(很高兴听到您对此的看法!),但是,我想说这种模式对于中小型应用程序可能是一个简单的过大杀伤力。 我认为,如果您想让您的解决方案易于理解,同时又能够轻松测试您的代码,并与依赖于UIKit的代码区分开,那么MVVM会非常有效。 流量控制器 使用它们的动机是什么? 在ViewController“ A”内找到负责转换到屏幕“ B”的代码时,这并不稀奇。 这种方法的问题是,突然之间,您在这两个实体之间建立了紧密的耦合,如果您想在其他情况下拆分或重用它们,可能会遇到麻烦。 好吧……问一个问题总是很好–这是一个问题吗? 如果您正在做一些简单的事情,那么使用这种导航可能会很好,但是,如果您要处理更复杂的事情,添加flowController肯定会有所帮助。 请记住,添加flowController并不是一项高成本的任务-即使在简单的应用程序中,我也倾向于使用它们,因为它们可以帮助我更好地组织代码并让我对应用程序中导航的工作方式有个很好的了解。 将flowController添加到您的应用将帮助您: 使屏幕彼此分开,这将使您可以模块化并轻松地重复使用它们。 控制应用程序各部分的流程(您可能会有许多不同的flowControllers) […]

在Swift中使用ReachabilityManager处理可访问性的Internet连接

移动开发人员通常会遇到设备的连接问题,情况很多。 设备可能会失去其互联网连接,连接状态可能会意外更改并可能重新连接。 因此,作为IOS开发人员。 我需要可以期待这种状态的改变。 我们的应用必须处理这种状态更改,以干净的方式正确响应这些事件。 因此,我在我的Swift应用程序中使用了Ashley mills / Reachability.swift的库,我正在努力处理这种情况。 ashleymills / Reachability.swift Reachability.swift –用闭包 github.com 在Swift中重写了Apple的Reachability。 但是还有更多,我也需要处理许多实现细节。 所以我建立了一个Manager类,混合了所有可能的状态。 这是ReachabilityManager类; 因此,让我们深入研究细节。 我们想知道我们的应用程序连接在三种可能的情况下何时发生变化。 当应用未连接时, 通过Wifi连接该应用时, 通过WWAN连接应用程序时。 Manager包括Reachability提供的一种通知机制,用于观察上述的可达性更改。 因此它通知我的其他班级来管理错误状态,UI更改或更新(本文中不包括)。 您可以在那里进行自己的实现以捕获更改。 最后,如果您需要在应用启动时检查连接或您的应用需要特定情况,则可以在AppDelegate#didFinishLaunchingWithOptions中调用ReachabilityManager 。 守卫ReachabilityManager.isUnreachable()== true否则{return} 您可以使用静态方法(.ie isReachable)。 简单。 感谢您的阅读。

移动数据库优化:领域与SQLite

在这个故事中,我将告诉您我们如何开发结构化方法来解决复杂的技术问题,并成功地将应用程序的性能提高了30倍。 我们开始收集具有技术要求的新企业应用程序的开发。 最初,我们发现我们的应用程序应包含以下主要功能: 包含图表的报告 一个简单的任务跟踪系统 公司全体员工名单 所有这些数据也应可供脱机使用。 听起来不太难,对吧? 我们是这样认为的。 我们基于JSON进行了客户端与服务器之间的交互,并基于SQLite进行了脱机数据在移动设备上的存储,从而获得了最初的技术堆栈。 在iOS上,我们使用了几年前非常流行的CoreData包装器MagicalRecord。 今天,这绝对是一个错误的选择,因为它是用Objective-C编写的,并且在过去3年中没有任何更新。 但是,在2014年,它是免费的,开源的,并且在GitHub上拥有1万颗星,但是主要原因是缺少其他选择。 在Android上,出于相同的原因,我们决定使用ORMLite。 在开发过程的早期,一切都很好。 我们的开发服务器上有一些演示报告和数十名员工。 但是,在将产品卖给第一个客户之后,我们就遇到了严重的性能问题。 后端团队的同事将客户生产数据库的一部分导入了我们的测试环境。 而且我们发现我们的应用尚未准备好与20万名员工一起使用。 下载完整列表花费了5到10分钟,滚动性能很差,搜索根本不起作用。 这不是我们最终用户所期望的。 另一个问题是报告。 其中一些包含具有数百万个点的图表,因此我们遇到了同样的问题:两个平台上的下载速度缓慢且性能不佳。 我们试图进行一些修复,将分页引入客户端-服务器请求并将批处理写入本地数据库,但是我们无法将性能提高得足够高。 对我们来说幸运的是,我们的销售部门与客户签订了长达6个月的合同,第一部分是更新一些内部系统,因此我们需要一两个月的时间来解决问题。 我们了解到,我们需要对发生的问题进行全面研究,而不是编写混乱的错误修复程序。 下面我将详细介绍我们的方法。 这项研究 我们从优化员工名单绩效开始。 经过几次快速修复错误的失败尝试之后,我们决定将下载员工列表并将其显示在UI中的过程分成较小的步骤,并测量每个步骤的持续时间,以找出需要解决的问题。 最后,我们发现等待服务器响应(30秒)并写入本地数据库(5-10m)是整个过程中最长的两个部分,而其他部分仅花费了几百毫秒,因此不需要注意。 服务器响应 在进行任何优化之前,我们只需要下载一次完整的员工列表即可。 之所以选择这种方法,是因为此列表的任何一部分对最终用户都没有任何价值。 没有人希望看到姓氏以字母A开头的员工。我们的用户需要完整的列表才能访问所有联系人并执行离线搜索。 我们还具有喜欢的联系人功能,可通过我们的服务器在用户设备之间进行同步。 首先,我们将喜欢的数据移动到本地数据库中的单独请求和单独表中。 那并没有给我们带来巨大的性能提升,而是让我们在服务器端启用完整员工列表的内存存储。 响应时间优化的最后也是最重要的部分是引入增量更新。 如上所述,我们在服务器端将完整的员工列表存储在内存中。 它将响应时间从大约30秒减少到仅1-2秒,由于网络延迟,我们无法再将其缩短。 与后端和销售团队讨论了我们的解决方案之后,我们还发现员工名单通常每天仅可以更新一次,因此无需进行更频繁的更新。 因此,为了减少服务器端的负担并加快移动客户端上的数据库写入速度,我们引入了增量更新。 首次安装后,我们的应用程序立即下载完整列表,但第二天它要求服务器进行一次小的增量更新,以提供最新数据应用程序的版本(时间戳)。 本地数据库优化 增量更新极大地减少了员工列表更新时间。 但是,我们仍然有两个问题: 由于SQLite的写入速度,初始加载太慢 由于完全相同的原因,应用少量增量更新(例如,在两周不活动之后)也花费了很多时间 在批量编写没有提高性能之后,我们决定尝试其他方法。 我们有一个假设,在我们的案例中,SQLite或MagicalRecord都是瓶颈。 因此,我们提出了两种可能的解决方案: 切换ORM 与其他数据库切换SQLite 我们没有找到MagicalRecord的替代品,因此决定使用CoreData。 […]

我与Map kit iOS的战斗

在继续阅读之前,请简要介绍一下我。 在过去的1年中,我是一名自学成才的敏捷开发人员,在此之前,我是使用Microsoft技术进行开发的Windows / Web开发人员。 还使用PhoneGap在几个混合移动应用程序中工作。 这很重要,因为您需要根据我的观点阅读这篇文章。 一个对Mac World完全陌生的人,直到我开始开发iPhone应用程序之前,他甚至都不拥有Mac。 我们创建的PhoneGap应用主要有两种,数据列表和包含地图的应用。 使用PhoneGap时遇到了一些麻烦,我的公司不得不做出重大决定,转向使用本机应用程序。 所以我受命接管iOS 。 首先,我们创建了一个数据列表应用程序,该应用程序以很高的成功率退出市场,然后我们将新的重要事物转移到了Map上 。 该应用需要交互式地图:已实现 应在地图上列出100多个注释图钉:已实现 应该有一个弹出列表,列出注释引脚的详细信息 应该有更详细的注释图钉信息 我环顾四周,试图找到如何使其更具吸引力和直观性。 从Uber和其他类似应用中获得灵感。 我所能实现的一切都在下面,并且也已发货。 这就是我所能实现的。 我想要的更多。 几周前,我偶然发现了MapKit WWDC 2015的新增功能。它提到了detailCalloutAccessoryView 。 这帮助我实现了想要的目标。 您可以在下面看到结果 您猜对了,它在Annotation弹出窗口中是UITableView 这已经足够好了,但是我需要额外的努力。 我想自定义弹出窗口中的顶部标题,以提供更多的交互性 我在网上搜索并找到了一个SO帖子。 由此,我在标题中找到了一种自定义字体的方法。 我使用相同的技巧在此处放置了新视图,并创建了shazzam… 嗯,不是最美观的颜色用法,而是您明白了。 如果您想了解代码,请查看我的Git Hub项目。 注意:这不是一个实际的项目,只是展示如何自定义注释视图 最后一点,当我开始iOS开发时,我可以看到我无法自定义的一组标准和控件。 但是随着您的前进,您会看到iOS Map Kit尽可能具有可编辑性。 同样,所有控件。 越过障碍可能需要一些时间,但最终您会到达那里。 我可以在Twitter和Facebook上找到。

Kommander —管理不同线程中的任务执行

Apple已正式验证我们的Kommander库,并将其添加到Swift Source Compatibility中 。 灵感来自我们Android架构师Wokdsem的Java库Kommander。 Intelygenz iOS团队已经合作从头开始编写该库,并对其进行了优化以在iOS,tvOS,watchOS或macOS上有效地工作。 El Pais或Los 40等应用程序可将其用于所有网络,数据库和核心请求,并且它是新的Intelygenz iOS体系结构的一部分 。 但是它是什么,它有什么作用? 意图 将同步执行封装为对象。 控制执行线程/队列。 支持执行取消。 将调用操作的对象与知道如何执行操作的对象分离。 能够同时或顺序执行多个操作。 独立于任何上下文封装执行所需的所有内容。 始终知道执行状态。 问题 OperationQueue和DispatchQueue的功能不足以自己完成此操作。 解 通过遵循命令设计模式来实现我们自己的并发库。 科曼德 Kommander是一个Swift库,用于管理不同线程中的任务执行。 通过定义,一个简单但功能强大的概念Kommand。 特征 制作一个或多个命令 执行命令或多个命令 取消一个或多个命令 设置命令成功阻止 设置命令错误块 主线程分配器 当前线程分派器 自定义OperationQueue调度程序 自定义DispatchQueue调度程序 执行一次或多次操作 执行顺序或并发块 执行DispatchWorkItem 科曼德州 与watchOS兼容 与tvOS兼容 Swift 2版本 Objective-C版本 安装 Kommander可通过CocoaPods获得。 要安装它,只需将以下行添加到您的Podfile中: pod ‘Kommander’ 或者,您可以使用迦太基安装它: github “intelygenz/Kommander-iOS” […]

适用于初学者的iOS开发。 第3部分:准备面试

在本教程的最后部分,我将指导您如何为初级开发人员职位做第一次面试。 正如我在本文中提到的那样,我参加了关于我的职业这两个角色的数百次采访。 大约10年前,我开始了iOS开发人员的职业生涯,可以肯定的是,今天的要求会更高,但是如果您准备得很好,就会成功。 当我只有中层职位时,很少几次我甚至雇用了经验最少的人。 它怎么发生的? 他们证明自己很聪明,可以完成任务。 检查本文以了解该做什么和期望什么。 必要的知识 参加面试之前,请确保您已准备好。 下面,我将为您提供通常讨论的最重要领域的简短清单。 Swift语言功能 正如我在本教程的第一部分中提到的那样,Swift是iOS App开发的第一选择。 而且您需要知道如何使用它。 这里列出了即使在纸上也应该能够写的最重要的东西: 创建变量,了解let / var差异 了解让选件如何工作(如果满足条件) 参考文献薄弱,一些基本的内存管理知识也将是不错的补充 使用数组和字典(创建,计数,插入,删除) 使用字符串(创建,计数符号,添加子字符串) 创建自己的结构,类和方法 If..else和switch..case条件 For周期 Xcode Xcode为您提供了一个非常用户友好的界面,因此,很容易学习如何使用它。 你应该能够: 创建一个新项目并附加CocoaPods 在iOS模拟器和设备上运行您的应用 调试您的应用(使用控制台输出了解问题所在) 将您的应用提交到App Store 界面生成器和UIKit Interface Builder是Xcode的一部分,您可以在项目窗口中打开XIB或Storyboard文件时看到它。 目的是使构建用户界面尽可能容易。 UIKit框架是iOS SDK的一部分。 它包含UI组件和控件。 使用Interface Builder,您可以使用UIKit组件而无需编写任何代码。 这就是为什么我这次将两者结合在一起的原因。 你应该能够: 在Storyboard中为您的应用( UINavigationController , UITabBarController , UISplitViewController )创建导航模型 了解新的ViewController的模式表示和UINavigationController推/弹出机制之间的区别 使用Storyboard Editor创建一个新的ViewController并将其与代码中的类连接 在ViewController之间创建序列 […]

作为iOS开发人员实习生的12周-第二周

前iOS主管一直给我留下的一句话是始终追求卓越。 我本周每天醒来,在上班途中考虑这一点。 这周,我开始研究项目的一些屏幕和错误修复。 这是第二周我学到的一些东西: 一致的约束插入量/偏移量-使用一致的约束插入量和偏移量时,最好将它们包含在结构中,这样约束中就不会乱扔随机数。 例: 我得到的数据具有枚举类型,且其关联值均为“ asap”或Date类型,两者均为关联值。 我必须从数据中获取日期,但我一生都无法弄清楚。 访问没有关联值的枚举的通常方法是使用(.dotNotation)。 这对我不起作用,因为这不是您访问枚举的关联值的方式(请坚持这种想法)。 这导致我尝试了一些复杂的整理方法,将数据转换为字符串,结果是: 字符串“ date(“ 2018–07–07 11:00:00 +0000”)” 然后使用.dropFirst()和.dropLast()的字符串处理方法删除“ date()”部分,最终导致 字符串“ 2018–07–07 11:00:00 +0000” 但是由于某种原因,我尝试使用Date方法将此字符串转换为不起作用的日期….. 这是我终于向经理寻求帮助的时候。 他确认我的最初直觉是正确的, 我应该通过数据枚举的关联值来访问日期! ;-; tldr:有两种方法时: 一种简单的方法应该可以工作,但您无法弄清楚或 一个漫长而复杂的方法,这可能是您应该获得帮助的时候,因为这是浪费开发人员时间的方式。 如果我刚刚问这个问题,我可能会节省很多时间,这将花费一分钟使我走上正确的道路。 学过的知识! 无论如何,这是如何访问枚举的关联值: 通过打开枚举 通过大小写访问关联的值 3. 如何从Date()中完全拼出月份和月份的顺序日期 例如:日期(2018–07–07 11:00:00 +0000)—> 2018年7月7日 据我所知,Apple没有提供给您拼写出月份和顺序日期的方法。 所以这就是我的做法: 你这周学到了什么?

Swift与Objective-C:Swift开发的7大好处

iOS在包括美国,英国,加拿大和澳大利亚在内的全球多个主要市场中占据主导地位,被认为是商务应用程序的首选移动平台。 实际上,就应用程序收入和采用率而言,iOS已证明胜过其主要竞争对手Android。 然而,新兴技术将iOS应用程序开发的快速性和可用性提升到一个新的水平。 忽略它们对于每家现代公司来说都是判断失误。 选择合适的技术栈是构建iOS应用程序时需要做出的最重要的决定之一。 这就是为什么在过去的几年中,Objective-C与Swift的困境一直是人们讨论的热点。 背景 Swift是Apple创建的一种通用而强大的编程语言,它是Objective-C的现代替代品。 自2014年正式发布以来,Swift经历了很长的路要走,从引起争议和经常受到批评到成为最受欢迎的编程语言和最受追捧的技术技能。 该语言主要用于构建iOS,Mac,Apple TV和Apple Watch的应用程序,已被iOS社区的开发人员迅速采用。 随着苹果公司最近的“大动作”,开源其全新的编程语言,在iOS开发人员社区的共同努力下,Swift有望实现更快的增长。 许多最有才华的开发人员都在早期采用Swift,并将当前的项目转移到它上,这对于如此年轻的技术而言是非凡的。 但是,它的前身似乎不会很快失去立足点:Indeed.com代表的趋势表明对Objective-C开发人员的稳定需求。 因此,至少到目前为止,这两种语言将继续在iOS生态系统中共存。 只要使用最新版本的语言,使用Objective-C(或与Swift结合使用)运行应用程序构建就可以了。 除此之外,完全在Swift上构建新应用程序有多安全? 这种方法有什么好处? 通过使用实际案例和具体示例,以下信息包含了我们对Swift必须提供的好处的看法。 Swift的好处:为什么要为新项目选择Swift? 1. Swift应用程序快速且高效 从一开始,Apple就将Swift定位为一种快速,轻量级的语言(嗯,它的名字不言而喻)。 根据苹果公司发布的官方信息,Swift比Objective-C快2.6倍,并且随着每种新语言版本的增加,这一数字也在增长。 对于面向客户的应用程序,即使速度差异很小,也可能是决定产品成功与否的关键因素。 如果您的产品需要处理繁重的计算或具有复杂的业务逻辑,那么速度和性能就变得更加重要。 这就是Swift成为构建快速高效的面向消费者的应用程序的首选技术的原因。 另请阅读:在雇用应用程序开发人员之前要询问的10个问题 2.提高团队生产力和幸福感 Swift代码真的很接近自然英语。 简洁明了,这对开发人员的生产力产生了积极的影响。 作为Apple开发人员工具生态系统的一部分,Swift提供了所有必要的现成工具。 除了良好的旧XCode外,Swift还为开发人员提供了绝佳的机会,即可以通过使用Swift Playgrounds即时查看运行中的代码。 所有这些方面使Swift开发变得快速高效。 反过来,这意味着可以为您节省更多的时间和金钱。 此外,根据Stack Overflow Developer的调查,Swift连续第二年仍是最受欢迎的编程语言之一。 开发人员对语言完全钦佩,这一事实极大地促进了开发人员的动力和生产力。 另请阅读:创建应用程序需要多长时间 3.建立时考虑到安全性 使用Swift,您的开发人员可以使用高级错误处理来避免在Objective-C中发生的大多数典型错误。 在Objective-C中,某些缺陷可能不会引起注意,并且以后可能导致无法预测的系统行为。 减少了反馈循环,因为Swift代码中的错误可以通过编译器错误看到,并且可以立即得到解决。 结果是减少了生产中的崩溃和错误,从而大大减少了开发测试阶段所花费的时间和金钱。 4.您的应用程序将面向未来 正如Lyft的首席工程师Martin Conte Mac Donell所说:“使用现代工具为Apple已经计划的一切打开了大门-新平台,新设备。” 实际上,Swift提供了开箱即用的工具和资源,可为Apple生态系统中的每个设备(从Apple Watch到Apple TV)构建应用程序,这意味着100%的兼容性,使您可以充分利用硬件的潜力局限性。 […]

使用WebKit从Swift调用WKWebView JavaScript和从JavaScript调用Swift

许多移动应用程序都将远程网页合并为被动(静态)内容,或者在这种情况下作为UI的组成部分。 使用此处介绍的WebKit / WKWebView技术,您的本机应用程序可以更好地与Web内容集成,并为最终用户提供卓越的体验。 Swift和JavaScript之间的双向集成 在本文中,我们将构建一个完整的混合本机/ Web应用程序示例,该应用程序在本机iOS应用程序(用Swift编写)和移动网页(用HTML / JavaScript编写)之间使用双向函数调用。 通过利用这两个功能,我们可以构建一个高度健壮的混合应用程序,其中本机和Web组件作为平等的合作伙伴协作,以提供有价值的客户解决方案。 解决方案概述 最终的解决方案包含两个组件: 在Swift中开发的本机iOS应用程序 托管在远程Web服务器上的静态HTML / JavaScript网页(在本例中为Microsoft Azure托管)。 完成学习的应用程序实现了三个主要功能: #1-从远程加载网页。 如果您使用过WKWebView,那么您将了解所有有关此功能的信息。 加载UIViewController时,会将网页URL设置为WKWebView,该WebKView使用HTTP GET方法获取HTML内容。 #2 —从Swift操纵WebView的外观。 接下来,我们通过向WKWebView内容页面发送命令以根据本机Segment控件中的用户选择来更改页面背景颜色,来轻而易举地进入互操作性领域。 #3-从HTML / JavaScript回调到Swift。 最后,通过将本机iOS应用程序中的地理位置功能公开到网页,我们使解决方案更加复杂和有趣。 当用户输入地址时,在Web视图页面上按一个按钮,将完成以下操作: 网页(使用JavaScript)调用Swift函数,将用户输入的地址作为JSON对象传入。 Swift本机应用程序使用CLLocation异步调用Apple,以确定用户输入地址的纬度和经度。 从Apple返回纬度/经度时,Swift本机应用程序将调用网页中的JavaScript函数,以使用输入地址的纬度/经度来更新网页。 解决方案演示 在遍历代码之前,让我们演示完整的应用程序的外观(动画GIF)。 UI故事板设计 学习应用程序包含一个名为ViewController的 UIViewController。 ViewController在Storyboard中只有两个UI控件: 一个UISegmentedControl,允许用户将WebView背景颜色更改为五种颜色之一。 UIView,放置在情节提要中,用作WKWebView控件的容器视图。 更改网页颜色 为了深入研究混合解决方案,让我们实现一个从 Swift 到 WKWebView的简单调用。 ViewController具有与本机视图顶部的Segment控件中的颜色选择相对应的颜色成员数组。 让颜色= [“黑色”,“红色”,“蓝色”,“绿色”,“紫色”] 当用户在Segment控件中点击新的细分时,事件处理程序将调用JavaScript函数changeBackgroundColor ,并传递与用户选择相对应的字符串: @IBAction func colorChoiceChanged(_发送者:UISegmentedControl){ webView.evaluateJavaScript […]