Tag: Watchos

用于多平台开发的模块化体系结构:第1部分

这是3部分系列的第1部分。 您可以在这里找到其他部分: 第2部分:接口和框架开发 第3部分:演示和UI 配套项目: Github 驯服海妖 截至2019年1月,苹果在全球范围内拥有14亿台有源设备。 我们中的许多人至少拥有2或3。我们会在一整天在Mac电脑上工作,在iPhone上浏览以及在Apple Watch上浏览之间切换。 我们希望连续性经验是无缝的。 跨平台存在巨大的机会。 但是,很多时候我们将开发工作仅集中在一个平台上。 我们担心会增加复杂性,增加预算和不合时宜的时间表。 我们害怕神话人物- 海妖 。 本文试图驯服怪物。 但是,它不是“快速致富”教程。 为多个平台构建应用程序意味着需要额外的维护,编码,测试,设计/ UX资源,以及将您的应用程序作为系统的全面综合的高级思考。 但是,通过正确的方法,应用一些最佳实践方法和技术,肯定可以以实际有效的方式实现。 下面的示例代表了一个更极端的情况,我们将为iPhone , Apple TV , Apple Watch和Apple TV构建一个幻灯片应用程序。 苹果硬件生态系统的四个触角可供开发。 下一次我们将离开第五台iPad 。 并希望将来HomePod , VR / AR眼镜甚至Apple Car能够完成Kraken缺少的触角。 您的海妖可能会有所不同。 它可能只是一个触手可及的一个iPhone应用程序。 这里讨论的许多原理(例如模块化)仍然适用并且非常有帮助。 继续阅读。 所有伟大的项目都始于良好的架构 建筑 幻灯片应用程序很简单:它将每隔几秒钟显示一次来自Unsplash的随机照片。 根据平台的不同,它还将显示摄影师的姓名,图像描述和喜欢的图像。 我们要做的第一件事是决定如何将所需的功能分解为各个组件以分离关注点。 在我们的案例中,有明确的界限。 将与Unsplash API通信的业务逻辑分离到其自己的模块中是有意义的。 我们将其称为ShowEngine 。 我们还可以将负责按一定时间间隔加载每个映像的运行循环代码分离到其自己的模块/类中,以更接近于单一职责原则。 但是对于这个简单的示例,我们将其放在一起。 […]

苹果手表Nike +を使った感想

Apple Watch Series 2预约开始と同时にポチりましたが,Nike +モデルは本日10月28日に発売ということで,他のSeries 2からは少し遅れた入手となりました。 苹果手表Nike + 新しいApple Watch Nike +は,内蔵GPS,しなやかなバンド,Apple Watch Series 2のすべての优れた机能を备えた,最高のランニングパートナーです 。www.apple.com Nike +は何が违うの? 多分,以下の2点が违うだけです。 耐克専用の文字盘 通気穴の空いた専用スポーツバンド(→品购入不可)→当时はそうでしたが今は単品购入もできます🎉 正直,こんなに待つより他のシリーズで良いのではと思いますが,初代Apple Watch持っていて,それとの机能差も少なめですぐ欲しい度もそこまででも无かったので,何となくデザインとか気に入ったNike +を选択しました。 系列2は初代と何が违うの? 违いはこのくらいです: GPS内蔵 デュアルコア化(系列1も初代とは违ってデュアルコア) 耐水性能アップ(IPX7等级→ISO规格22810:2010にもとづく50メートルの耐水性能) Apple Pay対応 倍スプレイが2倍明るく 0.9毫米分厚く・ 4g程度重くなった ファーストインプレッション というわけで,感想书いていきます。 外観 まず,商品写真では,蛍光色でスポーティーなデザインが気に入っていましたが,开封した时は思ったより微妙に思いました。 Rebuild.fmでのこの発言を思い出しました(・‿・`) に,身に付けるとなかなか良い感じに思えてきて,なんだかんだ気に入っています。 付属のバンドとNike +オリジナルの文字盘の组み合わせだと,「Apple Watch」というより「Nikeのスポーツウォッチ」を付けている感覚になります。逆に,バンドと文字盘を普通のに変えれば,以前通りの感覚になります(´・‿・`)

WWDC 2018’在Ardından

Merhabalar, Apple苹果4战车大战2018年WWDC比赛在derledim举行。 主题演讲视频izlemekiçin:https://www.apple.com/apple-events/june-2018/ EtkinliklepaylaşılanIstatistikler: 20m uygulamageliştirici。 Haftalık500 milyon应用程序商店ziyaretçisi。 Yazılımcılaraödenen100 milarar美元。 iOS 11版本:%81 iOS 12 —更快,响应速度更快—给您带来更多动力。 iOS 11升级到iOS 12版本。 表演者: Uygulamalarınaçılışhızında%40,klavyegörüntülemehızında%50,kamerauygulamasındaise%70oranındabirhızartışıolacak。 Ayrıca股票表%50’ye kadar birhızartışıyaşanacak。 Bu oranlara bakarsak,ciddi bir performansartışıbekleniyor。 CPU是uygulamaaksiyonların表演,并且是art,düşüreceği,innerjikullanımında,tasarrufsağlanacak。 AR: Apple ve Pixar格式和USD格式的USDZ duyuruldu。 SahneyeçıkanAdobe CTO’su Abhay Parasn​​is,保留所有格式。 度量衡,ARkapsamındayeni bir uygulama duyuruldu。 Bu uygulama ile herhangi bir objeninboyutlarınıölçebiliyorsunuz。 ARKit 2 duyuruldu veçokluoyuncudesteğiaçıklandı。 Buna birörnekuygulamagösterildi。 Uygulama […]

使用Apple Watch进行24/7加速度计跟踪

watchOS的人机界面指南 WatchKit编程指南 WWDC 2016 —设计出色的Apple Watch体验 WWDC 2016 — watchOS的新增功能 1.苹果框架:构建基块 1.1后台任务 WWDC 2016 —使您的手表应用程序保持最新 WWDC 2016 — watchOS上的性能架构 watchOS上的应用生命周期 watchOS上应用程序的默认状态not running 。 正在前台运行且屏幕打开的应用程序正在running 。 Dock中的应用程序和活动表面上具有复杂功能的应用程序处于suspended状态,已加载到内存中,可以快速恢复。 运行时未在监视屏幕上显示的应用程序(无论屏幕关闭还是其他应用程序或表面在前景中)都处于background状态,这是严格预算的, 实际上是我们的目标。 Apple提供了四个后台任务选项,watchOS可以将它们传递给扩展委托的handle(_ backgroundTasks: Set)方法: WKApplicationRefreshBackgroundTask是一种常规的后台任务类型,不适用于特定的刷新类型。 这种类型最常见的用例是安排其他任务。 在我们的应用程序中,它用于触发几乎所有工作:从CoreMotion请求加速度计数据,将其写入文件,然后开始将文件传输到手机端。 为了从watchOS接收此类任务,您应隐式请求它。 WKSnapshotRefreshBackgroundTask是一种任务类型,专门用于您的应用程序需要更新其快照(用作启动映像,如Dock中所示)时。 WatchOS会不时将任务分配给Dock中的每个应用程序,但也可以提出要求。 WKWatchConnectivityRefreshBackgroundTask是一种任务类型,用于当您通过WatchConnectivity框架将数据从iPhone传输到手表时。 我们目前不使用它。 WKURLSessionRefreshBackgroundTask是后台联网任务完成后分配给扩展委托的任务类型。 我们目前还没有使用它。 为了请求WKApplicationRefreshBackgroundTask : 2.1.3 SendSamplesOperationQueue SendSamplesOperationQueue责任是SendSamplesOperationQueue的创建和排队。 它跟踪成功和失败的操作,为将要选择的时间块重新填充新操作,具有自己的状态以防止使用外部的精确操作种类进行重新填充(例如,在ShortTasks中,我们希望允许从传感器请求数据只能在前4秒​​钟内执行操作,但只要我们没有任何限制,就可以创建以前准备发送的文件)。 将按以下优先级选择新操作的时间块: 如果连续尝试的次数少于numberOfRetriesIfFailedToSend ,则先前使用的时间戳和先前的文件传输失败。 如果队列的阶段允许,则使用以前使用的时间戳,但不准备发送文件(这意味着该应用在准备文件时被终止)。 如果队列的阶段允许,则将新时间戳计算为最新的先前时间戳+块持续时间 ,如果该时间早于块持续时间 ,则在其他情况下,将不会创建操作并且自我填充将停止,最后执行performWhenEverythingTransferred关闭。 2.1.4数据文件 […]

Apple Watch电池电量充电通知

我决定写这篇关于如何构建watchOS应用程序来解决一个小问题的快速文章。 这里有一个随附的Stack Overflow帖子。 当我从隔夜充电的Series 0 Apple Watch升级到Series 3时,我切换到了更零星的充电时间表。 由于Series 3在一天结束时不会像原来的Apple Watch一样耗尽电池电量,因此我开始过夜佩戴它来跟踪睡眠。 然后,我会每天将其扔到充电器上一次或两次,以保持良好的充电效果。 随机充电足以使它在大多数时间都能正常运行,但有时我会把它留在充电器上而忘了。 有时候在我上床睡觉时会发生这种情况,所以我会入睡,错过了睡眠追踪。 2018年8月,我获得了Oura戒指以追踪我的睡眠。 它通过蓝牙连接到iPhone。 充满电且在有效范围内时,本地通知会到达iPhone: 我喜欢此功能,因此我想尝试将其复制到Apple Watch。 想法是在iOS应用中设置阈值(例如80%),并在配对手表的电池电量达到该水平时在iPhone上收到通知。 可能的解决方案#1 iOS上已经有“今日”小部件,可以显示配对的Apple Watch的电池电量,因此似乎已经有些频繁地将数据发送到iPhone: 这让我认为我可以构建一个简单的iOS应用程序,该应用程序要么观察此电池百分比值,要么使用后台任务定期检查该值,并基于对该值的更改发送通知。 在WatchKit中,有WKInterfaceDevice对象,可在iOS和watchOS上使用,其中包含有关已配对手表的信息。 虽然可以使用WKInterfaceDevice.current().batteryLevel在watchOS应用上获取充电百分比,但该属性在iOS端不可用。 看来Today小部件必须使用私有API才能读取配对手表的电池电量。 可能的解决方案2 我探索的下一条途径是让手表定期将其充电百分比发送到配对的iPhone。 我的计划是在watchOS应用程序中安排后台刷新任务( WKApplicationRefreshBackgroundTask ),以使用WatchConnectivity定期将消息发送到watchOS应用程序。 在佩戴Apple Watch时,这些任务似乎每小时至少运行约一次。 手表会将当前的电池电量发送到配对的iPhone,如果电量超过阈值,则会立即向用户显示本地通知。 在许多情况下,当iOS应用使用sendMessage从手表接收消息时,它将在后台启动,而当使用transferUserInfo则不会。 根据我的测试,这些WatchConnectivity消息将通过Internet而不是仅通过蓝牙发送,因此从理论上讲,当手表的充电超出蓝牙范围时,这也将起作用。 在这一点上,电池电量转移到通知部分是非常可靠的,但是后台任务被调用的频率却不是。 通过添加并发症,可以使手表更频繁地报告其百分比。 这可能会导致watchOS更加频繁地为应用程序后台任务分配时间,例如每15分钟左右一次,但这可能会浪费复杂的空间,除非将其用作系统电池电量消耗的替代品。 官方的并发症可能会更频繁地更新,因为它是操作系统的一部分。 不过,所有这些都不相关。 在充电器上时,这些后台刷新任务似乎完全暂停了。 这意味着当手表在充电器上达到或超过指定水平时,此消息传递解决方案无法将通知发送到iPhone。 佩戴手表时的电池电量通知对于管理电量仍然很有用,因为可以设置比系统的10%通知更高的阈值,并在手表电池电量不足时发出警报。 至少在电量很低之前,这至少可以让人们更加警惕,但是并不能解决最初的问题,即不主动检查“今日”小部件或手表本身而知道何时将Apple Watch充电到一定水平。 因此,这个想法现在几乎是死胡同。 我认为这有几种可能的路径: 苹果内置本机电量级别通知(似乎不太可能) Apple更改了WatchKit,以使必要的变量可以在iOS中访问(也许,但是除了我的通知提示,我无法想到其他用于该目的的其他应用程序) 如果后者发生了,也许我会重新考虑一下这个想法。 如果您还有其他解决方案,请在此处查看Stack Overflow帖子。 可能的解决方案#3 […]

WatchOS 5-Swift上iPhone和Apple Watch之间的通信,反之亦然-第1部分

你要学什么? 使用WKInterfaceTable和管理为Apple Watch制作一个小界面 IBActions-第一部分 使用sendMessage(_:replyHandler:errorHandler 🙂从Apple Watch向iPhone应用程序请求信息—第2部分 从iPhone向Apple Watch发送信息sendMessage(_:replyHandler ) —第3部分 重构我们的代码, 以便在一处管理WCSession 。 —第4部分 使用updateApplicationContext(_ 🙂更新应用程序—第5部分 首先,我们需要一些关于可能性和可能性交流场景的理论: —关于与对方应用进行通信 您可以通过以下任意一种方式启动传输和通信: 🎓Apple 官方文件 –使用updateApplicationContext(_:)方法将最新状态信息传达给对方。 当对方唤醒时,它可以使用此信息来更新其自身的状态。 例如,支持后台应用刷新的iOS应用可以使用其后台执行时间的一部分来更新相应的Watch应用。 此方法将覆盖以前的数据字典,因此当您的应用程序仅需要最新的数据值时,请使用此方法。 –使用sendMessage(_:replyHandler:errorHandler:)或sendMessageData(_:replyHandler:errorHandler:)方法将数据传输到可访问的对应对象。 这些方法用于在iOS应用和WatchKit扩展之间进行即时通信。 当前, isReachable属性必须为true才能使这些方法成功。 –使用transferUserInfo(_:)方法在后台传输数据字典。 您发送的字典排队等待传递给对方,并且在当前应用被暂停或终止时,传输继续进行。 –使用transferFile(_:metadata:)方法在后台传输文件。 如果您要发送的不只是值字典,请使用此方法。 例如,使用此方法发送图像或基于文件的文档。 –在iOS中,使用transferCurrentComplicationUserInfo(_:)方法发送与Watch应用程序并发症有关的数据。 使用此方法会影响并发症的时间预算。 —好吧,现在您知道苹果在两个平台之间进行通信提供了不同的可能性,我们可以开始开发一系列有关如何使用其中最重要的一些教程– 建立新专案 我们将创建一个新项目,为“ 带有WatchKit App的iOS App ”选择模板,并继续执行基本步骤来创建它。 苹果手表界面 现在,我们将为由WKInterfaceTable和WKInterfaceButton组成的Apple Watch创建一个小界面,一个界面紧挨另一个。 接下来,在Table内部,我们将插入WKInterfaceLabel并将其行数设置为0。 表类和标识符 转到界面生成器上的TableRowController项,并将其放入类名,在我的情况下为Row并作为标识符设置相同的名称。 应该与下一张图片具有相同的外观 界面构建器连接 现在,将表从Interface Builder中连接到InterfaceController中的代码,并且还连接按钮的IBAction 。 […]

通过教程更新的非官方watchOS-第4章:UI控件

非官方watchOS通过教程更新主页 p。 80个 watchOS具有超过19个控件。 请参阅第3章。 入门 由于watchOS开发的基础已经稳定,因此本章中的代码很少需要更改。 但是,让我趁此机会做个旁注,因为它与v3.01示例代码略有不同。 是的,我缩进了四个空格🙂 旁注我习惯使用以下方式标记代码: // MARK:-[description] 我是从Udacity iOS开发人员纳米学位的导师那里学到的。 连字符很重要; 您会在轮廓中得到漂亮的分隔线。 这是不带连字符的结果: 这是带有连字符的MARK: 计时器对象 定时器接线 使用标签和按钮控制重量 p。 92我将最小和最大重量值实现为MeatTemperature.swift中的 static let常数。 在查看下面的我的实现之前,请尝试自己做。 我在MeatTemperature.swift中添加了以下内容: 结构常数{ 结构重量{ 静态让minOunces = 1 静态让maxOunces = 32 } } (最大32值不一定是您在生产应用中想要的,因为用户可能会希望烹饪更多的肉,但是选择该值以匹配第5章中的文字) 然后我将其添加到updateConfiguration()的顶部 如果盎司<Constants.Weight.minOunces { 盎司= Constants.Weight.minOunces }否则,如果盎司> Constants.Weight.maxOunces { 盎司= Constants.Weight.maxOunces } 使用滑块对象控制完成 集成计时器 与滚动互动 使用开关更改单位 p。 98我在MeatTemperature.swift中添加了两个新常量 […]

Apple Watch —并发症

Neste artigovocêirácompreender melhor o queéuma并发症,可随时用于实施uma。 Oéuma并发症? Apple Watch的复杂功能和可视化的相关信息,包括Apple Watch的相关应用程序,Apple Watch的相关信息,iOS应用程序的功能,功能和功能。 作为复杂并发症的重要信息,请参见家庭并发症的不同处理。 不同的布局,不同的形式,不同的表观,复杂的表壳,复杂的外观,以及各种形式。 由复杂性引起的动机和复杂性方面的问题,作为手表表盘的人可以将其保留下来。 苹果官方文件将其作为复杂性的家族成员: 圆 模块化小 模块化大 实用小 大型公用事业 超大 一位名叫圣玛利亚·拉多斯·阿尔冈斯的复杂事例,面目全非,Apple的文献资料 科莫funciona? Antes de tudo,重要的军刀并发症功能。 基本配置文件,可配置的uma并发症,最确定的时刻。 举例来说:想象一下,您将因复杂而复杂化,并因应自己的状态,并最终获得身份证明:没有任何权利,也没有权利。 时间轴的可视性和时间信息。 Ela pode ser utiliza para mostrar dados futuros ou dados passados。 时间轴的时间限制,时间轴的时间限制。 官方文件示例: 动手 Agora quevocêjásabe o queé和e que que ma并发症,迷走神经。 在马尼拉,您可以轻松实现以下目的: 在操作系统中使用“包括复杂性”的首字母缩略词,以了解其在以下方面的重要性: 可以使用ComplicationController.swift控件作为数据源和数据源的功能,在本地不等于时间轴的配置。 WatchKit扩展:在目标和目标之间进行选择: 一般情况下,将复杂配置作为运维,将“大型模块化”马尔代夫(ixsero apenas)称为“复杂”。 […]

由教程更新提供的非官方watchOS-第1章:Apple Watch,您好!

非官方watchOS通过教程更新主页 迁移到Swift 4.2时,对启动程序代码的唯一重要更新是,所有iOS应用程序都需要1024×1024图标,并且现在支持4种屏幕尺寸,而不是2种。我已经在启动程序项目中提供了所有需要的图像。 我将在本章的每一节中进行介绍,但是如果不需要更新,它们将为空白。 在下面的文字中,我将引用这本书的PDF版本中的页码。 入门 p。 25当我创建WachKit目标时,XCode版本10.0(10A254a)自动为我生成的方案是 iPhone XS Max + Apple Watch Series 4 — 44毫米 代替 iPhone 7 Plus + Apple Watch系列2–42mm 稍后我们将介绍新的Apple Watch尺寸。 你好,世界 p。 31在XCode 10中,现在可以通过工具栏上的按钮使用对象库。 Xcode 10发行说明说明: 库内容已从“检查器”区域的底部移到了一个叠加窗口,可以像Spotlight搜索一样移动和调整其大小。 一旦拖动项目,它便消失,但是在拖动之前按住Option键将使库保持打开状态,以进行其他拖动。 可以通过新的工具栏按钮,“视图”>“库”菜单或⇧⌘L键盘快捷键打开库。 内容与活动的编辑器动态匹配,因此同一UI可以访问代码段,Interface Builder,SpriteKit或SceneKit项目。 长按工具栏按钮,“视图”>“库”菜单或⇧⌘M键盘快捷键即可使用媒体库。 (37318979,39885726) p。 32更新v3.01文本 底部的工具栏具有“查看方式”选项: Apple Watch 38毫米或42毫米 至 底部的工具栏具有“查看方式”选项: Apple Watch 38mm或42mm以及Apple Watch 44或40mm(系列4) 在代码中设置标签文本 表情符号! […]

通过教程更新的非官方watchOS-第5章:选择器

非官方watchOS通过教程更新主页 入门 代码杀手 选择器显示样式 p。 106 Series 4手表默认启用了触觉反馈。 我不会添加将其禁用到项目的代码,因为默认行为很棒。 但这是一个示例: 覆盖func awake(withContext context:Any?){ super.awake(withContext:context) self.crownSequencer.isHapticFeedbackEnabled = false } 有关更多详细信息,请参阅Apple的WKCrownSequencer文档。 清单样式 堆叠式 序列样式 您的第一个选择器 p。 109这是我的代码编辑版本。 我避免魔术数字。 覆盖func awake(withContext context:Any?){ super.awake(withContext:上下文) // 1 var weightItems:[WKPickerItem] = [] 为我在Constants.Weight.minOunces … Constants.Weight.maxOunces中 { // 2 让item = WKPickerItem() item.title =字符串(i) weightItems.append(item) } // 3 weightPicker.setItems(weightItems) // 4 weightPicker.setSelectedItemIndex(盎司-1) […]