Отправка ссылки Firebase на Apple Watch

Итак, моя ситуация здесь немного сложна, но в основном у меня есть расширение Apple Watch, связанное с моим приложением, которое использует Firebase для получения и отправки данных. Я хочу, чтобы в моих часах была та же функциональность, что и в приложении, единственная проблема заключается в том, что мне нужно использовать ту же ссылку Firebase, потому что я использую аутентификацию Google, и мне нужно сохранить данные аутентификации одинаковыми (если нет другого способа). Итак, у меня есть часы, которые сначала запрашивают некоторые данные: индекс выбранного таймера (это приложение таймера) и ссылочную переменную Firebase. Но когда приложение для iPhone использует функцию ответа() и отправляет словарь следующим образом:

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

Переменная ref определяется как var ref = Firebase(url:"https://my-app-url.firebaseio.com/"). Ошибок при компиляции нет, но когда я запускаю расширение watch и подключаюсь к процессу приложения, мое приложение выдает хороший SIGABRT здесь: введите здесь описание изображения В журнале вообще ничего не печатается. Приложение просто вылетает после того, как я возобновляю процесс. У меня нет зацепок, откуда это. Если я не включаю переменную ref в словарь, он работает нормально, за исключением того факта, что у моего приложения для часов нет разрешения на чтение базы данных Firebase.


person doctor_ew    schedule 26.06.2015    source источник


Ответы (2)


Все данные, перемещаемые между вашими часами и устройством iOS с помощью метода handleWatchKitRequest, должны быть сериализуемыми.

Вероятно, вы можете попробовать использовать NSKeyedArchiver на своем объекте Firebase, чтобы узнать, сериализуем он или нет.

Вы пытались вернуть ссылку на вашу ссылку Firebase в виде строки, а затем создать экземпляр объекта Firebase на часах? (хотя, возможно, это не лучшее решение для прослушивания узлов Firebase как в приложении iOS, так и в приложении Watch)

Кроме того, я предлагаю вам взглянуть на NSUserDefaults и общие контейнеры, возможно, это хороший способ добиться того, что вы хотите сделать, вот ссылка: https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/WatchKitProgrammingGuide/DesigningaWatchKitApp.html#//apple_ref/doc/uid/TP40014969-CH3-SW4

person Slash705    schedule 27.06.2015
comment
Я сделал второй вариант, который вы сказали, просто вернул ссылку, и это сработало для меня. Я не думал, что это произойдет, потому что ссылка Firebase не будет аутентифицирована, но каким-то образом это так. И у меня есть узлы Firebase, работающие на обоих, и, похоже, все работает нормально. - person doctor_ew; 27.06.2015
comment
@ Slash705 прав насчет NSUserDefaults. Связана документация по аутентификации пользователей с помощью Firebase и Apple Watch firebase.com/docs/ios/libraries/watchkit/ - person David East; 15.07.2015

Существует официальная документация для Firebase и Apple Watch на аутентификация пользователя.

Включите группы приложений как для основного приложения, так и для расширения. Затем используйте 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 извлеките токен авторизации из 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")
    }
  })
}
person David East    schedule 15.07.2015
comment
Что вы порекомендуете в 2019 году с WatchConnectivity? У меня есть приложение для чата iOS, которое уже работает со всеми чатами, пользователями, сообщениями и т. д., полученными из Firebase. Я добавил расширение для часов с общим WCSessionManager, и рабочие запросы отправляются с часов на iPhone. Телефон отвечает текущей датой и версией iPhone из plist только для целей тестирования. Теперь я готов отправить текст сообщения чата с iOS на watchOS. Кажется, мне не нужна авторизация Firebase на часах. - person Edison; 18.03.2019