天道酬勤,学无止境

Keeping my WatchKit complications up to date when not running

I'm working on the WatchKit Extension of my app, and have some issues with complications.

I have a complication that displays a given total amount, which depends of what the user is doing on the iOS app. When the WatchKit Extension is running, the iOS app updates the watch app context using the -[WCSession updateApplicationContext:] method. It works fine, and then in the ExtensionDelegate of my Watch app, I manually update the complication with the new data.

But this is OK only when the extension is running (if it's not, it won't get the application context until the next launch).

So I edited my code to send the complication data directly to the Watch when user changed something in the iOS app, using the -[WCSession transferCurrentComplicationUserInfo:] method (it's written in the documentation that the ExtensionDelegate should be woken up to receive the user info in background).

I've implemented the -session:didReceiveUserInfo: method of the ExtensionDelegate to update the complication when it received data from the iOS app, but it doesn't work when the extension is not running... (and I don't know if it ever receives the user info as I can't log it)

How should I do to keep my complications up to date even when the extension is not running??

Thanks

PS: I'm using the Watch Simulator, and to "close" the extension I just Reboot the Watch (from the Hardware menu)

Edit: I managed to log out statements when the app is not running (by opening the Watch Simulator system log), and I get these lines when the iOS send a new complication user data to the watch extension:

Oct 18 18:08:11 pc16 WatchApp Extension[26615]: Extension received request to wake up for complication support.

Oct 18 18:08:11 pc16 assertiond[26585]: assertion failed: 15A284 13S343: assertiond + 15398 [B48FCADB-A071-3A46-878B-538DC0AFF60B]: 0x1

So the watch receives well the user info dictionary, but seems to fail waking up the extension...

Edit 2: here is the part of code in the ExtensionDelegate that should receive the complication user info (but which is not called when the app is not running):

- (void) session: (WCSession *)session didReceiveUserInfo: (NSDictionary *)userInfo
{
    NSLog(@"session:didReceiveUserInfo: %@", userInfo);

    NSString *userInfoType = userInfo[KHWASessionTransferUserInfoType];
    NSDictionary *userInfoContents = userInfo[KHWASessionTransferUserInfoContents];

    // Complication Data
    if ([userInfoType isEqualToString:KHWASessionTransferUserInfoTypeComplicationData]) {

        // Store the complication data into user defaults
        [[NSUserDefaults standardUserDefaults] setValue:userInfoContents[KHWAComplicationTotalBalance] forKey:KHWAComplicationTotalBalance];
        [[NSUserDefaults standardUserDefaults] synchronize];

        // And refresh the complications
        CLKComplicationServer *complicationServer = [CLKComplicationServer sharedInstance];
        for (CLKComplication *complication in complicationServer.activeComplications) {
            [complicationServer reloadTimelineForComplication:complication];
        }
    }
}

Edit 3: the WCSession is set in the extension delegate applicationDidFinishLaunching method:

- (void) applicationDidFinishLaunching
{
    // Setup the WatchConnectivity session
    WCSession *session = [WCSession defaultSession];
    session.delegate = self;
    [session activateSession];

    [...]
}

评论

Wow, I finally resolved the issue!

It seems that, even if I didn't see it in the log files (see my last comment), the init method of WCExtensionDelegate is well called when waking up the app.

So I just had to move the WCSession setting bloc into the init method :

- (id) init
{
    if (self = [super init]) {

        // Setup the WatchConnectivity session
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    }

    return self;
}

And for the while it works fine...

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 何时何地获取手表并发症数据(Where and When to get data for Watch Complication)
    问题 在处理了几天的复杂性之后,我有信心说出以下有关在规定间隔内发生的更新的更新过程: 系统调用requestedUpdateDidBegin() 在这里,您可以确定数据是否已更改。 如果没有,则您的应用程序无需执行任何操作。 如果您的数据已更改,则需要调用以下任一方法: reloadTimelineForComplication如果需要重置所有数据)。 如果您只需要在复杂时间线的末尾添加新项目,则可以使用extendTimelineForComplication 。 注意:如果您当天花费了太多的并发症时间预算,则系统实际上可能会调用requestedUpdateBudgetExhausted()而不是requestedUpdateDidBegin() 。 这就是这个问题的原因。 如果您调用了reloadTimelineForComplication ,则系统将调用getCurrentTimelineEntryForComplication (以及将来和过去获取数组的变体,具体取决于您的时间旅行设置) 这是一个猜测,因为我尚未对其进行测试,但是我相信,如果您调用了extendTimelineForComplication ,则只会调用getTimelineEntriesForComplication(... afterDate date: NSDate ...) 。 然后
  • watchOS - 显示有关并发症的实时出发数据(watchOS - Show realtime departure data on complication)
    问题 我有一个公共交通应用程序,其中包含火车的实时出发数据。 我想添加一个显示下一班火车出发时间的复杂功能。 是否可以显示(或刷新)复杂功能的实时数据? 例如,显示“3 分钟到 X 站”。 根据来自公共交通 API 的信息,数据可能每分钟都在变化。 我应该如何在 watchOS 2 或 watchOS 3 上完成此操作? 我知道 ETA 应用程序以复杂的方式显示旅行时间,但我不确定它们是如何实现的。 回答1 可以实时更新吗? 复杂功能并非旨在显示实时数据。 频繁更新会影响能源效率并影响电池(在手表和手机上)。 为了最大限度地减少功耗,ClockKit 要求您提供尽可能多的可用数据,然后缓存数据并在需要时呈现它。 虽然没有固定次数的复杂时间线可以重新加载,但复杂数据源受每日执行时间预算的约束。 如果您的应用程序的数据频繁更改,则可能难以提供足够的数据以在复杂情况下显示。 更糟糕的是,如果您过于频繁地刷新复杂功能数据,您可能会超出执行时间预算,并且您的复杂功能可能要到第二天才会更新。 一旦每日预算用完,对 reloadTimeline(和 extendTimeline)的调用就什么都不做。 如果您的复杂功能已超过其分配的每日执行时间预算,则调用此方法将无济于事。 谨慎调用此方法。 复杂功能如何显示相对时间? 您可以使用 CLKRelativeDateTextProvider
  • WatchKit 2 复杂文本仅显示在预览中(WatchKit 2 Complication Text Only Shows Up in Preview)
    问题 我正在尝试为 watchkit2 开发一个非常简单的复杂功能,它从一个简单的文本提供者那里说“嗨”。 我设法实现了一些奇怪的行为; 单击复杂功能或从自定义表盘屏幕预览时,我可以看到文本,但在显示表盘时看不到。 看一看: 任何想法可能导致这种情况? 我的文本提供程序看起来像这样 var textProvider: CLKSimpleTextProvider override init() { textProvider = CLKSimpleTextProvider() textProvider.text = "Hi" textProvider.shortText = "HI" textProvider.tintColor = UIColor.whiteColor() super.init() } 我的getPlaceholderTemplateForComplication看起来像 func getPlaceholderTemplateForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTemplate?) -> Void) { // This method will be called once per supported complication, and
  • WatchKit 2 Complication Text Only Shows Up in Preview
    I'm trying to develop a very simple complication for watchkit2 that says "Hi" from a simple text provider. I've managed to achieve some strange behavior; I can see the text when the complication is clicked or when you are previewing it from the customize watchface screen, but not when the watchface is displayed. Have a look: Any ideas what might be causing this? My text provider looks like this var textProvider: CLKSimpleTextProvider override init() { textProvider = CLKSimpleTextProvider() textProvider.text = "Hi" textProvider.shortText = "HI" textProvider.tintColor = UIColor.whiteColor()
  • WatchKit Complication:从扩展委托获取并发症数据(WatchKit Complication: get Complication data from extension delegate)
    问题 我的 WatchKit 扩展中有我需要的所有数据(从 iOS 应用程序传递)。 我用WatchKit InterfaceController的数据填了一张表格,效果很好。 我试图找出在我的 WatchKit ComplicationController获取相同数据的最佳方法。 目前,在InterfaceController ,数据使用didReceiveUserInfo传入: func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) { if let beachValue = userInfo["Surf"] as? String { places.append(Place(dataDictionary: ["Surf" : surfValue])) } else { print("Something went wrong") } } 我是否需要在我的ComplicationController调用这个相同的WCSession方法并再次抓取整个数据,或者有没有更简单的方法让我访问在ComplicationController使用的相同数据? 任何帮助表示赞赏。 谢谢! 编辑: 我的表功能: func makeTable() { // Per SO let
  • 结合 WatchConnectivity 和复杂功能(Combining WatchConnectivity and Complications)
    问题 我希望我的复杂功能通过 Watch Connectivity 从 iPhone 获取数据。 我正在使用sendMessage即时消息技术。 当我尝试获取数据时,我不希望我的 iPhone 应用程序打开,因此这需要在后台运行。 在我的 iPhone 上的 ViewController 中: import UIKit import WatchConnectivity class ViewController: UIViewController, WCSessionDelegate { var session: WCSession! override func viewDidLoad() { super.viewDidLoad() if WCSession.isSupported() { self.session = WCSession.defaultSession() self.session.delegate = self self.session.activateSession() } } func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { if message
  • 如何使用 WatchConnectivity 在 iOS 和 Watch 应用之间共享信息?(How can I share information between my iOS and Watch apps using WatchConnectivity?)
    问题 [免责声明:此问题旨在作为一个 wiki 问题来回答有关在watchkit和watch-os标签下在 iOS 和手表应用程序之间发送数据的常见问题。] 我正在开发 Apple Watch 应用程序,并希望在iOS应用程序与其WatchKit extension程序之间发送数据。 我查看了WatchConnectivity框架,但并不真正了解其所有方法之间的区别。 如果我希望即使我的应用程序在后台也能发送数据,我应该使用哪个函数? 我应该使用哪个函数向 Watch 发送 UI 更新? 我应该使用哪个函数来发送大数据? 回答1 在撰写此答案时( watchOS3是当前的稳定版本, watchOS4处于测试阶段), iOS应用程序与其WatchKit extension之间直接通信的唯一选择是 WatchConnectivity 框架。 (我说的很直接,因为这个问答不涉及使用CloudKit等云技术从一台设备上传文件到互联网并在另一台设备上下载。 ) 首先,我们来讨论WCSession的哪个函数应该用于什么目的。 对于代码示例,请向下滚动。 在深入研究细节之前,简要介绍每个功能以及何时使用它们: updateApplicationContext : 同步应用程序之间的状态,发送要显示在 UI 上的数据(仅用于发送小块数据) transferUserInfo : 在后台发送数据字典
  • WatchKit:无法找到接口控制器类(WatchKit: unable to find interface controller class)
    问题 我尝试将接口控制器添加到情节提要中,将其“自定义类”设置为WKInterfaceController子类,在模拟器中启动该应用程序,然后导航到指定的接口控制器。 这样做时,出现以下错误: WatchKit错误-无法找到要实例化的接口控制器类'TestController' 如果我尝试与控制器进行交互(例如尝试启动其按钮的动作),则会收到以下错误: ***********错误-[SPRemoteInterface _interfaceControllerClientIDForControllerID:]找不到interfaceControllerID:(null)的clientIdentifier ***********错误-[SPRemoteInterface _interfaceControllerClientIDForControllerID:]找不到interfaceControllerID:7120004的clientIdentifier 我尝试按照此答案中的建议设置模块名称,但这仍然给我以下错误: WatchKit错误-无法找到要实例化的接口控制器类'_TtC29myWatchApp_WatchKit_App19TestController' ***********错误-[SPRemoteInterface
  • 将手表套件应用程序部署到设备时出现“Apple Watch 应用程序安装从未完成”错误(“Install of Apple Watch Application never finished” Error when deploying watch kit app to device)
    问题 所以我得到了我的新手表(是的!)。 我手动将其 UDID 添加到开发人员门户并刷新了配置文件,我能够将存档推送到 ITC 进行测试,但现在我想在我的手表上调试运行该应用程序。 我尝试将手表套件应用程序目标集部署到我的手机作为设备,它坐在那里运行/搅动一段时间,但没有任何反应。 如果我等待的时间足够长,Xcode 最终会出错 “Apple Watch 应用程序的安装从未完成” 有没有人遇到过这个问题或知道我可以尝试的任何技巧? 回答1 我一直在使用 Xcode 7 beta 和 iOS 9 / watchOS 2 模拟器遇到这个问题。 对我有用的一种解决方案是重置并重新启动两个模拟器,但它不能可靠地工作。 所以我尝试了其他一些事情,最终开始对我可靠地工作的是: 转到 iOS 模拟器上的“Apple Watch”配套应用程序。 单击您的应用程序的名称。 切换“在 Apple Watch 上显示应用程序”开关,如下面的屏幕截图所示。 (关闭它,然后重新打开) 从 Xcode 再次运行该应用程序。 回答2 经过大量测试和鬼混,我能够解决问题。 上面的错误和通常的验证错误混合在一起。 我必须仔细检查和三重检查 watch ext、watch 应用程序和应用程序的所有 3 个开发人员配置文件是否与更新的 Watch UDID 设备保持同步。 注意:对于调试手表应用程序
  • WatchKit 和 iOS 应用程序的核心数据(Core Data with WatchKit and iOS App)
    问题 这个问题已经被问到,但没有得到任何答案。 我的 iOS 应用程序和我的 WatchKit 扩展共享一个应用程序组,核心数据存储在其中。 Core Data 模型(简化版)是一个 Person 对象,它有一个 Age 属性。 应用程序和扩展程序都可以随意更改年龄。 如果一个人在手表上的价值发生变化,除非我关闭并重新运行该应用程序,否则该应用程序不会反映它。 同往相反的方向。 如果我尝试将手表上的年龄更改为 20,并将手机上的年龄更改为 30,那么我会收到与合并冲突有关的错误,因为我没有使用最新版本的NSManagedObject 在其中一个设备上(以我最后更改的年龄为准)。 我怎样才能让两者一起工作而没有任何问题? 回答1 由于不会在不同进程之间接收通知,因此您需要改用 Darwin 通知。 您可以轻松地使用openParentApplication:reply:方法将更新从 Watch Extension 发送到 iOS App,但 Apple 无法将事件从 iOS App 发送到 Watch Extension。 我建议您使用 MMWormhole(或您自己的 Darwin 通知实现)在 Core Data 对象更新时发送 Darwin 通知。 这是一篇详细介绍库如何工作的文章。 如果您在 Watch Extension 中更新了 Core Data 对象,则向 iOS
  • WatchKit Complication: get Complication data from extension delegate
    I have all the data I need in my WatchKit Extension (passed from the iOS app). I used the data in the WatchKit InterfaceController to fill in a table, which works perfectly. I'm trying to figure out the best way to get that same data in my WatchKit ComplicationController. Currently, in the InterfaceController, the data gets passed in using didReceiveUserInfo: func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) { if let beachValue = userInfo["Surf"] as? String { places.append(Place(dataDictionary: ["Surf" : surfValue])) } else { print("Something went wrong") } }
  • 调用ExtensionDelegate来创建/刷新用于并发症的数据(Call ExtensionDelegate to create/refresh data for Complication)
    问题 我所有的数据创建都在ExtensionDelegate.swift完成。 问题是我的ComplicationController.swift getCurrentTimelineEntryForComplication函数之前没有调用ExtensionDelegate.swift 。 有任何想法吗? 这是我的代码和详细信息: 因此,我的ComplicationController.swift数组extEvnts为空: func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: ((CLKComplicationTimelineEntry?) -> Void)) { let extEvnts = ExtensionDelegate.evnts } 因为尚未调用我的ExtensionDelegate.swift ,所以将为数组创建数据: class ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate { private let session = WCSession.defaultSession() var receivedData = Array
  • 如何运行 WatchKit 应用程序(How to run a WatchKit App)
    问题 我无法从新项目运行 watchkit 应用程序。 如果我运行 Apple 的示例项目,它运行良好。 如果我通过添加 watchkit 的目标将 watchkit 添加到我现有的项目中。 然后运行它,即使在我的故事板中,我有一个设置为具有蓝色背景的 main 的界面控制器,但随着时间的推移我会得到一个黑屏。 这行代码被调用。 - (void)willActivate { // This method is called when watch view controller is about to be visible to user [self.listTable setNumberOfRows:5 withRowType:@"List"]; NSLog(@"%@ will activate", self); } 我的 iPhone 主应用程序(iPhone 应用程序)无法在模拟器上运行。 这基本上就是我所看到的。 回答1 跑的时候有没有把scheme改成WatchKit App target? 或者你只是像往常一样构建和运行 iOS 应用程序? 目前,您无法同时运行 iOS 应用程序目标和 Watch App 目标。 您必须按照此处所示切换方案/目标,然后选择相同的模拟器并显示您已经完成的手表 UI,(在模拟器中 ->“硬件”选项卡 -> 外部显示器 -> Apple
  • 尝试在实际 Apple Watch 上构建和运行 WatchKit 扩展时,如何避免错误“启动 'AppName' WatchKit 扩展时出错”?(How can I avoid the error “Error Launching 'AppName' WatchKit Extension” when trying to build and run a WatchKit Extension on an actual Apple Watch?)
    问题 当我尝试在真正的 Apple Watch 上构建和运行 WatchKit 扩展时,有时会收到以下错误消息: 我已经尝试为 iPhone 构建父应用程序,然后再次为我的 WatchKit 应用程序构建父应用程序,但我仍然收到错误消息。 有谁知道导致此错误消息的原因以及如何处理? 回答1 当在实际手表上安装 WatchKit 应用程序需要很长时间并且 Xcode 由于安装时间很长而超时等待进程启动时,似乎会发生这种情况。 这可能需要很长时间,原因有两个: Watch 有时需要一段时间才能“注意到”应用程序在开始传输之前需要更新。 如果您的 Apple Watch 应用有大量图像或其他需要传输到手表的内容,则通过蓝牙进行实际传输可能需要很长时间。 如果你想避免这个错误,这里有一些技巧,改编自这篇博文,它也可以告诉你如何加快你的应用安装:http://www.sneakycrab.com/blog/2015/5/28/在真正的苹果手表上调试时加快安装速度变慢 在 Xcode 中选择 iOS 基本方案以在您的手机上构建和安装。 (不是 WatchKit 应用扩展) 在 Xcode 中点击停止。 让 iOS 注意到它需要开始安装 Watch 应用程序。 有两种方法,a) 在手机上的 Apple Watch Companion App 中打开您的应用程序页面,或者 b)
  • Watchkit 并发症和位置更新?(Watchkit Complication and location updates?)
    问题 我正在尝试编写一个使用位置数据的复杂功能。 我可以在复杂控制器中获取位置数据,但由于结果异步返回,它似乎永远无法正常工作。 使用特定于位置的数据更新复杂功能的最佳方法是什么? 我认为在并发症中获取位置不是一个好主意(即使你可以)。 回答1 您应该在复杂数据源需要位置数据之前检索和缓存位置数据。 数据源类的工作是尽快为 ClockKit 提供任何请求的数据。 数据源方法的实现应该是最少的。 不要使用您的数据源方法从网络获取数据、计算值或做任何可能会延迟数据交付的事情。 如果您需要为您的复杂功能获取或计算数据,请在您的 iOS 应用程序或 WatchKit 扩展的其他部分执行此操作,并将数据缓存在您的复杂功能数据源可以访问它的位置。 您的数据源方法唯一应该做的就是获取缓存的数据并将其放入 ClockKit 所需的格式。 您可以在手机上检索位置数据,然后使用手表连接会话将transferCurrentComplicationUserInfo到您的分机委托。 扩展委托可以缓存复杂控制器的信息,或使用新数据扩展复杂时间线。
  • Parse Query in WatchKit
    I do a Parse query in my iPhone app, but I am getting errors trying to do the same Parse query in my Watch app. This is the query in my iPhone app: - (void)viewDidLoad { // GMT Date from Phone NSDate *gmtNow = [NSDate date]; NSLog(@"GMT Now: %@", gmtNow); // Query Parse PFQuery *query = [self queryForTable]; [query whereKey:@"dateGame" greaterThanOrEqualTo:gmtNow]; [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { if (!error) { NSMutableArray *localMatchup = [@[] mutableCopy]; for (PFObject *object in objects) { // Add objects to local Arrays [localMatchup addObject
  • Getting black screen on Watchkit simulator and "Waiting to Attach" when adding to existing project
    I'm interested in adding a Watchkit Extension to my existing app already in the app store. I've done my research, followed some tutorials, and now am ready to actually implement. The problem I'm having is, I can't seem to add a Watchkit App to my existing project and get it to run in the simulator. If I start a new project and do some tutorials or whatever, the Watchkit App runs fine. Adding to my existing project, I just get a black screen in the simulator window. Not even the status bar is present. http://i.imgur.com/kG7H06i.png Only lead I have so far is: In the debug navigator, I get
  • 在WatchKit中解析查询(Parse Query in WatchKit)
    问题 我在iPhone应用程序中执行了Parse查询,但是在Watch应用程序中尝试执行相同的Parse查询时遇到错误。 这是我的iPhone应用程序中的查询: - (void)viewDidLoad { // GMT Date from Phone NSDate *gmtNow = [NSDate date]; NSLog(@"GMT Now: %@", gmtNow); // Query Parse PFQuery *query = [self queryForTable]; [query whereKey:@"dateGame" greaterThanOrEqualTo:gmtNow]; [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { if (!error) { NSMutableArray *localMatchup = [@[] mutableCopy]; for (PFObject *object in objects) { // Add objects to local Arrays [localMatchup addObject:[object objectForKey:@"matchup"]]; // App Group NSString
  • 无法在Apple Watch上安装WatchKit应用(Can't install WatchKit app on Apple Watch)
    问题 我有一个WatchKit应用程序,可以在Simulator中正常运行。 但是,当我尝试在实际设备上运行它时,它永远不会完成安装,也永远不会提供任何错误消息或反馈。 iOS应用程序可以安装并正常运行。 我在iPhone上调出Apple Watch应用程序,它列出了该应用程序并显示正确的图标。 选择该选项后,“在Apple Watch上显示应用程序”开关将打开。 它的下面显示“正在安装...”。 它留在那里。 我还可以在Apple Watch上看到该应用程序图标。 选择它只会显示纺车轮指示器,好像它正在尝试加载一样。 根据我在这里,Apple Developer论坛和网上发现的其他建议,我尝试过的事情: 验证所有应用程序捆绑包ID均正确且匹配。 验证部署目标为iOS 8.2。 验证WatchKit App在模拟器中运行。 验证我的配置文件包含我的Apple Watch的UDID。 验证我的Apple Watch在设备中显示为“配对手表”。 从我的手机中删除该应用程序,然后在重新安装之前重新启动我的手机,手表和Macbook。 以上都不是。 有什么建议么? 谢谢! 托马斯·艾尔斯沃思(Thomas Aylesworth) 回答1 一位在“今日美国” iOS团队中工作的朋友(包括Apple Watch应用程序)建议我进入WatchKit App目标的项目设置,并将“跳过安装”设置为
  • Watchkit 应用程序的退出由 Watchkit 操作系统本身处理,我不需要清除或重置屏幕?(Exit from a Watchkit app is handled by the Watchkit OS itself, I don't need to clear or reset screen?)
    问题 好的,这是非常基本的,但我已经一遍又一遍地阅读文档,并希望确保我做对了。 通俗地说,我的 watchkit 应用程序将通过退出我代码外部应用程序的某些用户交互而关闭,对吗? 我不需要使用任何类型的关闭程序来清除或重置屏幕以进行另一次运行? 我不需要构建“退出”或“关闭应用程序”例程,对吗? 这令人困惑,因为文档暗示该应用程序将在它不再出现在屏幕上时停用(大概是通过用户操作,例如滑动到另一个应用程序),并且这将调用didDeactivate函数。 但文件还声称: 在 iOS 模拟器中,当您通过选择硬件 > 锁定锁定模拟器时,WatchKit 会调用当前界面控制器的 didDeactivate 方法。 当您随后解锁模拟器时,WatchKit 会再次调用该接口控制器的 willActivate 方法。 您可以使用此功能来调试您的激活和停用代码。 但是模拟器似乎没有以任何方式释放内存或重置变量或重置我的应用程序。 它在锁定时的状态下保持在屏幕上,当我解锁时它又回到那个状态。 让我担心的是,如果我弄错了,我会为一次运行构建一个应用程序。 但是我没有看到用于关机、屏幕清除或您在传统关机例程中期望的任何元素的例程。 回答1 我同意文档可能会令人困惑。 考虑它的最简单方法是,只要显示/激活界面控制器,就会调用 willActivate。 同样, didDeactivate 在隐藏