小编ccj*_*sen的帖子

何时何地获取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
查看次数

将WCSession与多个ViewController一起使用

我发现了许多问题和许多答案,但没有最后的例子请求:

任何人都可以在Objective C中给出最后一个示例,将WCSession与IOS应用程序和带有多个ViewController的Watch应用程序(WatchOS2)一起使用的最佳做法是什么.

到目前为止我注意到的是以下事实:

1.)在AppDelegate的父(IOS)应用程序中激活WCSession:

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Any other code you might have

    if ([WCSession isSupported]) {
        self.session = [WCSession defaultSession];
        self.session.delegate = self;
        [self.session activateSession];
    }
}
Run Code Online (Sandbox Code Playgroud)

2.)在WatchOS2侧使用<WCSessionDelegate>.但其余的对我来说完全不清楚!一些答案是通过在传递的字典中指定键来讨论,如:

[session updateApplicationContext:@{@"viewController1": @"item1"} error:&error];
[session updateApplicationContext:@{@"viewController2": @"item2"} error:&error];
Run Code Online (Sandbox Code Playgroud)

其他人正在讨论检索默认会话

WCSession* session = [WCSession defaultSession];
[session updateApplicationContext:applicationDict error:nil];
Run Code Online (Sandbox Code Playgroud)

其他人在谈论不同的队列?"如果有必要,客户有责任派遣到另一个队列.发送回主要队列."

我完全糊涂了.因此,请举例说明如何将WCSession与IOS应用程序和带有多个ViewController的WatchOS2应用程序一起使用.

我需要它用于以下情况(简化):在我的父应用程序中,我测量心率,锻炼时间和卡路里.在Watch应用程序1. ViewController我将在2显示心率和锻炼时间.ViewController我也将显示心率和燃烧的卡路里.

ios watchkit watchos-2

8
推荐指数
1
解决办法
5039
查看次数

从Interface Builder实例化的Zombie Objects From Views

我在应用程序的关键时刻发生了崩溃.但是,崩溃似乎来自一个过度发布的UIView对象(更具体地说是UITableView的标题视图,在本例中是一个UISearch栏).关于这一点的奇怪之处在于它是从nib文件中实例化的.这是崩溃......

我已经设置了我的nib文件,以便与Apple在其中一个示例项目中完全匹配.

在此输入图像描述

我也花时间用NSZombieEnabled和使用Instruments来分析它.但是,为什么会发生这种情况,我仍然无法做出正面或反面.这是保留/释放的配对....

在此输入图像描述

并且在创建UIView对象时暴露堆栈跟踪.

在此输入图像描述

此类错误的常见示例是创建NSError对象并将其分配给autorelease块中的out参数.但是,我不希望UIView看到同样的问题.我也没有在代码中的任何地方看到自动释放块(在主运行循环中保存一个).有关如何解决这个问题的任何想法?

memory-management objective-c interface-builder ios

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

WatchKit数据无法显示

我将数据从iOS传递到WatchKit. 我无法得到数据显示在WatchKit方面收到的某种方式.

这很好用:iOS TableViewController

func getCloudKit() {
    ///...
    let publicData = container.publicCloudDatabase
    publicData.performQuery(query, inZoneWithID: nil) { results, error in
        if error == nil { // There is no error
            for play in results! {
                let newPlay = Play()
                    newPlay.tColor = play["TColor"] as! String

                do {
                    try WatchSessionManager.sharedManager.updateApplicationContext(["color" : newPlay.tColor])
                    NSLog("NewPColor: %@", newPlay.tColor)
                } catch {
                    print(error)
                }
                self.objects.append(newPlay)
            }
        } else {
            print(error)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这不是调用任何NSLogs或显示任何数据:WatchKitInterfaceController

import WatchConnectivity


class InterfaceController: WKInterfaceController, WCSessionDelegate {

    @IBOutlet var …
Run Code Online (Sandbox Code Playgroud)

ios swift watchkit watchos-2

5
推荐指数
1
解决办法
125
查看次数

WatchKit didReceiveApplicationContext没有被调用

不敢didReceiveApplicationContext打电话。有任何想法吗?

InterfaceController

import WatchKit
import Foundation
import WatchConnectivity

class InterfaceController: WKInterfaceController, WCSessionDelegate {

    @IBOutlet var colorLabel: WKInterfaceLabel!

    private let session: WCSession? = WCSession.isSupported() ? WCSession.defaultSession() : nil

    override init() {
        super.init()
        session?.delegate = self
        session?.activateSession()
    }

    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)
    }

    func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]){
        let colors : String = applicationContext["color"] as! String
        colorLabel.setText(colors)
        NSLog("session did receive application context")
    }

}
Run Code Online (Sandbox Code Playgroud)

我一直在跟随本教程:http : //www.kristinathai.com/watchos-2-how-to-communicate-between-devices-using-watch-connectivity/

NSLogcolorLabel …

swift watchkit xcode7 watchos-2

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