codecamp

iCloud

iCloud

iCloud 可以让用户随时随地用不同的设备访问他们想要的内容。将 iCloud 集成到应用中,用户不用进行同步操作就可以在不同场景下使用不同的设备访问并编辑私人信息。

为了提供这种体验,你可能需要重新检查你的应用中现有的信息,尤其是用户自建内容的存储、访问和展示方式。想要了解如何使用 iCloud,请参考 iCloud Design Guide.

iCloud 用户体验的一个基本方向是透明性:理想情况下,用户不需要知道他们的信息存储在什么地方,也不需要去思考当前浏览的信息是哪个版本的。以下几点可以帮助你创建用户期望的 iCloud 体验。

如果可能,让用户方便地在你的应用中启用iCloud。在 iOS 设备上,用户可以在设置中登录 iCloud 账户,因此多半用户会期望应用可以自动启用 iCloud。但是如果你觉得用户可能需要自主选择是否使用你应用的云服务,你可以在用户第一次进入应用时提供一个简单的选项来进行设置。大多数情况下,这个选项应该为:是否将所有内容上传到云端。

尊重用户的 iCloud 空间。一定要记住 iCloud 空间是用户花钱买来的有限资源。你应该使用 iCloud 来存储用户自己创建和可理解的信息,避免将可再生的应用资源和内容存储在云端。同样要记住,当用户登录了 iCloud 账户时,你的应用的文件夹内容也会自动备份到云端。所以为了节省用户云端空间,你最好只挑选必要的信息存储于文件夹中。

避免让用户自己选择在 iCloud 上存储哪些文件。一般地,用户会期望他们在意的所有信息都能够通过 iCloud 访问到。实际上大多数用户都不需要进行个人文件存储的管理,所以你的应用也可以不用考虑这个问题。为了提供更好的用户体验,你可能想要重新构建处理和展示内容的方式,这样就可以给用户提供更多的文件管理功能。

决定哪种类型的信息需要存储在云端。除了存储用户自建的文件和内容,你还可以存储少量的其他信息在云端,例如用户当前的状态,用户的偏好设置等等。你可以使用 iCloud 的关键值存储来保存这类信息。例如,用户使用你的应用看了一个杂志,你可以使用 iCloud 的关键值存储来保存用户浏览到的位置,这样用户在别的设备上重新打开这个杂志时就能从上次离开的地方继续浏览了。

如果你使用 iCloud 的关键值存储来保存用户的偏好设置,确保用户在每个设备上都是想这样设置的。例如,有些偏好设置在工作环境中比在家里要更好用。在某些情况下,将偏好设置保存在应用服务器上要比保存在云端更合理,这样偏好设置就不会受 iCloud 的限制。

确保 iCloud 无法使用时应用的行为是合理的。例如,用户退出 iCloud 账户,关闭应用的 iCloud 或者进入飞行模式时,iCloud 都是无法使用的。在这些情况下,用户都进行了某些操作来禁止 iCloud 服务,所以你的应用可以不用再进行提醒。但是,需要告诉用户在打开 iCloud 之前,当前做的修改在其他设备上都无法看到。

避免给用户创建“本地”文件的选项。不管你的应用是否支持 iCloud,都不应该给用户提供因设备而区分的文件系统。相反,你应该希望用户关注通过 iCloud 访问文件的普适性。

在合适的时候自动更新信息。最好不需要用户来确认他们正在访问的是最新的内容。但是,也需要在用户设备存储空间和带宽限制之间做出平衡。如果你的用户要使用非常大的文件,那么让他们自己选择是否要从云端下载一个更新的文件可能更合适。如果需要这样做的话,可以设计一种方式来指出当前在云端有一个该文件的最新版本。当用户选择更新时,如果下载时间较长最好给用户明显的反馈。

告知用户删除某文件的后果。当用户从有 iCloud 服务的应用上删除文件的时候,这个文件同样会从用户的 iCloud 账号和其他设备上删除。所以最好在执行删除操作之前告知用户删除的后果,让用户进行确认。

必要时尽可能早地告知用户冲突问题。使用 iCloud 编程接口,你需要在不打扰到用户的情况下解决大多数不同版本之间的冲突问题。但在有些情况下,你需要尽可能早地检测出冲突问题来避免用户在错误版本上浪费太多时间。你需要设计一种自然的方式来告诉用户有冲突存在,接着给用户提供方便的方式来区分不同版本以及做出决策。

确保在搜索中包括用户在云端的信息。使用 iCloud 的用户趋向于认为云端的信息是普遍可访问的,所以他们会期望搜索结果中也有云端的信息。如果你的应用允许用户搜索他们的信息,确保你使用了将搜索扩展到 iCloud 账户的接口。

社交媒体
HealthKit
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

iOS 9人机界面指南(二):设计策略

iOS 9人机界面指南(四):UI 元素

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }