У меня есть массив, хранящийся на моем iPhone, который мне нужно отправить на Watch в фоновом режиме, когда он обновляется по телефону. Я следил за учебником на RayWenderlich.com, но я просто не могу заставить его работать.Почему iPhone не переносит массив на Apple Watch?
Телефонный код:
import UIKit
import Foundation
import WatchConnectivity
class ViewController: UIViewController, WCSessionDelegate {
var array1 = ["Hi", "This", "Is", "A", "Test"]()
var array2 = ["1", "2", "3", "4", "5"]()
var session: WCSession?
private func startSession() {
if WCSession.isSupported() {
session = WCSession.defaultSession()
session?.delegate = self
session?.activateSession()
}
}
private func sendToWatch() {
if let session = session where session.reachable {
session.transferUserInfo(["Array1": array1])
}
if let session = session where session.reachable {
session.transferUserInfo(["Array2": array2])
}
}
sendToWatch()
}
И Часы Код:
import WatchKit
import Foundation
import WatchConnectivity
var array1 = [String]()
var array2 = [String]()
class InterfaceController: WKInterfaceController, WCSessionDelegate {
var session: WCSession?
@IBOutlet var table: WKInterfaceTable!
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
startSession()
table!.setNumberOfRows(array1.count, withRowType: "tableRowController")
var index = 0
while index < array1.count {
let row = table.rowControllerAtIndex(index) as! tableRowController
row.rowLabel.setText(array1[index])
row.dateLabel.setText(array2[index])
index++
}
}
private func startSession() {
if WCSession.isSupported() {
session = WCSession.defaultSession()
session?.delegate = self
session?.activateSession()
}
}
func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) {
if let received1 = userInfo["Array1"] as? [String] {
dispatch_async(dispatch_get_main_queue(), {() -> Void in
array1 = received1
})
}
if let received2 = userInfo["Array2"] as? [String] {
dispatch_async(dispatch_get_main_queue(), {() -> Void in
array2 = received2
})
}
}
}
В таблице на часы отлично работает, если я введу фиктивных данных в массивы, так что я знаю, что все настроено правильно. У меня действительно есть проблемы с Transfer/Receiving.
ВТОРАЯ ПОПЫТКА:
Я сейчас пытаюсь использовать updateApplicationContext()
в отличие от transferUserInfo()
. Я удалил session.reachable
чек и изменил код.
Телефон:
private func sendToWatch() {
do {
let applicationDict = ["Array1": array1]
let applicationDict2 = ["Array2": array2]
try WCSession.defaultSession().updateApplicationContext(applicationDict)
try WCSession.defaultSession().updateApplicationContext(applicationDict2)
}
catch {
print(error)
}
}
Часы Код:
ТРЕТЬЯ ПОПЫТКА:
Я теперь в состоянии иногда получить либо array1 или array2 к появляются на Watch. Конечно, это приводит к сбою приложения, так как оба массива не получены успешно. Может ли кто-нибудь помочь мне в этом?
Часы Код:
func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
dispatch_async(dispatch_get_main_queue()) {() -> Void in
if let retrievedArray1 = applicationContext["Array1"] as? [String] {
array1 = retrievedArray1
print(array1)
}
if let retrievedArray2 = applicationContext["Array2"] as? [String] {
array2 = retrievedArray2
print(array2)
}
self.table!.setNumberOfRows(array1.count, withRowType: "tableRowController")
var index = 0
while index < array1.count {
let row = self.table.rowControllerAtIndex(index) as! tableRowController
row.rowLabel.setText(array1[index]) //My crash happens either here or....
row.dateLabel.setText(array2[index]) //here because both arrays aren't being received and unreceived array is out of index
index++
}
}
}
Можете ли вы опубликовать свой сеанс, настроенный для приложения iOS? – ccjensen
Спасибо, я только что сделал! – bkwebhero
updateApplicationContext передает только последний словарь, так он работает. Вы хотите использовать transferUserInfo или помещать как array1, так и array2 в один и тот же словарь и вызывать updateApplicationContext один раз – ccjensen