标签: clockkit

何时何地获取Watch Complication的数据

在对并发症进行了几天的处理之后,我有信心对于以规定间隔发生的更新的更新过程进行以下说明:

  • 系统调用 requestedUpdateDidBegin()
    • 您可以在此处确定数据是否已更改.如果没有,您的应用程序不必做任何事情.如果您的数据已更改,则需要调用以下任一项:
      • reloadTimelineForComplication 如果您需要重置所有数据.
      • extendTimelineForComplication 如果您只需要在并发症时间轴的末尾添加新项目.
    • 注意:系统实际上可能会调用,requestedUpdateBudgetExhausted()而不是requestedUpdateDidBegin()如果您在当天花费了太多的并发症时间预算.这就是这个问题的原因.
  • 如果您打电话reloadTimelineForComplication,系统将调用getCurrentTimelineEntryForComplication(以及获取阵列的未来和过去变体,具体取决于您的时间旅行设置)
  • 这是猜想,因为我还没有测试它,但我相信如果你打电话extendTimelineForComplication说只会getTimelineEntriesForComplication(... afterDate date: NSDate ...)被调用.
  • 然后系统将调用,getNextRequestedUpdateDateWithHandler以便您指定复杂性需要新更新的时间.

Apple的文档非常明确,您不应该经常询问更新,或者在复杂化代码中进行太多处理,否则您将耗尽时间预算,并且您的并发症将停止更新.所以,我的问题是:你在何时何地进行更新?

对于上下文,我的方案是一个URL,其返回数据每小时最多更改两次.

放置URL获取代码最明显的地方是func requestedUpdateDidBegin()获取数据,存储它,如果没有变化,只需返回.如果有更改,则延长或重新加载时间线.

但是,URL提取可能会很昂贵.备择方案:

  • 将代码放在手机应用程序上并使用a发送WCSession,但如果用户关闭该应用程序,则更新将不再发生.
  • 使用推送更新,但这不是一个Web应用程序,所以我没有地方发送它们.
  • 显然,当用户与监视应用程序交互时,我将更新所有数据,但现在这意味着它只在用户使用应用程序时才会更新,从而无需复杂化.

还有其他地方吗?我可以在手表应用程序中使用不属于复杂功能的周期性功能吗?获取并发症更新数据的正确位置在哪里?

ios watchkit clockkit watchos-2 apple-watch-complication

29
推荐指数
1
解决办法
6674
查看次数

更新Apple Watch复杂数据的流程是什么?

我一直在互联网上学习很多教程,学习如何设置复杂功能.我按照预期设置并发症没有问题.

直到初始时间表条目到期.12个小时后,我不知道如何更新它以保持并发症的生效.我将分享下面的所有内容,希望有人可以帮我填写.

在这里,我为要在复杂化中显示的数据创建变量.

struct data = {
var name: String
var startString: String
var startDate: NSDate
}
Run Code Online (Sandbox Code Playgroud)

以下数组是此数据的容器.

var dataArray = [data]
Run Code Online (Sandbox Code Playgroud)

这样可以在手表锁定时显示复杂功能.

func getPrivacyBehaviorForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationPrivacyBehavior) -> Void) {
    handler(.ShowOnLockScreen)
}
Run Code Online (Sandbox Code Playgroud)

这允许在复杂化上前进时间旅行.

func getSupportedTimeTravelDirectionsForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimeTravelDirections) -> Void) {
    handler([.Forward])
}
Run Code Online (Sandbox Code Playgroud)

在这里,我将时间线的开始时间设置为等于现在.

func getTimelineStartDateForComplication(complication: CLKComplication, withHandler handler: (NSDate?) -> Void) {
    handler(NSDate())
}
Run Code Online (Sandbox Code Playgroud)

在这里,我将时间线的结束时间设置为从现在开始等于12小时.

func getTimelineEndDateForComplication(complication: CLKComplication, withHandler handler: (NSDate?) -> Void) {
    handler(NSDate(timeIntervalSinceNow: (60 * 60 * 12)))
}
Run Code Online (Sandbox Code Playgroud)

在这里,我创建了复杂的模板.这是为用户在浏览手表上的所有复杂情况时看到我的并发症时显示的样本数据.

func getPlaceholderTemplateForComplication(complication: CLKComplication, withHandler …
Run Code Online (Sandbox Code Playgroud)

apple-watch clockkit watchos-2 apple-watch-complication

20
推荐指数
2
解决办法
6369
查看次数

处理手表并发症时Xcode中的错误消息

执行时

template.headerTextProvider = CLKSimpleTextProvider(text: header)
Run Code Online (Sandbox Code Playgroud)

ComplicationController,我收到了大量类似的错误消息,到目前为止我还没有找到解决方法:

objc[4499]: Class SPProtoAudioFilePlayerStatus is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/System/Library/Frameworks/WatchKit.framework/WatchKit and /Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/System/Library/PrivateFrameworks/SockPuppetGizmo.framework/SockPuppetGizmo. One of the two will be used. Which one is undefined.
objc[4499]: Class SPProtoSerializer is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/System/Library/Frameworks/WatchKit.framework/WatchKit and /Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/System/Library/PrivateFrameworks/SockPuppetGizmo.framework/SockPuppetGizmo. One of the two will be used. Which one is undefined.
objc[4499]: Class SPProtoAudioFilePlayerMessage is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/System/Library/Frameworks/WatchKit.framework/WatchKit and /Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/System/Library/PrivateFrameworks/SockPuppetGizmo.framework/SockPuppetGizmo. One of the two will be used. Which one is undefined.
objc[4499]: Class SPProtoCacheSyncData is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/System/Library/Frameworks/WatchKit.framework/WatchKit and …
Run Code Online (Sandbox Code Playgroud)

apple-watch watchkit clockkit watchos-2 apple-watch-complication

14
推荐指数
1
解决办法
420
查看次数

Apple Watch 并发症无法可靠更新

我有一个 iPhone 应用程序,可将数据从 iPhone 应用程序直接发送到表盘以显示为复杂功能。

我使用该WatchConnectivity框架创建了一个WCSession将数据从手机发送到手表的方法。

我的数据存储在字典中,并使用WCSessiontransferCurrentComplicationUserInfo方法发送到手表。(这种方法每天可以使用 50 次左右,我知道这一点 - 这不是问题。)

transferCurrentComplicationUserInfo方法似乎在我第一次尝试发送数据时起作用。

我的问题是我的 iPhone 应用程序打算在一个会话中多次调用这个函数,而且它只能在第一次可靠地工作。

当我发送第二组数据时,第一组数据仍保留在并发症上。通常,当我发送第三组时,会出现第二组。有时第二组永久出现,有时只出现一秒钟,然后显示第三组。

这是不一致的,这就是我遇到的问题。

有什么我设置不正确的吗?

代码:

//iPhone code to send data to Apple Watch:

func sendComplication(complication: Complication) {
        guard let session = session else {
            delegate?.failedToSendComplication(reason: "Could not connect to your Apple Watch.")
            return
        }
        guard let context = convertComplicationToDictionary(complication: complication) else {
            delegate?.failedToSendComplication(reason: "Couldn't cast complication to a dictionary.")
            return
        }
        if session.remainingComplicationUserInfoTransfers > 0 { …
Run Code Online (Sandbox Code Playgroud)

apple-watch watchkit clockkit apple-watch-complication watchconnectivity

7
推荐指数
1
解决办法
441
查看次数

WidgetKit 并发症不会更新

我们正在将ClockKit复杂功能迁移到WidgetKit手表应用程序 (watchOS 9+) 中。\n迁移进展顺利,UI 部分工作正常。然而,我们遇到了小部件在手表应用程序请求时没有更新的问题。\n我相信我们错过了一些非常简单和基本的东西,但到目前为止还找不到确切的东西。非常欢迎建议和提示!\xe2\x80\x8d\xe2\x99\x82\xef\xb8\x8f

\n

我们的实施细节:

\n
    \n
  • 每当主应用程序中的数据发生更改时,更新的数据都会WatchConnectivity使用WCSession.default.transferCurrentComplicationUserInfo(_:). 根据文档,此方法应用于传输与复杂功能相关的数据,因为即使手表应用程序位于后台或根本未打开,它也会唤醒手表应用程序。
  • \n
  • Watch 应用程序接收更新的数据并将其存储在UserDefaults与托管 WidgetKit 复杂功能的 Watch Widget 扩展共享的位置App Group
  • \n
  • 观看应用程序,然后通过 请求小部件时间线重新加载WidgetCenter.shared.reloadAllTimelines()。根据文档,它重新加载属于包含应用程序的所有已配置小部件的时间线,因此这似乎是重新加载 WidgetKit 复杂性的适当方法。
  • \n
  • Watch Widget Extension 中的 Widget Timeline Provider 类从共享中读取更新的数据UserDefaults,并使用它来为要渲染的 widget 视图提供更新的数据snapshot
  • \n
\n

我们相信我们的实现逻辑是正确的,但由于某种原因它不起作用。打开手表应用程序时,小部件有时会更新,但并非总是如此。强制更新小部件的最明确方法是切换到不同的表盘,这确认小部件时间线提供程序可以访问正确更新的数据。

\n

PS我们知道小部件的每日重新加载预算,因此我们很少使用小部件重新加载触发器。无论如何,根据文档,在调试模式下重新加载预算无效,但即使在调试模式下小部件也不会重新加载。

\n

最低可重现示例应用程序:\n https://github.com/SergejLogis/wkcomplications

\n

谢谢你!

\n

widgetkit watchos clockkit swiftui

7
推荐指数
0
解决办法
407
查看次数

你能从CLKRelativeDateTextProvider中提取文本吗?

我正在构建一组并发症,并且已经进入CLKComplicationTemplateUtilitarianLargeFlat,它只有一个textProvider.

我想显示一些文本,以及相对日期.所以我尝试这样做:

let date = CLKRelativeDateTextProvider(date: NSDate(), style: style, units: units)  
let template = CLKComplicationTemplateUtilitarianLargeFlat()  
template.textProvider = CLKSimpleTextProvider(text: "next: \(date)")  
Run Code Online (Sandbox Code Playgroud)

但我得到的只是:

<CLKRelativeDateTextProvider: 0x79860b80>  
Run Code Online (Sandbox Code Playgroud)

你能从CLKRelativeDateTextProvider中提取原始文本还是以某种方式将它与CLKSimpleTextProvider结合起来?

swift clockkit

6
推荐指数
1
解决办法
695
查看次数

获取并发数据:不调用ExtensionDelegate

(在过去的几周里,其他人似乎遇到了这个问题,但是我找不到任何解决方案.)

我正在尝试做一个非常基本的事情:从我的iOS应用程序或我的Watch应用程序获取数据到我的复杂控制器.

事实证明,这样做的能力比我想象的要差.watchOS 2 Transition Guide表示我应该使用以下代码"[从[@fetch]扩展委托中获取所需的数据"):

ExtensionDelegate* myDelegate = [[WKExtension sharedExtension] delegate];  
NSDictionary* data = [myDelegate.myComplicationData objectForKey:ComplicationCurrentEntry];
Run Code Online (Sandbox Code Playgroud)

大.除此之外,我还没有弄清楚如何让这个在扩展方面工作.虽然更重要的是,我似乎甚至无法从复杂的控制器启动中获得扩展代理代码.当我运行复杂功能时,我收到此消息:"扩展收到请求以唤醒并发症支持." 但是,任何扩展委托方法中的代码都不会运行.我还在每个方法中设置了断点,并且没有一个断点被击中.

它也看起来像"transferCurrentComplicationUserInfo:"也被建议用于复杂的更新,虽然它不清楚它是如何使用的.我已经收集了它,它用于唤醒手表扩展,以便ExtensionDelegate可以在下次复杂控制器运行时存储新数据,但由于之前的问题,我无法确认.

我有一个可能的解决方法(从并发症控制器ping服务器并希望会话变量持续存在,这样我就可以发送相关数据),但是如果我不能解决这个问题,那么我的并发症工作就会受到冲击.这里的任何帮助都是巨大的.

顺便说一句,这是我对"getCurrentTimelineEntryForComplication"的代码,如果这有用的话.

- (void)getCurrentTimelineEntryForComplication:(CLKComplication *)complication withHandler:(void(^)(CLKComplicationTimelineEntry * __nullable))handler {  
    NSDate* entryDate = [NSDate date];  

    ExtensionDelegate* myDelegate = [[WKExtension sharedExtension] delegate];  
    NSString* data = [myDelegate.complicationData objectForKey:@"meow"];  
    NSLog(@"complication data: %@", data);  

    CLKComplicationTimelineEntry* entry = [self getTimelineEntry:@"2015-08-25 00:19:42" entryDate:entryDate complication:complication];  

    handler(entry);  
}
Run Code Online (Sandbox Code Playgroud)

apple-watch clockkit watchos-2 apple-watch-complication

6
推荐指数
1
解决办法
2795
查看次数

TintedImageProvider 不提供 Graphic Complication 中的色调颜色

我正在尝试为我的 Apple Watch 应用程序(即 Graphic Circular)创建 Graphic Complications,但遇到了一些问题。为了支持多色和有色表盘,我使用以下代码为我的复杂功能提供图像:

    let graphicCircularTemplate = CLKComplicationTemplateGraphicCircularImage()
    if let tintedImage = UIImage(named: "GraphicCircular"), let fullColorImage = UIImage(named: "GraphicCircularOrange") {
        let tintedImageProvider = CLKImageProvider(onePieceImage: tintedImage)
        var imageProvider = CLKFullColorImageProvider()
        if #available(watchOSApplicationExtension 6.0, *) {
            imageProvider = CLKFullColorImageProvider(fullColorImage: fullColorImage, tintedImageProvider: tintedImageProvider)
        } else {
            imageProvider = CLKFullColorImageProvider(fullColorImage: fullColorImage)
        }
        graphicCircularTemplate.imageProvider = imageProvider
    }
Run Code Online (Sandbox Code Playgroud)

现在我的fullColorImage如下: fullColorImage

而相同大小的着色图像渲染为模板图像: tintedImage

在多色 Infograph 表盘中,全彩图像看起来符合预期: 多色

但是,当我将表盘更改为选定的色调时,我的着色图像呈现为纯白色,并且系统色调颜色不会应用于它: 色调颜色

所以我的问题是我缺少什么以及为什么我的tintedImageProvider 不提供任何色调?

此外,我注意到图形圆形类型的系统复杂性似乎有一个略带灰色的背景,这使它们在黑暗的表盘环境中脱颖而出。我已将相同的背景颜色硬编码为全彩图像,但是当面部切换到色调模式时 - 我的并发症的背景变成全黑。关于如何实现这种灰色背景效果有什么想法吗?

swift watchkit clockkit apple-watch-complication

6
推荐指数
1
解决办法
934
查看次数

watchOS 9 的 xcode 中没有复杂配置

我为现有的 iOS 应用程序添加了一个新的手表应用程序,该应用程序是使用 React Native 构建的。我以前从未开发过手表应用程序。我到处都读到这应该创建两个目标,手表应用程序和应用程序扩展。但只创建了一个手表应用程序。

现在我想为这个手表应用程序添加一个复杂功能。我尝试按照此处此处的步骤进行操作。它说在扩展的常规选项卡上(我的项目中不存在)我应该配置Complication Configuration。但这个选项不存在。

可用的选项

这是 watchOS 9 改变的还是我错过了其他东西?

xcode ios apple-watch clockkit swiftui

6
推荐指数
1
解决办法
503
查看次数

CLKComplication tintColor不工作

我试图改变手表应用程序复杂化(模块化的高大的身体)中的文本颜色,但无论我做什么,文本保持白色.

这是我的代码,包括tintColor的行,我已经一起尝试了它们,每个都是一个接一个.

let secondTemplate = CLKComplicationTemplateModularLargeTallBody()
secondTemplate.tintColor = UIColor.greenColor()
secondTemplate.headerTextProvider.tintColor = UIColor.greenColor()
secondTemplate.bodyTextProvider.tintColor = UIColor.greenColor()
secondTemplate.headerTextProvider = CLKSimpleTextProvider(text: location.uppercaseString)
secondTemplate.bodyTextProvider = CLKSimpleTextProvider(text: "It's 4:20")
let secondEntry = CLKComplicationTimelineEntry(date: dateOf420, complicationTemplate: secondTemplate)
entries.append(secondEntry)
Run Code Online (Sandbox Code Playgroud)

我已经找到了涉及CLKComplication色调的问题,但我没有找到任何东西,我希望你能帮忙!

uikit apple-watch watchos clockkit watchos-2

5
推荐指数
3
解决办法
1174
查看次数