2015-06-26 3 views
2

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

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

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

ответ

1

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

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

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

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

+0

Я сделал второй вариант, который вы сказали, просто вернув ссылку, и это сработало для меня. Я не думал, что это произойдет, потому что ссылка Firebase не будет аутентифицирована, но как-то она есть. И у меня есть узлы Firebase, работающие на обоих, и, похоже, они работают нормально. – drewsdunne

+0

@ Slash705 правильно относится к NSUserDefaults. Связано - это документация по аутентификации пользователей с Firebase и Apple Watch https://www.firebase.com/docs/ios/libraries/watchkit/guide.html#section-user-authentication –

2

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") 
    } 
    }) 
}