watchOS 1教程

2024-01-07 05:08
文章标签 教程 watchos

本文主要是介绍watchOS 1教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开发Apple Watch和开发iPhone应用之间还是稍微有点差别的,但是也是大同小异,本文重点讲述他们之间的差异,并且通过一个例子带领大家走进开发Apple Watch应用的世界,希望能给朋友们带来帮助。

之前跟两个同事一起用业余时间给我们的 Glow App 做了 Apple Watch 的应用。写这篇文章来对 Apple Watch 的开发做个介绍,也列出开发过程中遇到的一些坑。虽然 Watch OS 2 已经出来,而我们是用 WatchKit 进行的开发,但很多内容也适用于 Watch OS 2。希望这篇文章对大家有帮助。

Introduction

  • Design
  • WatchKit App Architecture
  • Data Communication
  • Provisioning Profiles and Entitlements
  • Tips

Design

本质上,你可以把 Apple Watch 当作 iPhone 的一个扩展屏幕。你不需要掏出手机。只需要稍稍抬一下手腕,就可以获取信息,或做一些简单的操作。实际上,在你开发 Watch App 的时候,你就会发现 Watch 的模拟器就是当作 iPhone 模拟器的一个 external display 实现的。

不过 Apple Watch 展现了全新的人机交互方式,iOS App 的设计交互准则在 Watch 上并不适用。因此在设计开发 Watch App 之前,有必要先理解它的交互和基本的 UI 元素。

首先说交互。除了熟悉的手势交互,Apple Watch 提供了 3 种新的交互方式:

  1. Force Touch
    Apple Watch 的显示屏在感知用户点击的同时,也能感知压力。通过「重按」可以显示最多有 4 个操作的上下文菜单。

阳和移动开发

  1. The Digital Crown(数码表冠)
    跟传统手表一样,表冠是最常用的交互。但在 Apple Watch 上,表冠不是用来调校时间日期,或上弦。通过转动 Digital Crown,可以在不会遮挡视线的情况下,精确地放大缩放、滚动、或选择数据。它作为按钮还有返回的功能,按下返回主屏幕,按两下回到时钟界面。

听起来很美,但目前表冠的 API 还没有开放,滚动都是系统自动帮你做的 :[

  1. Side Button
    表冠下面的一个长长的按钮。按它会把你带到 Friends 界面。在这里,你可以给你选择好的 12 个联系人打电话,发短信,或者 Watch 提供的新的交流方式,例如轻点他们一下,画个涂鸦,或是发送心跳。

阳和移动开发

恩,这也没有开放相关的 API,考虑到它联系人的功能,估计之后也不会开放。

Apple Watch 人机交互指北

Watchkit App Architecture

当你新增一个 Watchkit App target 的时候,你会发现 Xcode 实际上给添加了 2 个新的 executables,并同你的 iOS App 打包在一起编译。

阳和移动开发

他们之间的依赖关系如下图所示,Watch App 依赖于 Watchkit Extension,而 Watchkit Extension 依赖于 iOS App. 从上面下面两张图都可以看到,Watch App 里只有 Storyboard 和 ImageAssets。没错,Watch OS 1 里,Watch App 只包含一些静态的东西,Extension 是真正执行代码的地方。Extension 负责从 iOS App 那里获得数据,并控制 Watch App 界面上要显示什么。而 Watch App 的操作也是由 Extension 向 iOS App 发起请求。Watch App 不直接与 iOS App 交流。

阳和移动开发

Watch App 的每一个页面,都需要有一个对应的 WKInterfaceController 的子类。如上图 Extension 的文件夹的 InterfaceController 和 GlanceInterfaceController。WKInterfaceController 除了init之外,还有 3 个与生命周期有关的方法:

// 在 init 之后被调用,可以在这个方法里配置界面上的元素
- (void)awakeWithContext:(id)context;// 当这个页面将要显示给用户的时候被调用
- (void)willActivate;// 当这个页面不再显示的时候被调用
- (void)didDeactivate;

Data Communication

前面说到 Watch App 本身只包含一些静态内容,它自己不保存数据,也无法发送网络请求。它只能借由 Extension 与 iOS App 交互。所以 Watch App 与 iOS App 的数据传递是关键,也是大部分 Watch App 的主要开发工作。数据传递的方法主要有下面 5 种。第一种是使用 WKInterfaceController 提供的openParentApplication:reply,然后在 iOS 端 实现application:handleWatchKitExtensionRequest:reply来处理 Watch Extension 发来的请求。最后一种 Wormhole 是第三方的一个库,通过 Dawrin notification center 发送消息并捎带上数据。而中间三种都是通过 App Group,在独立的共享沙盒里传递数据。

  • WKInterfaceControlleropenParentApplication:reply
  • NSUserDefaults
  • Core Data
  • NSFileManager
  • Dawrin notification center - MMWormhole

WKInterfaceControlleropenParentApplication:reply

这种方法很直观,也是几种数据传递方式中最实时可靠的。你可以用 Enum 定义几种请求的类型,然后在发送请求的时候把请求类型一并传过去,这样 iOS App 收到请求时,就能知道要做什么。iOS App 用reply回调把请求结果传回去。

用这种方法,iOS App 即使在后台也能被唤起。但 iOS App 不能主动去唤起 Watch Extension。

NSDictionary *request = @{kRequestType: @(requestType)};[InterfaceController openParentApplication:requestreply:^(NSDictionary *replyInfo, NSError *error) {}];
- (void)application:(UIApplication *)application 
handleWatchKitExtensionRequest:(NSDictionary *)userInfo  reply:(void (^)(NSDictionary *))reply
{RequestType requestType = userInfo[kRequestType];if (requestType == RequestTypeRefreshWatchData) {//}
}

中间三种方式很类似,都是把数据存在一个独立的共享沙盒中,不同是他们的存放方式。iOS App 或者 Watch App 需要数据了,就去找沙盒里面找。就像一个秘密的信箱,只有他们俩知道这在哪儿。所以这也是异步的传递方式,双方不直接打交道。具体怎么用看下面代码吧。

NSUserDefaults

用 NSUserDefaults 最简单,但有数据大小的限制。

NSString *appGroupName = @"group.com.yourcompnay.shared";  
NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:appGroupName];[defaults setObject:user.name forKey:@"userName"];

Core Data

如果你的 iOS App 已经把 Core Data 放到共享沙盒里了,那可以考虑这种方法。

NSString *appGroupName = @"group.com.yourcompnay.shared";  
NSURL *storeURL = [[NSFileManager defaultManager]  containerURLForSecurityApplicationGroupIdentifier:appGroupName];
storeURL = [storeURL URLByAppendingPathComponent:@"glow.sqlite"];[self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]

NSFileManager && NSFileCoordinator

文件读写必然要涉及到多线程问题,不过不用担心,用 NSFileCoordinator 就可以了

- coordinateReadingItemAtURL:options:error:byAccessor:
- coordinateWritingItemAtURL:options:error:byAccessor:[coordinator coordinateWritingItemAtURL:fileURL options:nil error:nilbyAccessor:^(NSURL* writingURL) {[dataToSave writeToURL:newURL atomically:true];

NSFilePresenter

你还可以通过实现 NSFilePresenter 协议来监听文件的更改,不需要自己实现刷新机制就能免费获得实时更新。

- presentedItemDidChange

Dawrin notification - MMWormhole

最后一种用起来也很方便,Watch Extension 和 iOS App 一方发送消息,一方监听消息。而且还有一大优势是,Wormhole 会保存上次传递的数据,这样在 Watch App 唤醒的时候,可以先使用 Wormhole 里的数据,等 iOS App 传来最新的数据时,再更新界面。

// init
self.wormhole = [[MMWormhole alloc] initWithApplicationGroupIdentifier:kApplicationGroupIdentifier  optionalDirectory:kWormholeDirectory];// iOS app
NSDictionary *message = [self makeWatchData];  
[self.wormhole passMessageObject:message identifier:kWormholeWatchData];// WatchKit Extension
NSDictionary *message = [self.wormhole messageWithIdentifier:kWormholeWatchData];  
// do something with message[self.wormhole listenForMessageWithIdentifier:kWormholeWatchDatalistener:^(id messageObject) {NSLog(@"Received data from wormhole.");
}];

也是我开发最初使用的方式。但在我使用的过程中,发现如果 iOS App 是在后台模式,就并不能实时接收到 WatchKit Extension 发来的消息。所以最后,我们选择openParentApplication:reply和 Wormhole 的混用。在 Watch App 唤醒时,使用 Wormhole 里的数据,保证 Watch App 响应的速度,同时用openParentApplication:reply向 iOS 请求最新的更新。

Provisioning Profiles and Entitlements

开发之初,最让人头疼的可能就是 Code Signing, Provisioning 和 entitlements 这些东西了。

每一个 target 都要有自己的 App ID。所以我们一共需要有三个:

  • yourAppID
  • yourAppID.watchkitextension
  • yourAppID.watchkitapp

你还需要给每个 App ID 创建一个相关联的 Provisioning Profile。如果你用 Xcode 自动创建 Provisioning Profile,它只会给你创建前面两个,你需要自己去 developer center 里手动创建。

另外,你还需要确保你的三个 Entitlements 都是对的。Version Number、Build Number、以及 App Groups (如果使用的话) 都必须是一样的,不然编译就不能通过。

Tips

Debug

有时候,你会需要同时 debug iOS App 和 Watch App。但 Xcode 只允许你指定一个 target 运行,你要么 debug iOS App 的代码,要么 Watch App 的代码。但通过 Xcode 的 Attach to Process 就能同时 debug。具体步骤如下:

  • 运行 WatchKit App
  • 在 Simulator 中打开你的 iOS App
  • 在 Xcode 的菜单栏上 Debug -> Attach to Process,选择你的 iOS App 就能同时 debug iOS 跟 WatchKit app 了。

App Icons and iTunes Connect

如果在上传你的应用到 iTunes Connect 的时候,遇到 Invalid Binary 的错误。很大可能是因为你的 Watch App 的 icon 里有透明层或者 alpha 通道。一个比较方便的解决办法是,用 Preview 打开图片,选择导出(export),然后不要勾选底部的 Alpha 选项,确定。

这篇关于watchOS 1教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578812

相关文章

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤