如何创建 Apple watchOS 5 复杂功能?
How to create apple watchOS5 complication?
我从未在 WatchOS5 工作过,想为 AppleWatch 开发横向复杂功能(模块化大),例如 "Heart Rate"。我的想法是我会以不同的方式显示心率数据。现在我想在开发手表上部署复杂功能。
我创建了一个新项目,其中添加了 "complication" 的复选框。我看到这添加了一个带有时间线配置占位符的并发症控制器。
还有一个带有一堆空白屏幕的故事板。我不确定在部署 Apple Watch 应用程序之前需要付出多少努力。我看到 this Apple 文档,但它没有描述如何布局我的并发症。某些部分似乎缺少链接。
- 我可以只提供一种复杂功能吗(横向大 - 模块化大)
- 除了管理
复杂的逻辑,或者我可以在没有视图控制器的情况下逃脱吗?
- 我是否可以通过向 assets 文件夹添加一些东西来控制复杂功能的外观(它有一堆图形插槽)?
对不起,对于一个完整的初学者项目,我还没有看到一个项目专门针对手表的水平复杂功能 OS 5
您应该可以立即部署它,尽管它不会执行任何操作。观看解释如何创建并发症的 wwdc 视频:video
您不能自己设计复杂功能,您可以从一组填充了数据的模板中进行选择。您看到的屏幕是针对您的手表应用程序的,而不是复杂的。
您不必支持所有复杂功能样式。
复杂逻辑是您的 WatchKit 扩展的一部分,因此从技术上讲,您不需要 iOS 配套应用程序中的任何内容,我不确定您需要提供多少功能才能通过该应用程序虽然审查。
将图形添加到资产目录不会执行任何操作,您必须在配置模板时引用它们。
这是一个 example by Apple of how to communicate with the apple watch app。您需要仔细阅读自述文件大约 25 遍才能更改该项目中的所有应用程序组标识符。
- 您的主要 phone 应用资产对手表应用不可见
- 您的 watch 故事板资产进入 WatchKit 目标
- 您以编程方式访问的资产进入监视扩展目标
原始答案:
- 能否只提供一种复杂功能(大横-
模块化大)- YES
- 我是否需要提供 iPhone 以外的任何应用内容
管理复杂的逻辑,或者我可以在没有
视图控制器? 是 - 手表应用有计算限制
- 我是否通过以下方式控制并发症的出现?
添加一些东西到资产文件夹(它有一堆图形
插槽)? 见下文 - 它既是资产文件夹又是占位符
修改上面的示例以创建在手表上显示的占位符图像(当您在修改屏幕布局时选择复杂功能时)
func getPlaceholderTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) {
// Pass the template to ClockKit.
if complication.family == .graphicRectangular {
// Display a random number string on the body.
let template = CLKComplicationTemplateGraphicRectangularLargeImage()
template.textProvider = CLKSimpleTextProvider(text: "---")
let image = UIImage(named: "imageFromWatchExtensionAssets") ?? UIImage()
template.imageProvider = CLKFullColorImageProvider(fullColorImage: image)
// Pass the entry to ClockKit.
handler(template)
}else {
handler(nil);
return
}
}
正在向手表发送小数据包(不会发送图片!)
func updateHeartRate(with sample: HKQuantitySample){
let context: [String: Any] = ["title": "String from phone"]
do {
try WCSession.default.updateApplicationContext(context)
} catch {
print("Failed to transmit app context")
}
}
正在传输图像和文件:
func uploadImage(_ image: UIImage, name: String, title: String = "") {
let data: Data? = UIImagePNGRepresentation(image)
do {
let fileManager = FileManager.default
let documentDirectory = try fileManager.url(for: .cachesDirectory,
in: .userDomainMask,
appropriateFor:nil,
create:true)
let fileURL = try FileManager.fileURL("\(name).png")
if fileManager.fileExists(atPath: fileURL.path) {
try fileManager.removeItem(at: fileURL)
try data?.write(to: fileURL, options: Data.WritingOptions.atomic)
} else {
try data?.write(to: fileURL, options: Data.WritingOptions.atomic)
}
if WCSession.default.activationState != .activated {
print("session not activated")
}
fileTransfer = WCSession.default.transferFile(fileURL, metadata: ["name":name, "title": title])
}
catch {
print(error)
}
print("Completed transfer \(name)")
}
我从未在 WatchOS5 工作过,想为 AppleWatch 开发横向复杂功能(模块化大),例如 "Heart Rate"。我的想法是我会以不同的方式显示心率数据。现在我想在开发手表上部署复杂功能。
我创建了一个新项目,其中添加了 "complication" 的复选框。我看到这添加了一个带有时间线配置占位符的并发症控制器。
还有一个带有一堆空白屏幕的故事板。我不确定在部署 Apple Watch 应用程序之前需要付出多少努力。我看到 this Apple 文档,但它没有描述如何布局我的并发症。某些部分似乎缺少链接。
- 我可以只提供一种复杂功能吗(横向大 - 模块化大)
- 除了管理 复杂的逻辑,或者我可以在没有视图控制器的情况下逃脱吗?
- 我是否可以通过向 assets 文件夹添加一些东西来控制复杂功能的外观(它有一堆图形插槽)?
对不起,对于一个完整的初学者项目,我还没有看到一个项目专门针对手表的水平复杂功能 OS 5
您应该可以立即部署它,尽管它不会执行任何操作。观看解释如何创建并发症的 wwdc 视频:video
您不能自己设计复杂功能,您可以从一组填充了数据的模板中进行选择。您看到的屏幕是针对您的手表应用程序的,而不是复杂的。
您不必支持所有复杂功能样式。
复杂逻辑是您的 WatchKit 扩展的一部分,因此从技术上讲,您不需要 iOS 配套应用程序中的任何内容,我不确定您需要提供多少功能才能通过该应用程序虽然审查。
将图形添加到资产目录不会执行任何操作,您必须在配置模板时引用它们。
这是一个 example by Apple of how to communicate with the apple watch app。您需要仔细阅读自述文件大约 25 遍才能更改该项目中的所有应用程序组标识符。
- 您的主要 phone 应用资产对手表应用不可见
- 您的 watch 故事板资产进入 WatchKit 目标
- 您以编程方式访问的资产进入监视扩展目标
原始答案:
- 能否只提供一种复杂功能(大横- 模块化大)- YES
- 我是否需要提供 iPhone 以外的任何应用内容 管理复杂的逻辑,或者我可以在没有 视图控制器? 是 - 手表应用有计算限制
- 我是否通过以下方式控制并发症的出现? 添加一些东西到资产文件夹(它有一堆图形 插槽)? 见下文 - 它既是资产文件夹又是占位符
修改上面的示例以创建在手表上显示的占位符图像(当您在修改屏幕布局时选择复杂功能时)
func getPlaceholderTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) {
// Pass the template to ClockKit.
if complication.family == .graphicRectangular {
// Display a random number string on the body.
let template = CLKComplicationTemplateGraphicRectangularLargeImage()
template.textProvider = CLKSimpleTextProvider(text: "---")
let image = UIImage(named: "imageFromWatchExtensionAssets") ?? UIImage()
template.imageProvider = CLKFullColorImageProvider(fullColorImage: image)
// Pass the entry to ClockKit.
handler(template)
}else {
handler(nil);
return
}
}
正在向手表发送小数据包(不会发送图片!)
func updateHeartRate(with sample: HKQuantitySample){
let context: [String: Any] = ["title": "String from phone"]
do {
try WCSession.default.updateApplicationContext(context)
} catch {
print("Failed to transmit app context")
}
}
正在传输图像和文件:
func uploadImage(_ image: UIImage, name: String, title: String = "") {
let data: Data? = UIImagePNGRepresentation(image)
do {
let fileManager = FileManager.default
let documentDirectory = try fileManager.url(for: .cachesDirectory,
in: .userDomainMask,
appropriateFor:nil,
create:true)
let fileURL = try FileManager.fileURL("\(name).png")
if fileManager.fileExists(atPath: fileURL.path) {
try fileManager.removeItem(at: fileURL)
try data?.write(to: fileURL, options: Data.WritingOptions.atomic)
} else {
try data?.write(to: fileURL, options: Data.WritingOptions.atomic)
}
if WCSession.default.activationState != .activated {
print("session not activated")
}
fileTransfer = WCSession.default.transferFile(fileURL, metadata: ["name":name, "title": title])
}
catch {
print(error)
}
print("Completed transfer \(name)")
}