天道酬勤,学无止境

在不运行时保持我的 WatchKit 并发症最新(Keeping my WatchKit complications up to date when not running)

问题

我正在开发我的应用程序的 WatchKit 扩展,并且遇到了一些并发症问题。

我有一个显示给定总量的复杂功能,这取决于用户在 iOS 应用程序上的操作。 当 WatchKit 扩展运行时,iOS 应用程序使用-[WCSession updateApplicationContext:]方法更新手表应用程序上下文。 它工作正常,然后在我的 Watch 应用程序的 ExtensionDelegate 中,我用新数据手动更新了复杂功能。

但这仅在扩展程序运行时才可以(如果不是,则在下一次启动之前不会获取应用程序上下文)。

所以我编辑了我的代码,当用户在 iOS 应用程序中更改某些内容时,将复杂数据直接发送到 Watch,使用-[WCSession transferCurrentComplicationUserInfo:]方法(它写在文档中,应该唤醒 ExtensionDelegate 以接收用户信息在后台)。

我已经实现了 ExtensionDelegate 的-session:didReceiveUserInfo:方法来在它从 iOS 应用程序接收数据时更新复杂性,但是当扩展没有运行时它不起作用......(我不知道是否它曾经收到用户信息,因为我无法登录)

即使扩展没有运行,我应该如何做才能使我的并发症保持最新?

谢谢

PS:我正在使用手表模拟器,要“关闭”扩展程序,我只需重新启动手表(从硬件菜单中)

编辑:我设法在应用程序未运行时注销语句(通过打开 Watch Simulator 系统日志),当 iOS 向手表扩展程序发送新的复杂用户数据时,我收到这些行:

10 月 18 日 18:08:11 pc16 WatchApp 扩展 [26615]:扩展收到唤醒复杂功能支持的请求。

10 月 18 日 18:08:11 pc16 assertiond[26585]:断言失败:15A284 13S343:assertiond + 15398 [B48FCADB-A071-3A46-878B-538DC0AFF60B]:0x1

所以手表很好地接收了用户信息字典,但似乎无法唤醒扩展......

编辑 2 :这是 ExtensionDelegate 中应接收复杂用户信息的代码部分(但在应用程序未运行时不会调用):

- (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];
        }
    }
}

编辑 3 :WCSession 在扩展委托applicationDidFinishLaunching方法中设置:

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

    [...]
}
回答1

哇,我终于解决了这个问题!

看来,即使我没有在日志文件中看到它(请参阅我的最后一条评论),唤醒应用程序时也很好地调用了 WCExtensionDelegate 的init方法。

所以我只需要将 WCSession 设置块移动到init方法中:

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

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

    return self;
}

暂时它工作正常......

受限制的 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 ...) 。 然后
  • 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
  • Watchkit 并发症和位置更新?(Watchkit Complication and location updates?)
    问题 我正在尝试编写一个使用位置数据的复杂功能。 我可以在复杂控制器中获取位置数据,但由于结果异步返回,它似乎永远无法正常工作。 使用特定于位置的数据更新复杂功能的最佳方法是什么? 我认为在并发症中获取位置不是一个好主意(即使你可以)。 回答1 您应该在复杂数据源需要位置数据之前检索和缓存位置数据。 数据源类的工作是尽快为 ClockKit 提供任何请求的数据。 数据源方法的实现应该是最少的。 不要使用您的数据源方法从网络获取数据、计算值或做任何可能会延迟数据交付的事情。 如果您需要为您的复杂功能获取或计算数据,请在您的 iOS 应用程序或 WatchKit 扩展的其他部分执行此操作,并将数据缓存在您的复杂功能数据源可以访问它的位置。 您的数据源方法唯一应该做的就是获取缓存的数据并将其放入 ClockKit 所需的格式。 您可以在手机上检索位置数据,然后使用手表连接会话将transferCurrentComplicationUserInfo到您的分机委托。 扩展委托可以缓存复杂控制器的信息,或使用新数据扩展复杂时间线。
  • 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
  • 我可以创建没有情节提要(完全用代码编写)的WatchKit应用程序吗?(Can I create a WatchKit app without a storyboard (entirely in code)?)
    问题 我的团队目前正在开发一个iOS应用程序,其中我们根本不使用情节提要。 我们改用代码创建UI。 因此,为了保持一致性,如果我们可以完全用代码创建Watch App目标,那就太好了。 但是,“ WatchKit入门”视频和WatchKit Framework Reference都提到您需要Watch App目标的情节提要。 此外,在WKInterfaceObject.h , init方法被标记为不可用: - (instancetype)init NS_UNAVAILABLE; 因此,在不使用情节提要的情况下创建Watch App真的不可能吗? 如果是这样,此决定背后的原因是什么? 我的意思是,我们可以完全用代码创建iPhone / iPad应用程序,那么Watch为何与众不同? 回答1 如果您阅读了《 WatchKit编程指南》,您将看到您的应用程序实际上正在用户的iPhone上执行,并且该应用程序发送了要由WatchKit显示给手表的信息。 由于手表本身没有执行任何代码,因此无法执行程序化布局-WatchKit使用情节提要提供布局并呈现由iPhone上运行的应用程序提供的信息。 苹果公司表示,将来有可能开发本机Watch应用程序,因此有可能。 回答2 是的,现在可以使用Xcode 12.2。 创建新的Watch应用目标时(对于“使用伴随应用”和“独立”应用),我们必须选择“
  • WatchKit 模拟器不会加载应用程序(WatchKit Simulator Won't Load App)
    问题 最初,我认为这是我正在编写的代码的问题,但我刚刚从 Apple 下载了四五个 WatchKit 项目,甚至一个。 所有这些,都无法加载。 我已经卸载了 Xcode,重新安装了它,但仍然没有。 还有其他人遇到同样的问题吗? 解决方法? 解决方案? 您可以在上面的屏幕截图中看到加载屏幕的样子。 回答1 我已经对官方 Xcode 6.2 和 WatchKit Simulator 感到厌烦了。 它是如此的超级片状。 这是另一个有趣的事实,如果你的故事板中有一些 watchKit 不喜欢的约束,那么它也会无限循环,而不会让任何人知道它为什么这样做。 你需要做的是 拖放并添加另一个 WKInterfaceController 到您的故事板通过拖动其上的箭头使其成为主要删除旧的 watchKit 应用控制器现在开始一个一个地添加元素并继续测试直到它在模拟器上不再起作用(无限死亡旋转) 尝试清理和构建,即使在此之后它仍然保持死亡旋转球,那么您对故事板所做的最后更改是它不喜欢的。 我不得不花几个小时来调试这个废话。 更新:如果上述步骤对您不起作用,请尝试此操作 启动Xcode 编译、构建和启动 iPhone 模拟器现在不要关闭模拟器,而是执行 Xcode --> Product --> Stop 这将使模拟器保持运行,但将在其上运行的 iphone 应用程序顶部构建 -->
  • 调用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
  • watchOS - 显示有关并发症的实时出发数据(watchOS - Show realtime departure data on complication)
    问题 我有一个公共交通应用程序,其中包含火车的实时出发数据。 我想添加一个显示下一班火车出发时间的复杂功能。 是否可以显示(或刷新)复杂功能的实时数据? 例如,显示“3 分钟到 X 站”。 根据来自公共交通 API 的信息,数据可能每分钟都在变化。 我应该如何在 watchOS 2 或 watchOS 3 上完成此操作? 我知道 ETA 应用程序以复杂的方式显示旅行时间,但我不确定它们是如何实现的。 回答1 可以实时更新吗? 复杂功能并非旨在显示实时数据。 频繁更新会影响能源效率并影响电池(在手表和手机上)。 为了最大限度地减少功耗,ClockKit 要求您提供尽可能多的可用数据,然后缓存数据并在需要时呈现它。 虽然没有固定次数的复杂时间线可以重新加载,但复杂数据源受每日执行时间预算的约束。 如果您的应用程序的数据频繁更改,则可能难以提供足够的数据以在复杂情况下显示。 更糟糕的是,如果您过于频繁地刷新复杂功能数据,您可能会超出执行时间预算,并且您的复杂功能可能要到第二天才会更新。 一旦每日预算用完,对 reloadTimeline(和 extendTimeline)的调用就什么都不做。 如果您的复杂功能已超过其分配的每日执行时间预算,则调用此方法将无济于事。 谨慎调用此方法。 复杂功能如何显示相对时间? 您可以使用 CLKRelativeDateTextProvider
  • WatchKit 应用程序无法编译:“错误:WatchKit 扩展不包含任何 WatchKit 应用程序”(WatchKit App won't compile: “error: WatchKit Extension doesn't contain any WatchKit apps”)
    问题 有几个关于这个问题的帖子,但没有一个建议的解决方案适用于我的情况。 我正在尝试按照 Apple 提供的说明将 WatchKit 集成到一个简单的示例应用程序中(我现在已经尝试了几个)。 当我编译时,我收到以下错误消息: “错误:WatchKit 扩展不包含任何 WatchKit 应用程序。验证 WatchKit 应用程序的 Info.plist 中 WKWatchKitApp 的值是否设置为 YES。” 我已经成功编译并运行了 Apple Watch“目录”示例,所以我知道从 iPhone 到手表的角度来看,一切都在运行。 当我尝试与现有应用程序集成时,似乎有些不对劲。 我已经看到了关于这个主题的帖子(例如 WatchKit 应用程序不会在模拟器上运行),但没有一个修复程序在我的情况下起作用; 捆绑 ID 似乎都是正确的。 注意我试图在 iPhone 6 上而不是在模拟器上编译和运行。 有什么建议么? 回答1 当我更改主 iOS 应用程序的包 ID 时,我发生了此错误。 这是我在项目浏览器中所做的 在 WatchApp --> plist 下WKCompanionAppBundleIdentifier ==> Give the id of the iOS App (com.xxxx.appname) 在 WatchApp Extension --> plist
  • 无法在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 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 不调用 willActivate 方法(Watchkit not calling willActivate method)
    问题 在 Watchkit 的所有测试版中,我都能够无缝地运行我的手表应用程序,但是在上周发布的最新版本 (8.2) 中,我的 willActivate 方法几乎从未被调用过。 发生的事情是awakeWithContext 被调用并且手表停止并且旋转器永远旋转。 有人遇到过这个问题吗? 回答1 我发现通过键入 Command-L 来锁定和解锁设备(模拟器)会导致调用 willActivate 方法。 我希望你不必在真正的 Apple Watch 上这样做。 回答2 昨天刚遇到同样的问题。 就我而言,我使用的是页面导航,并且调用了初始视图控制器的awakeWithContext ,但从未调用willActivate 。 一些挖后,我发现,使用页面导航的时候, ALL的页面awakeWithContext将在启动时,初始页面的前称为willActivate 。 如果其中一个页面的awakeWithContext方法卡住了,则永远不会调用初始页面的willActivate方法。 您可能需要检查其他视图控制器的awakeWithContext方法以查看它们是否被卡住。 回答3 所以,我仍然不认为我确切地知道发生了什么或导致它的原因,但我遇到了完全相同的问题,并且我做了一些调查并取得了一些结果,所以我希望这有助于我们缩小范围. 我已经确定它与进入我的初始控制器的布局的复杂性有关。
  • 运行时遇到错误(域 = LaunchServicesError,代码 = 0)[重复](An error was encountered while running (Domain = LaunchServicesError, Code = 0) [duplicate])
    问题 这个问题在这里已经有了答案: 无法在模拟器中运行应用程序:运行时遇到错误(域 = LaunchServicesError,代码 = 0) (19 个回答) 4年前关闭。 我在尝试使用 Xcode 6 在 iOS 模拟器中启动我的应用程序时收到错误(域 = LaunchServicesError,代码 = 0)。我在谷歌中寻找解决方案,但没有找到任何实用的方法。 这个错误是什么意思? 回答1 此错误表明安装存在问题。 不幸的是,Xcode 实际上并没有打印错误消息的内容来让您更深入地了解,但是您可以查看 ~/Library/Logs/CoreSimulator/CoreSimulator.log 以查看其余的错误详细信息。 模拟设备的系统日志(~/Library/Logs/CoreSimulator/[Device UDID]/system.log)中也会有更多关于问题的信息; 在错误发生前后查找来自安装的消息)。 造成这种情况的常见原因包括捆绑包缺少 Info.plist、捆绑包的 Info.plist 中缺少键或不允许 Info.plist 中某些键的值。 如果您的应用程序的 Info.plist 不包含有效的 CFBundleVersion 键/值对,则您的应用程序可能会在第一次正确安装但无法更新。 许多用户似乎通过在每次安装后执行“重置内容和设置”来解决此问题
  • WatchOS 2:“无法安装手表应用程序”“启动‘TestApp WatchKit 应用程序扩展’时出错”(WatchOS 2: “Cannot Install Watch App” “Error Launching 'TestApp WatchKit App Extension'”)
    问题 每次尝试在 Xcode 7 beta 4 中安装 watchOS 2 应用程序时,我都会在 iOS 上收到 AlertView 弹出错误: 无法安装手表应用您的 iPhone 上已安装 TestApp,但 Apple Watch 的 TestApp 应用程序当前不可用。 我也尝试通过 Apple Watch iOS 应用程序安装 watchOS 应用程序,但我遇到了同样的错误。 当我尝试运行 watchOS 目标时,我得到了这个: 启动“TestApp WatchKit App Extension”时出错安装错误。 检查 iPhone 控制台以获取更多详细信息。” 我检查了 iPhone 控制台,没有其他详细信息。 我重新安装了 Xcode,删除并重新添加了所有模拟器,重置了模拟器内容和设置......这些都没有奏效。 我还创建了一个全新的项目。 这发生在模拟器和运行 iOS 9 beta 4 和 watchOS 2 beta 4 的物理设备/手表上。 有没有人想出解决方法或解决方法? 谢谢! 回答1 查看设备系统日志,我发现了我的问题: Jul 26 18:05:14 MacBook-Pro companionappd[22461]: (Error) WatchKit: validateWatchKitApplicationInfoDictionary, invalid
  • 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 在隐藏
  • 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
  • WatchKit2 错误代码 7007“无法访问配对设备上的会话”的真正原因是什么?(What is the very reason for WatchKit2 error code 7007 “session on paired device is not reachable”)
    问题 我正在为我的 Apple WatchOS2 应用程序开发概览视图。 我目前还没有完全理解稳定 WatchConnectivity 连接的先决条件。 我有一个奇怪的情况,在模拟器中我的 ComplicationController 可以成功发送一个 sendMessage 请求。 当我尝试看一眼时,sendMessage 请求失败: Error Domain=WCErrorDomain Code=7007 "WatchConnectivity session on paired device is not reachable." UserInfo={NSLocalizedDescription=WatchConnectivity session on paired device is not reachable. 我不得不承认,我没有在模拟器上启动我的应用程序。 但是为什么 ComplicationController 可以通信而 WatchController 不能。 我在互联网上没有找到关于错误 7007 的解释。 override func awakeWithContext(context: AnyObject?) { super.awakeWithContext(context) WCSession.defaultSession().sendMessage([
  • 我可以让我的 WatchKit 应用程序在 Apple Watch 的后台运行吗?(Can I keep my WatchKit App running in the background on the Apple Watch?)
    问题 我想知道是否有办法让我的 WatchKit 应用程序在后台运行,或者我是否可以将它编程为在满足特定条件后启动(即从非活动状态转移到活动状态)? 当 WK 应用程序打开并处于活动状态时,我的应用程序运行良好,甚至在 iPhone 休眠或父 iOS 应用程序处于 BG 模式时也能正常运行。 但是,我真的需要我的应用程序继续在手表本身的后台运行。 这可能吗? 回答1 不可能。 因为watchkit Apple Document 明确提到“ WatchKit 扩展不支持后台执行模式,它们仅在用户与 Apple Watch 上的相应应用程序交互时运行。 ”。 您可以参考苹果文档链接到 Apple Doc 阅读直接与包含的 iOS 应用程序通信。
  • 错误:WatchKit 应用程序的部署目标必须等于 iOS 8.2(原为 8.3)(error: WatchKit apps must have a deployment target equal to iOS 8.2 (was 8.3))
    问题 我刚刚从 8.2 更新了我的项目。 到 8.3(使用最新的 xCode 版本 6.3 6D570)。 现在我收到这个错误 错误:WatchKit 应用程序的部署目标必须等于 iOS 8.2(原为 8.3)。 项目和所有目标都设置为最新的 SDK 8.3 我错过了什么? 回答1 我通过以下方式解决了这个问题: 右键单击我的 PROJECTNAME.xcodeproj 文件并选择“显示包内容”。 在文本编辑器中打开 project.pbxproj。 更改“IPHONEOS_DEPLOYMENT_TARGET = 8.3;”的所有实例到“IPHONEOS_DEPLOYMENT_TARGET = 8.2;” 在此更改后,我的项目编译并运行良好。 回答2 构建成功。 我刚刚将 Watch App Target 的iOS Deployment Target改成了 8.2。 这是为什么? 回答3 好的,只需选择手表应用程序 -> 转到构建设置 -> 搜索 watchOS 部署目标 -> 根据您使用的手表之一在那里选择较低版本。