在为Apple Watch编写应用程序之前,您需要了解的内容:我们的经验

一个非常慢的平台在等着您,过渡到新框架,在特殊的环境下进行测试,并在强制卸载线程之前一秒钟从操作系统发出“嘿,快”的通知。


是的,这是我的毛茸茸的手,

我们的火车时刻表每天要看60万人。而且每年都越来越多-通过移动应用程序。我们考虑并决定为该表制作一个版本。问题在于我们不知道俄罗斯市场上有多少Apple Watch,以及有多少人乘坐电动火车。但是无论如何,有必要弄清楚如何做到这一点,所以我们带着信给苹果,要求提供统计信息。

奇怪的是,他们没有。然后他们以各种可能的方式进一步提供了帮助,但是这里的统计数据直接带来了麻烦。一年前没有人拥有正常数据,即使研究销售报告也无济于事。手表从很多方面被带到了“灰色”,而不是最初从我们所在的地区带来。

为什么要统计?了解市场上有几代人。最后,我们决定支持所有设备。


我们知道的2017年最新统计数据如下所示:

  • 第一代(全部)-57%
  • 系列2(全部)-32%
  • 系列1(全部)-11%

展望未来,我们在2019年发布后有三个月是这样的:

  • 苹果手表系列3(全部)-36%
  • 系列4(全部)-31%
  • 系列5(全部)-24%
  • 第一代(全部)-4.5%
  • 系列2(全部)-2.5%
  • 系列1(全部)-2%

最近两个修订的屏幕尺寸分布:

  • S4大为44毫米-58%,小为40-42%。
  • S5大-60%,小40%。

以前的型号仍然有38毫米,在所有安装的总数中,它略少于20%,这主要归功于S3。顺便说一下,我们需要用于不同屏幕尺寸的字体-我们的设计师制作了自适应字体。

平台很慢


因此,我们似乎没有太多设备,但是其中多达5%(按预期)将非常旧。通常,最初的几个小时是经过构思的,就像是一个显示在手机上生成的图片的设备。然后出现了自己开发的OS,在以后的版本中-还有Wi-Fi和SIM卡。

俄罗斯的SIM卡无法使用。也许,今年的运营商会同意,但是目前只有wifi和通过电话进行通信(手表通过蓝牙连接到iPhone,然后使用其Internet连接)。

使用网络,内存和磁盘的逻辑几乎与iOS中的相同。我的意思是,逻辑本身是通用的,服务是通用的,但是仍然存在库的伏击-实际上,开发几个小时的人并不多,因此,iOS / iPadOS上可能没有任何流行的框架和工具。在我们的案例中,这意味着需要放弃通常通过手动操作钩接到iOS应用程序的库堆。

与从内存中读取它们的方式相比,所有手表都毫无例外地进行磁盘访问非常慢。如果在iPhone上您真的不能打扰40 Kb桌子的确切位置,那么在手表上将其保留在内存中或通过空中接收就至关重要。最重要的是不要从磁盘读取任何内容。

当然,时钟越新,一切运转就越快,但是实际上,我们为S3工作,支持较早的设备以及S4和S5的附加功能。

该应用程序的Alpha版本显示了返航路线,加载了数十秒的时间。在最近的4列火车上,MCC时间表显示了20秒。问题出在表格渲染中-单个元素过多。想象一下一个现代的浏览器正在尝试在386SX内核上呈现某些内容。所以我们有类似的问题。

自然,这就是为什么她要与她一起四处张望。通过beta版,我们将负载分散到了线程上(捕获了一个功能,即当时钟在watchOS 4上启动时,主入口点不在主流上启动)。对于“弱”小时,接口中的单元数受到限制。


他们每个人渲染约一秒钟。



UI本身进行了一些优化,并转至S4,并且对于较旧的设备,必须减少所显示火车的数量。

它们分别插入“显示已故者”和“显示下一个”的上方和下方,并插入“全部显示”。由于此时间表经常更改,因此通常需要重绘该表格:我们正在讨论的情况是表的组成是由于火车的驶离或时间表的更改而更改的(我们显示实时移动,也就是说,我们知道每个特定位置的确切位置)实际上,以及如何影响路线上的所有其他站点)。

通常在某些情况下,数据在请求后过一秒钟就会过时。通过基本方法,整个表都被扭曲了,这是iOS的标准方法。在那里,通常不会察觉到更新。在这里,他们基于处理传入的数组进行了很多处理,首先解析数据,然后构建差异,然后找到可以更改而不更改其余部分的UI元素,然后仅更新它们。在WatchOS上没有合适的库来提供完整的解决方案,但是有一个Differentiator Kit,它根据带有标记的数据数组,列出了如何以及如何根据索引进行了更改。他们围绕它编写了代码,并将其设置在所有表上。这增加了性能更新。

通常,会迅速显示最近的N列火车,如果您想等待但想要完整的图片,则可以单击“显示全部”。

正如我所说,手表的表盘很大,但速度很慢。首先,我们使用了一组通过磁盘工作的标准iOS库。我们得到了时间表,将其记录在磁盘上,请求了服务,将其从磁盘中取出,并展开到屏幕上。事实证明,您需要将缓存存储在内存中。但是,我们习惯于将所有用户的工作状态保存到磁盘,然后从那里读取它们-我们只需要记录并存储我们可以在内存中存储的所有内容。



为什么需要持续记录?因为如果用户切换应用程序,则卸载几乎立即发生。通常,您没有时间将任何内容写入制动盘,因此您需要在用户工作时不断地进行迭代。

然后我们要进行下一次埋伏。

躁狂节能


手表中的电池很小,并且整个操作系统都经过改进,以尽可能地节省电量。实际上,这可能意味着用户正在执行以下操作:

  1. 开始下载一些内容(例如,完整的日程表)
  2. 降低手
  3. 在等待
  4. 举手看什么装

实际上,发生以下情况:

  1. 用户开始下载完整时间表
  2. 降低手
  3. 手表了解到他们不与他们合作,因此将这一过程模拟为冬眠。
  4. 用户等待,然后举手查看结果。
  5. 上升时,手表知道他们继续与他们合作,唤醒并唤醒过程。
  6. 用户看到下载指示器的开始。

同时,从线程的角度来看,这可能是正确的时间,也可能是“很长的一秒”-如果您在超时时编写代码,那么即使是等待半秒的一年,您也可能会突然发现。因此,只记得时间是相对的。

唤醒过程需要很长时间才能完成调试工作,这可能会导致您崩溃,原因是该场所已空置或发生了其他有趣的事情。

入睡的过程可能会变成卸载过程(不唤醒),因此您需要向磁盘写入一些内容。操作系统告诉“转到后台”线程并调用适当的方法。通常,您需要大约一秒钟的时间才能快速退出并在后台转储。当用户在写入光盘时执行此操作(我记得,在S4以下的设备上这非常慢),可能无法进行记录。为此,您需要进入“重要操作”模式,并在几次特殊调用的帮助下,使线程保持“意识”状态。为此,您需要一个单独的处理程序,该处理程序询问记录过程何时结束,然后释放线程使其进入睡眠状态。

建筑


我们2017年的第一个应用程序只是一个空白,能够显示手机生成的时间表。它用于显示轨道,汽车和位置上的长途火车的数据。

火车的现代版本是“成人”和自主的,也就是说,它可以在没有电话的情况下随时使用。即使从安装的那一刻起(尽管应用程序进入手表的通常方法是通过手机,这时从手机复制配置文件数据和所有选定的路线非常方便)。

手表上的架构可能是iOS模式中最现代的架构。 Redux没问题。正如在“大型”应用程序中一样,我们使用状态机。标准的MVC是这样的:一方面有一个模型,在控制器的中间有此模型的视图。控制器从模型中获取数据,进行转换并在屏幕上显示。在相反的方向上,控制器侦听视图消息并将数据提供给模型。基于此模式,已经创建了许多类型的体系结构。

我们处于一种状态,事件可以在其中发生变化。做有用工作的副作用可能会偏离状态。从这些结果来看,事件飞入了状态。应用程序的完整状态存储在故事中,例如单个事实点。该状态可以分为多个部分,但是在任何情况下,它都存储完整的数据集。体系结构的具体实现取决于宗教,我们有RXFeedback。

测试很好地涵盖了状态机。这样就为我们节省了很多时间,因为无法在手表内部进行测试。这不是适合您的iPhone。在这里,您需要这样做:

  1. 在模拟器上构建应用程序,然后查看。
  2. . , . id Xcode .




我使用S4和S1进行测试。由于很多事情很难在手表上检查,因此隔离特定状态(状态),将它们转移到另一个组件并已经覆盖了各个方面的测试非常方便。

第十个Xcode(在2019年10月之前)感到高兴的是,由于某种原因,当应用程序按时启动时,它停止在模拟器中工作。如果有人感兴趣,可以通过砍掉贸易消毒剂来决定。

因此,在组装具有专用状态和公共逻辑(有很多逻辑)的目标时,需要使它们与时钟兼容。我们不小心钩了UIKit几次,这是手机的UI框架,时钟不支持。如果您不小心选择了发行版,则该库将无法连接。

自治


基本用例-用户拥有手表和电话。他经常将它们固定在一起,手表可以通过电话使用互联网。



随着新手表的发布,可以使用自己的Wi-Fi和自己的时钟SIM卡(有内置的e-sim)。

我们的任务是在两个应用程序(手机和手表)之间同步收藏夹。每次启动时,我们尝试读取最后一个真相,并且每次更改列表时,我们都尝试立即找到第二个设备并将其告知他。事实证明,显然并非总是如此,因此,如果可能,我们在启动时进行同步。如果有两个最喜欢的人遇到冲突,我们认为电话中的内容更为准确,并且我们以他的利益解决冲突。

否则,应用程序未连接到手机。缓存在内部,如果没有的话,则通过时钟通过电话通过网桥从网络发送对网络的请求。因此,您可以根据需要随意使用它,但是您只需要以某种方式首次安装该应用程序(我们的版本不支持直接从该应用程序进行时钟安装)。之后,如果需要,您可以忽略同步。在watchOS 2之前,通常的应用方案是在电话上对所有事情进行计数和完成,而时钟只能呈现结果。


iOS的基本应用程序在这里watch应用程序已与其配对。该应用程序使用该发行版的一个版本,但在特定设备上,它在速度方面适应该版本,并使界面适应屏幕尺寸。在同一位置通过电话进行安装,复制收藏夹和常用路线时的第一个授权。进一步同步或自主存在。通过电话进行地理位置定位(了解您是在莫斯科还是在莫斯科,这是很有必要的,如果您不允许地理定位,则这是时间导向的,会颠覆早晨的要求)。安装的数量几乎与预期的一样(我们考虑到俄罗斯的服务时间不多,而且用户使用的是电动火车)。从评论来看,手表上的应用程序用户很高兴在自动扶梯上看到他们的时间表。

All Articles