如何创建苹果 watchOS 5 的复杂功能?

Posted

技术标签:

【中文标题】如何创建苹果 watchOS 5 的复杂功能?【英文标题】:How to create apple watchOS5 complication? 【发布时间】:2018-09-26 22:45:26 【问题描述】:

我从未在 WatchOS5 中工作过,我想为 AppleWatch 开发一个横向复杂功能(Modular large),比如“心率”。这个想法是我会以不同的方式显示心率数据。现在我想在开发手表上部署复杂功能。

我创建了一个新项目,并添加了“复杂性”复选框。我看到这添加了一个带有时间线配置占位符的并发症控制器。

还有一个带有一堆空屏幕的故事板。我不确定在部署 Apple Watch 应用程序之前需要付出多少努力。我看到thisApple 文档,但它没有描述如何布置我的并发症。某些部分似乎缺少链接。

我能否只提供一种复杂功能(大型水平 - 模块化大型) 除了管理 复杂的逻辑,或者我可以在没有视图控制器的情况下逃脱吗? 我是否可以通过向资产文件夹添加一些东西(它有一堆图形插槽)来控制我的复杂功能的外观?

对于一个完整的初学者项目,我还没有看到专门针对 watch OS 5 横向复杂性的项目

【问题讨论】:

【参考方案1】:

您应该能够立即部署它,尽管它不会做任何事情。观看解释如何创建复杂功能的 wwdc 视频:video

您不能自己布置复杂功能,您可以从一组您用数据填充的模板中进行选择。您看到的屏幕适用于您的手表应用程序,而不是复杂功能。

您不必支持所有复杂功能样式。

复杂逻辑是您的 WatchKit 扩展的一部分,因此从技术上讲,您不需要 ios 配套应用中的任何内容,但我不确定您必须提供多少功能才能通过应用审查。

将您的图形添加到资产目录不会做任何事情,您必须在配置模板时引用它们。

【讨论】:

【参考方案2】:

这是example by Apple of how to communicate with the apple watch app。您需要仔细阅读自述文件大约 25 次才能更改该项目中的所有应用组标识符。

手表应用看不到您的主要手机应用资产 您的手表故事板资产进入 WatchKit 目标 您以编程方式访问的资产进入手表扩展目标

原始答案:

我能否只提供一种复杂功能(大型水平 - 模块化大) - 我是否需要提供除此之外的任何 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)")

【讨论】:

以上是关于如何创建苹果 watchOS 5 的复杂功能?的主要内容,如果未能解决你的问题,请参考以下文章

WatchOS 5 如何在 WatchOS 5 中测试未来时间的复杂性,因为 Time Travel 已被删除?

如何在 watchOS 3 复杂功能上斜体显示文本?

100秒回顾苹果开发者大会…发现真的“没亮点”

苹果同步发布 macOS & watchOS 最新系统,增加不少新功能

如何发布watchos独立应用?

iOS WatchOS5 - 如何为手表应用程序支持多个复杂功能系列?