大多数浏览器和
Developer App 均支持流媒体播放。
-
Core Motion 新功能
了解 Core Motion 的新功能。了解您的 app 可以如何利用 iOS 设备上的动作传感器。详细探索计步器的新功能,并学习如何利用高度计来将您的 app 提升到新的水平。利用运动 API 和 Apple Watch 上的传感器数据来贴合个人需求。通过演示了解如何利用运动环境感知功能让 app 变得更加智能!
资源
-
下载
Core Motion中有什么新料
下午好 欢迎大家
我的名字是阿尼尔·卡南加 今天我要讲一讲 Core Motion中有什么新料 我们能讲的事情比较多 不过今天我们主要讲几个关键点
我们会首先谈一谈 Apple Watch 这是我们的一个新的平台 我们会谈谈怎样把你的 Core Motion apps 弄到Apple Watch上 我们也对计步器做了一些 新的变更 其中包括一些新的APIs
我们还会谈一谈高度表 在Phone 6上引入的一个传感器 然后加布里埃尔就会通过一个 以一个非常有趣的方式 使用了Core Motion的 应用程序来给我们做一个演示 我之前已经看过了 非常棒 让我们开始吧 这并不是一个介绍性的会议 不过我们会涵盖非常多的 Core Motion概念 你也可以跟得上 即使你不是十分熟悉Motion 不过对于那些来到会场的人来说 我们在会议结束后会立即有一个实验室 请带着你的问题来实验室 我们有工程师以及科学家在场 但是如果你没有问题 那就要恭喜你了 不过还是要请你过来 告诉我们在你的apps中是怎样使用 Core Motion 乐意聆听 在Apple developer 上确实也有一些之前的会议 在那些会议中深入探讨了动作感应、 动作活动性以及计步器 所以请你去看看那些会议 让我们开始吧 一段时间以来 动作感应已经在iOS上取得很大进展 先来看个有关它的工作原理的简短概述 这是一个传统的动作感应的结构 你把一些传感器连接到主处理器 就可以很明显地看到它们的缺点 无论你在什么时候想要访问传感器数据 你都必须让主处理器处于活动状态 这会严重制约你可以编写的 应用程序的种类 所以我们认为 我们能够做得更好 从iPhone 5S开始 我们就引入了一颗协处理器 我们称之为M7 是一颗微型处理器 它唯一的工作就是 对动作数据进行处理 这颗处理器可以全天候运行 且只有在真正必须时才会唤醒主处理器 对于用户的电池寿命来说这是好事 我们在iPhone 6上又引入了 M8处理器以及一个新的 传感器即“高度表” 现在在iOS上 动作感应看起来就是这样的
那么它对你来说有什么用呢? 如果你让传感器 实时访问你获得的数据 实时访问原始传感器数据 以及在传感器上构建的功能特性 如能够给你提供设备的高度的设备动作 比如计步器再比如动作活动性 若是在有高度计平台上 还可访问原始 压力、高度变化以及阶梯步级这些数据
这就是来自传感器的实时数据 但是动作协处理器能让你做的 远远不止这些 没错 远远不止这些 你还可以每周七天、每天 二十四小时访问动作活动性 访问计步器 在有高度计的平台上 你还可以每周七天、每天 二十四小时访问阶梯步级 现在在iOS上 你能用动作感应 做的事情就是这些
那么在Apple Watch上 动作感应看起来是什么样呢? Apple Watch上 面同样也有一颗协处理器 它上面还有一个加速计 这就意味着你同样可以 每周七天、每天二十四小时 访问动作活动性以及计步器 访问除了这两种数据之外 你获得的实时传感器数据 如果你在想 哎呀! 这个看起来这么眼熟 那么Apple Watch上的动作 你看起来也眼熟 你看的没错 iOS上的Core Motion APIs在watchOS上也有了
不仅是动作Core Motion API iOS和watchOS部分 Core Motion APIs 都表现得一样 我们就是在两个OSs上沿用了 这个特性
不过Watch基本上就是一个 完全不同的平台了 因此当为Watch构建应用程序时 我们需要知道 一些事情从头到尾给你们讲讲 我们先来讲一下动作活动性 动作活动性 可以给我们提供上下文信息 告诉我们用户正在做什么 可知用户是否正在走路 是否正在跑步 是否潜水 是否正在骑车等 你能够获得的等级非常依赖于平台 非常依赖于它的使用方式 这里简单对你能够在watchOS上 得到的状态进行一个总结 你可以注意到 你可以访问 走路、跑步、骑车以及静止状态 这就是Apple Watch 上的动作活动性
开发者早就想要访问传感器本身 提供通过这个熟悉的 CMAccelerometer API来访问加速计
那些东西都在加速计上 不过因为它是一个不同的平台 我们还是需要记住一些 应该考虑的事 第一点你的app获得的处理时间 可能是有限的 Watch上并没有真正后台处理方式 因此当你的app显示在屏幕上时 你的app就在高速运行了
屏幕可能会因为多种原因关闭 屏幕可能会超时 不过Apple Watch 的屏幕是设计成了 只有当你在看它的时候屏幕才会开启 因此如果你不想看屏幕了 那么屏幕关闭、 屏幕关闭后你的app得不到 处理时间的可能性就非常大 考虑到这些情况 我想要谈一些 最佳实践 首先要把你的app设计成 只有当app在屏幕上显示时 你的app才会期望数据 我知道说起来容易做起来难 不过还是要记住这一点
其次当你访问一个流的时候 访问一个传感器数据流时 你需要确保当你的任务被挂起时 也可以以一种优雅的方式处理你的任务 幸运的是 可以通过NSProcessInfo 来实现这一点 如果你使用这个API performExpiring ActivityWithReason 你就可以在这个API中 把你的传感器数据当成一个块来处理 它就会通知你的块通知你你的任务 就要被挂起了 这样你就可以采取适当行动 那是CMAccelerometer API 不过你们中有人想要的不仅仅是这些 事实上你想要长期访问 传感器数据 今天我很高兴地告诉大家 有史以来第一次 我们开始提供访问 历史传感器数据 历史加速计数据
那么你现在可以拿它做什么? 它允许你访问很长一段时间内的数据 相当长一段时间 你也可以访问这个数据 即使你的app不是处于运行状态
这样的话 你就可以在这个长长的 传感器数据流上运行你自己的定制算法 这很酷 我们也期待你们用它 来开发出很酷的apps 那么你应该怎么用它呢? 我们有一个新的API叫做 CMSensorRecorder 这个API允许 初始化历史传感器数据录制 记住这点此API和其他的APIs 一个很重要的不同之处 比如计步器以及动作活动性 其他的APIs 并不需要你初始化任何录制 对SensorRecorder说 你确实需要对它进行初始化 数据录制的频率是五十赫兹 你最多可以录制三天的数据
这就是SensorRecorder 的使用方式 提到执行 我们应该这样做 你首先要通过初始化 recordAccelerometerDataFor 录制数据 然后要提供一个 持续时间 一旦你完成这一步 设备可能就会进入睡眠状态 你的app可能会被挂起 没关系 之后 用户可能会回来 并且启动你的app
当用户启动你的app时 你就可以决定是否查询传感器数据
通过查询 accelerometerDataFrom 当然你还需要指定一个时间段
然后指定的时间段的加速计的数据 就会返回回来 很明显 这个时间段可以是 你录制数据的时间的一个子集 好的 数据会被作为一个 CMAccelerometerData 对象序列返回回来
回想一下 我们提到过的 关于优雅地处理任务挂起的内容 你在这里也会遇到同样的问题 因此 当你处理这个很大的 历史数据流的时候 你就需要访问我们的老朋友 NSProcessInfo 当你的任务就要被挂起时它会通知给你
如果你看一下加速计数据对象 它里面不仅包括了你熟悉的加速度部分 而且还包括了一个startDate 你就可以把这个它当做一个定位器 你可以从这个点 开始确保下次你的app启动时 向前进行查询 这就是SensorRecorder 的工作原理 这个很棒 不过正如你看到的 那里有一项需要考虑的事 不是 是两项功率与性能 SensorRecorder 是一个强大的API 但是能力越大 危险性也就越大 这里的危险性就在于 你可能没有足够的时间 来处理传感器数据的大量的字符串 因此我再介绍几个最佳做法 首先是 仅仅录制 查询你的app 需要用到的最短持续时间内的数据 如果app是一款锻炼身体 你大概就不需要十二个小时的数据 你大概需要几个小时的数据就够了 你查询的数据量越少 你的app就越能容易地获取、处理
此外你也应该知道 传感器数据传输率的要求 数据是以五十赫兹的频率提供给你的 但是除非你想要从那些数据中 抽取出特性、需要更高的 传感器数据传输率 那么你最好丢弃一些数据 处理较少的数据 只要采用几项最佳做法 你应该就没问题了
Apple Watch上Core Motion的情况就是这些 你已经看过了 我们有很多看起来眼熟的APIs 我们也可以访问历史传感器数据 这个很棒 你们应该可以用它 来开发出很酷的应用程序 提到编写Watch应用程序 我们今天上午确实举办了一个会议 现在就可以看到会议视频了
会议剩余的时间里 我想重点关注iOS 我先来讲讲 计步器上有什么新情况
这就是你属性的计步器 步数、距离 我们来快速回顾下 计步器的设计理念 是持续给你 提供身体各个部位的行为表现 无论是放在你的手中 还是放到你的口袋里 计步器的性能应该是一致的 即使速度不同 计步器的性能也应该是一致的 计步器的一个很棒的特性是 它会适应用户 因此使用计步器的用户人数越多 那么通过自身的校正 它就能更好地理解用户
在iOS 9上我们对计步器 做了一个很大的改进 让它尽可能地合并了GPS
我们为什么要这么做? 原因在于你的app可能 已经订阅了用户的位置 你可能想要在用户进行跑步的时候 绘制用户的运动轨迹 当你这么做的时候计步器检测到 GPS数据可以用了 通过使用GPS数据 就可以让轨迹绘制的更精确
为什么这一点如此关键呢? 看看这个 这是我的一位同事在旧金山跑的一次步 旧金山是一座“城市峡谷” 有很高的建筑物对任何GPS来说 环境都富有挑战性 如果你看看这里的这一段 GPS在这里看起来非常靠谱 如果你依赖于GPS 我们就可以对距离进行很好的估测 很好 但是如果你再看这里不同的段 你就会发现在用户的轨迹中用户在闲逛 一路上有好几个酒吧 所以... 但是这可能 并不是这位用户真实的跑步轨迹 所以说 计步器非常聪明 它知道在这里 它就不应该继续依赖GPS了 它应该继续借助于自身的基于步幅的 距离估计 如果你使用了计步器 那么你得到的最终结果 就非常一致 这也就是为什么你应该使用
计步器的步数和距离的原因
今年我们对计步器的API 做了一个很大的改进 在我们开始之前 我们先来回顾一个 你们已经知道的特性 这是层数计数 层数计数有 floorsAscended 还有floorsDescended 因为这是计步器的一部分 这就是一个徒步功能 你必须实际迈步 才能把它用起来 也就是说 你需要在这里 赢取授予的层数
让我们更深入地看看 它到底是如何工作的
它有几项要求 首先是 最低提升速率要求 还有一个步数要求 它们对我们意味着 假如说 如果你进行了一次远足 并且你走的很慢 那么最终你积累的高度就会很多
但是你很有可能达不到提升速率要求 我们就不会授予你层数 但是如果你是在旧金山散步 有一些非常陡峭的丘陵 那么你就有可能达到一些层数
因为步速要求 如果你使用了电梯 或者自动扶梯 你就不大可能会被授予层数 这就是iOS上层数计数的工作原理
现在轮到新的API了 这是“步幅” 长期以来 开发者就要求我们提供“步幅” 我们很高兴现在能提供了 当我们提起“步幅” 我们指的是currentPace 这实际上是瞬时步幅 而不是在跑步一开始就估算出来的步幅 “步幅”是以时间单位内 通过的距离来表示的 如果你想问为什么这样表示 而不是时间单位内的速度 你知道 因为对于跑步者来说 步幅通常 可以被类推为走完一个已知的距离 需要的实际时间
在网站上关注了 Apple Watch的更新情况 那么这个步幅 你看起来就可能很眼熟
这就让我有点 妒忌了
计步器既有实时数据 又有历史数据 但是“步幅”是只有你在进行 实时查询时才有的 别忘了这一点 我们为什么要提供“步幅”? 毕竟我们已经在计步器上 提供了距离和一个时间概念 因此我们可以很容易地计算出步幅 这样得出的步幅健壮性更高 假如说你想要有所区别 想从那些距离组块中估算出步幅 也会向步幅中引入一个可接受的抖动量 计步器就可以对此进行处理 确保步幅的估算是平滑的
此外你还可以通过回顾历史组块 然后算出步幅的平均数这一方法 尝试获得平滑的步幅 不过你这样做的代价就是 如果用户步幅发生了改变 你就无法很快做出响应 通过CMPedometer得出步幅 能够对变更很快做出响应 响应性也很高 因此平滑性和响应性就 你应该通过CMPedometer 使用步幅的理由所在
这是步幅 步幅有个“近亲”叫做“步调” 我们现在在计步器上有了步调 那么什么是“步调”? 步调指的是你的步行速率 或者换其他话来说 就是你的脚接触地面的频率 对于跑步者来说步调非常重要 现在你就能直接通过计步器 在你的apps内提供步调了
是的! 我们对计步器做的变更就这些 这里快速看看各个平台内的特性 注意看 Apple Watch上也可以用 计步器了
我们接着来谈谈压力感应 通过高度表传感器可以获得压力数据 这是CMAltimeter API 的一个组成部分 它给你提供了两样东西 第一样是原始压力数据 这就是传感器自身获得的压力 然后进行过滤后的数据 第二样就是相对高度 我们来深入谈谈高度
当我们说到“相对”我们指的是相对 提供的第一个样本而言的
这就意味着 你从高度表上获得的 第一个样本的相对高度为零 后续的样本都会以此为基线
那么要使用高度表 我们需要知道些什么呢? 对于层级的变更来说 高度表再合适不过了 而对于人体层级的变更来说 高度表就差强人意了 因此也许你不应该使用高度表来感知 用户是否抬起了他们的胳膊 差错会让你失望的
对于传感器来说 这些情况都非常具有挑战性 这一点不要忘了
其中一项是环境 即使位置不变 环境也可能随着时间推移发生改变 这样就会让你误以为高度发生了变化 举例来说 旧金山最近的冷锋 就可以让压力发生很大的变化 足以让我们以为 你的高度发生了变化 比如说变化了十五米 建议你不要长时间使用 传感器
你的设备所处的外套也可以影响到压力 如果你给你的 手机使用了刚性密封防水外套 那么你就指望不上压力传感器了
说到API的使用 对你来说它应该很眼熟 API可以给你提供压力和高度 你访问这个传感器的速度能有多快呢? 当你第一次进行请求时 第一个样本需要大约 二点六秒可以得出来 之后的每次样本以步调的形式出现 用时一点三秒 你从高度表上获取数据的速度就这么快
总结一下 Core Motion已经出现在了 多个平台上 iPads上有了 iPhones有了 Apple Watch上也有了 在Apple Watch 上提供不只那些 看起来眼熟的APIs 我们还提供历史传感器数据 计步器自身也有了一大堆很酷的更新 它的精确度更高了 并且有了两个新的APIs 即步幅和步调 计步器现在是个多面手了 对于你的健身apps来说 这是个好消息
从传统意义上说 Core Motion已经被用于 游戏、手势以及健身 对于Core Motion来说 可用的应用程序有很多 Core Motion也可以被用来 曾强其它的apps的智能 我要把加布里埃尔请上来 请他给你们解释下这个概念
大家好 能到这里我感到十分激动 作为一名开发者 我之前从未参加过苹果全球开发者大会 但是无论我在哪里工作 我总是在六月份的第一周内 在家里用电脑观看全部会议视频
我了解到了很多信息 但是其中让我头疼的是 信息量太大了 即使在一个会议视频中 要吸收的东西也太多了 当你看完后 你可能把过去的一小时内 学到的东西全都忘光
我在这里要做的 就是把阿尼尔刚刚向你们 提到的事情拿出来 看看你们到底想在你们的 应用程序中把它们用起来 希望能让你记住这些东西
Core Motion非常棒 因为它不仅能够用于 健身语境或者游戏语境 今天我要向你们展示的 是不管你的app属于 什么类别 你都可以把它用起来
Core Motion 能怎样为你效劳呢?
Core Motion 允许你检测用户正在做的事情
你可以知道用户是否正坐在他们的车里 是否在跑步是否在骑自行车 就像我们之前看到的 你可以知道他们的步幅变动 我们可以帮你让它更加平滑 借助这些变动 我们无需给用户发送提示 请他们告诉我们 就可以知道他们所处的语境 这样用户的体验就更加神奇了 我们的apps也就更智能了
其次 我们还能让用户参与进来 因为每隔几秒钟就有更新 我们就可以知道用户的步幅 发生了怎样的变动 我们可以知道 他们高度的发生了怎样的变动 相应地我们可以快速更新 我们的app UI
最后我们还可以“反射返回”
我知道“反射返回”听起来很蹩脚 但是对于Core Motion来说 很棒的一点就在于 通过始终保持它的运行 我们可以让你的app看起来好像 一天二十四小时、 一周七天都在努力工作 实际上工作的是协处理器
我们可以看到过去一周内 你的活动性更新情况 你的计步器更新情况 这一点很赞
我记住了这三点 因此我决定来编写一款 音乐播放器 不是想与Apple Music或者类似产品进行竞争 Core Motion怎样可以 让我的app的体验 更加迷人、更有魔力
很多音乐应用程序都有 这个播放列表的概念 我想听到不同的音乐当我在我的车里时 我想听到广播而如果我是在学习或者 正在努力工作 可能就想要听一些古典音乐 锻炼身体时 也有不同的app播放列表 通过检测某个用户正在做什么 我的音乐应用程序就可以 相应地改变我的播放列表 而无需让用户进行选择 类似地我们知道了步幅的变化 我们就可以说 嘿!你正在进行慢跑 可能是因为你刚才跑到太快 并且爬了一座非常高的山 我们就可以给你放一首 让人兴奋的歌曲 让你有一种成就感 或者可以试着与你的步调相匹配
下面就到了“反射”部分 关于“反射”两点很棒 尤其是在我的音乐应用程序 这个语境下
第一件事我可以看看数据 了解用户当前正在做的事情 嘿 你已经有一段时间不跑了 可能你很快就要跑 也可能你想使用我们的 应用程序来跑步 并且听一下你的播放列表 一天结束时 我们想要刺激我们的用户 回到我们的app中来
我想用户可能想要知道他们昨天
在车里听的播放列表是什么 如果我们能实现的话 那就太棒了 通过查看活动性信息 然后把它与我的播放列表信息进行匹配 我就可以把那个信息提供给用户
记住了这三件事 我们来看看我的应用程序 实际是什么样子的
当用户打开app时 我们仅仅想把一个基本的 播放列表展示给他们 对我来说 我现在是站着不动 对吧? 我们来一些低强度的音乐 不要太剧烈
当我们检测到用户正在加速 可能是他们开始进行锻炼了 我们要对播放列表进行变更 给他们一些更加欢快的音乐
就是在这里 app开始与用户接洽起来了 我们看看发生了什么变动 也许是步调发生了变动 也许是高度发生了变动 我们就可以接洽并且跟随 这些变动 这样当用户加速时 我们就可以给他们 一个强度更高的播放列表
然后我们就想要切换环境了 当用户开车时 我就想在他们早晨上班路上 把他们的podcast 或者他们经常听的任何节目 提供给他们
这是“检测”部分 以及“接洽”部分 接下来是“反射”部分
我想把这个信息分成几个有趣的部分 这样用户就可以向后滚动 看看他们的“历史” 我可能想把这个与用户在不同时刻听的 播放列表连接起来
既然我们已经知道了 app会是什么样子的 我们再来看看动作活动性的实际应用 看看要实现这些功能 我们需要什么样的APIs
首先我们有“检测”部分 这个部分是我们希望能够一直运行的 我们想知道用户是否正在开车 用户是否正在走路 用户走路的速度有多快 那么以此我们需要什么?
活动性更新情况以及计步器更新情况 我们想要监控这些情况 让它们更平滑 看看哪个信息可以使得我们判定语境
其次我们有那个“接洽”部分 如果用户正在走路或者跑步对于我来说 我想知道他们的速度有多快 看看步调 我就可以知道他们是否 爬了一座高大的丘陵 这样我就可以给他们播放一首 欢快的歌来庆祝他们的成就 为此 我需要计步器更新情况 这些情况里面包括步幅、步调的变更 以及高度更新情况
然后我们还有“反射”部分 就像我之前说过 Core Motion很棒的是 它们可以一天二十四小时、 一周七天都为我努力工作 因此我就可以进行回顾 获取那些历史活动性查询 以及计步器查询 然后把这个信息分成几个有趣的部分
既然我已经仔细看了 我的app长什么样 看了“检测”、“接洽” 以及“反射”部分 也知道了我需要使用Core Motion哪一部分的APIs 我要向你们展示下 我到底是如何编码的 最起码要让你们看看我的 应用程序的数据模型
我要打开Xcode 但是在我走到这边的电脑之前 先提醒你们一下 屏幕上会出现大量的文本 别被吓跑了 示例代码现在已经放到网上了 现在请勿打开
请仅仅关注 我为你们高亮显示的部分 我之前已经说过了那里会有大量的文本 如果仅看那几个东西然后会议结束后 回去看看示例代码 你就能记住我重点讲的东西 而不是想要 一次做太多的事
我已经说过了 文本会很多提醒过了 就像我说过的 屏幕上有大量的文本 我只想让你们记住三个部分
就是“检测”、“接洽”与“反射” 记住了这些事情那么我要仔细看看 我的应用程序的数据模型中的这些东西 这个就是“数据模型”部分 剩下的部分供你以后自己探索 我要做的第一件事是“检测” 这就要求获得活动性更新情况 以及计步器更新情况 我们来看看这些活动性更新情况
很好 文本很多 是吧?
我要做的第一件事 就是校验下看看这个硬件上 能否使用活动性 就像阿尼尔之前提到的 活动性并不总是可用 因此在我们查询任何更新情况之前 我们需要进行这些校验
我们要做的第二件事是 使用 startActivitiesUpdateToQueue API 对于我而言 我只是进行了一个简单的NS操作查询
然后我要对数据进行处理
动作活动性就频繁显示出来了 你可以自己决定 怎样对数据进行平滑操作 对于我而言当某个用户跑步时 他们可能会遇到红灯停下 处于半静止的状态 我不想从跑步时的播放列表 转移到非常舒缓的播放列表 然后这样 来来回回 往往复复 所以我想做的是自己指定 应用程序的平滑操作至于你的应用程序 最适合什么样的平滑操作 我就交给你来决定了
让我们再来看看 计步器的更新情况
PedometerUpdates API看起来也非常眼熟 你看到的 我也要校验下 看看计步是否可用 即使我们假定 活动性可能是可以用的 那也并不意味着计步也同样可用
假定计步真的可用 那么我要 startPedometerUpdates 这个API可以允许我们提供一个日期 如果你所处的是一个更日记化的语境 你可能就想 在你的日期一开始 启动这些更新 就我而言 我想在我的应用程序的 生命周期内看到这些更新 因此我现在就要启动这些更新
有一件非常重要的事情我需要指出
我们可能会收到一个错误
关于Core Motion很棒的是 它们会做出这样的事:喂!是否想让此 app使用为你弹出的活动数据?
但是用户可能会第一次 打开你的应用程序 然后允许你访问活动数据 但是他们可以随时回到 “偏好”中把授权删除 在那种情况下 当你试图接受更新情况时 我们就会抛出一个授权错误 那么你就需要平滑地处理这些问题 提示用户进到应用程序设置中 再次对你的应用程序进行授权
我在这里不去设置中了 但是我会弹出一个简单的UI 提醒视图 提示要去设置
这就是“检测”部分 接下来我要做的就是“接洽”部分
就我而言 当我看到活动性更新时 我还想启动、终止高度表的更新 我要在这里这样做
我进行了平滑处理 看看用户什么时候在跑步或者在步行 在那个例子中 我对高度的更新情况很感兴趣
很好现在你可以在这里看到一个主题了 我要做的第一件事 就是校验下 看看高度更新是否可用
假定它是可用的 我会 startRelativeAltitude UpdatesToQueue
我创建了一个队列 然后我要对数据进行相应的处理 我再校验一次 看看是否有错误 如果没有错误 那么我要在我的应用程序中把那个数据 当成最优服务来处理 至于你的数据该如何进行 最优服务处理 那由你决定
接下来我要做的就是 因为我对持续的高度更新 不感兴趣 因此要确保当我不是处于 跑步或者走路时把它停掉
很好 在这里这个API非常直接 我校验下可用性 我来 stopRelativeAltitudeUpdates
现在我知道了 当我说我们想要与用户进行 “接洽”时我们也会同时看到 计步器的更新情况 你可能记得 在我的应用程序的生活周期内 我已经看到了计步器的更新情况 因此 我无需再次启动、停止它们 我可以把这些融合到高度更新中来用 给我提供我的应用程序需要的东西 也就是通过音乐来激励用户
这就是“反射”部分
那么在这里 我要看看活动性的更新情况 以便我以有趣的部分的形式 提供这些东西 就像我之前给你们看的那样
很好 我希望你们看的 第一件事 就是我们可以查询日期后的 所有的活动性的更新情况 就我而言 我想看看过去一周的情况 即使我们不看 那一周的应用程序的使用情况 我们也可以获取所有的数据 然后把它们放到一起
就我而言 我对那个数据进行下处理 让它们为我以有趣的部分的形式显示 我等不及想看看你们自己 会怎么做了 又出现了 我知道唱片损坏了 对吧? 我要对这个错误进行相应的处理
就我而言 一旦我找到有趣的步行片段 我就会给出全部的额外的 历史计步器信息 那么我在这里要做的 我要为某个给定的活动性片段
请求计步器的更新情况
第一件事就是 queryPedometerDataFromDate 我提供了一个开始日期 还提供了一个结束日期 就我而言 我已经把数据放到程序段中了 那么我来看看这些段的开始和结束部分
这里我要指出的第二件事是
如果我想要进行任何UI变更 那么我就需要把这些变更发送到主队列 如果你在你自己的应用程序内 不这么做 那么你就会遇到问题
所以请这么做吧 我要向你们展示的就是这些 想你的应用程序添加活动 总共花了我十分钟左右 因此 当你回去后 给你的应用程序做同样的事 就是这么容易 现在我真的想让你们看看这个app 但是我不会在这里 跑一圈或者开车 我要向你们看看 过去今天内我的历史数据 让你们看看“反射”部分 是怎样以有趣的图段的形式 来组织数据的
但愿这是一台iPhone
太好了!这是我的音乐活动应用程序 你可以看到 我的活动强度不大 因此 我现在处于低强度模式
现在我再来看看我的历史记录情况
我要从昨天早上开始 让你们看看我一天的情况 我昨天所做的 就是围绕莫斯康走路
昨天我醒来后 我决定快速骑行一段时间 我所做的就是... app已经搞定了 替我把这些放进了一个有趣的图段
然后我朝着公交车走去 意识到有点晚了 于是就开始跑 最终上了公交车 你可以在这里看到 我在这里的就是步行的图段 有英里信息 有步幅信息 层级上升与下降 这些都替我放进了 那些有趣的组块中 如果我是在某个单元上 实际开发一款音乐应用程序 那么我可能会把 当时我听的播放列表 放到那个图块上
有一件事我要指出 话说今天 当我在莫斯康附近 走路的时候 我没有出现任何层级的上升与下降 这是因为我今天比较懒 到处都乘坐了自动扶梯
我希望你们也注意到了这一点
这就是我的 基础的音乐应用程序 我来总结下
我希望你们喜欢这个演示 我尽量把重点放在少数几个事情上 这样你就可以记住 并且用到你的应用程序上记住 这里有“检测”片段 使用活动来检测 某个用户正在做的事情 而不是让用户告诉你 他们正在做什么事情 通过活动性、计步器、高度表 推送更新与用户进行“接洽”
以及“反射回去” 把那些历史查询智慧地运用起来 如果你有更多的问题 请到“开发者论坛”看一看 请务必看看音乐活动 它应该就在开发者入口处 如果是一般的咨询 请联系我们的福音传道者
此外还有一些会议与本次会议相关 它们也值得你去看看 如果你参加了苹果全球开发者大会 你可能已经看过或者 还没有看过HealthKit演示、 Cocoa Touch演示 如果你错过了这些演示或者你现在在家 那么请去网上看看这些视频 同样 我也希望你们去看看 Core Location的演示
如果你能够真正把活动数据、健康数据 位置数据组合起来 那么你就可以创建一些绝妙的语境 来让你的应用程序更上一层楼 我迫不及待想看看你们会在 App Store上何应用程序
谢谢 太谢谢了
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。