向Apple Watch发送Firebase参考

时间:2015-06-26 19:50:42

标签: objective-c swift firebase watchkit apple-watch

好吧所以我的情况有点复杂,但基本上我有一个Apple Watch扩展程序与我的应用程序连接,它使用Firebase接收和发送数据。我想在手表中使用与应用程序相同的功能,唯一的问题是我需要使用相同的Firebase参考,因为我使用Google身份验证,我需要保持身份验证数据相同(除非有另一种方式)。所以我手表所做的是最初请求一些数据:所选计时器的索引(它是一个计时器应用程序)和Firebase参考变量。但是,当iPhone应用程序使用reply()函数并发送回如下字典时:

reply(["replyInfoType": "watchInfo", "selectedTimerKey": keySelected, "refFirebase": ref])

ref变量定义为var ref = Firebase(url:"https://my-app-url.firebaseio.com/")。 编译时没有错误,但是当我运行watch扩展并附加到应用程序进程时,我的应用程序在这里抛出了一个不错的SIGABRT: enter image description here 根本没有在日志中打印任何内容。在我取消暂停过程后,应用程序崩溃了。我没有关于它来自哪里的线索。如果我没有在字典中包含ref变量,那么它运行正常,除非我的监视应用没有阅读Firebase数据库的权限。

2 个答案:

答案 0 :(得分:3)

official documentation for Firebase and the Apple Watch on user authentication

为主机应用和扩展程序启用应用组。然后使用NSUserDefaults在用户登录时将用户的身份验证令牌保存在主机应用程序中。

let defaults = NSUserDefaults(suiteName: "group.username.SuiteName")!
ref.observeAuthEventWithBlock { [unowned self] (authData: FAuthData!) in
  if authData != nil {
    defaults.setObject(authData.token, forKey: "FAuthDataToken")
    defaults.synchronize()
  }
}

在Watch App Extension中,从NSUserDefaults检索身份验证令牌,并在authWithCustomToken功能中调用awakeWithContext

override func awakeWithContext(context: AnyObject?) {
  super.awakeWithContext(context)
  ref = Firebase(url: "https://<your-firebase-app>.firebaseio.com/updates")
  updates = [FDataSnapshot]()
  // Use the same suiteName as used in the host app
  let defaults = NSUserDefaults(suiteName: "group.username.SuiteName")!
  // Grab the auth token
  let authToken = defaults.objectForKey("FAuthDataToken") as? String
  // Authenticate with the token from the NSUserDefaults object
  ref.authWithCustomToken(authToken, withCompletionBlock: { [unowned self] (error: NSError!, authData: FAuthData!) in
    if authData != nil {
      println("Authenticated inside of the Watch App!")
    } else {
      println("Not authenticated")
    }
  })
}

答案 1 :(得分:1)

通过 handleWatchKitRequest 方法在手表和iOS设备之间移动的所有数据都必须是可序列化的。

您可以尝试在Firebase对象上使用NSKeyedArchiver来查明它是否可序列化。

您是否尝试将Firebase参考的链接作为字符串返回,然后在Watch上实例化Firebase对象? (但可能不是在iOS和Watch应用程序中监听firebase节点的最佳解决方案)

另外,我建议您查看NSUserDefaults和共享容器,这可能是实现您想要做的事情的好方法,这里是链接:https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/WatchKitProgrammingGuide/DesigningaWatchKitApp.html#//apple_ref/doc/uid/TP40014969-CH3-SW4