ile İzle bağlantı sorunlarını Ben ve İzleme ve iPhone'dan mesaj göndermek için Watch Connectivity
kullanın. Telefona bir mesaj gönderebilir ve uygulamayı başlatırken bir dizi dizi alabilirim, ancak eylemleri kullanırken aşağıdaki hatayı alıyorum;"İleti yanıtı çok uzun sürdü." - Projemde İzle OS 3
Hata Domain = WCErrorDomain Code = 7012 Mesaj yanıtı çok uzun sürdü.
Burada işler nasıl ayarlanır var;
izle İlk telefona bir mesaj gönderir ve sonra telefon bir WKInterfaceTable
görüntülenecek dize dizisi gönderir. Bu bazen uygulamayı yüklerken çalışır. (Bütün NSManagedObjects Items
denilen ve watchItems
denilen bir array
saklamak için onların title
dize özelliklerini kullanmak getir.
ben dizideki tüm öğeleri silmek ve yeni verilerle tablo yenilemek için nöbet eylemi var Ancak.
nöbetteeylem, ardından telefon saate yeni güncellenmiş dizi gönderir ve saat tablosunu günceller diziden silmeye telefona item
göndermek için bir sendMessage
işlevini kullanır. Ancak ben de aynı diziyi olsun geri ya da bir hata.
Oldukça basit değil, bu yüzden hiç ything, Swift 3 ve Watch OS3/iOS 10'dan önce gerçekten iyi çalıştı; tüm uygulama çalışmak için kullanılır. İşte
Herşeyin kurdunuz nasıl;
Phone App Delegesi
import WatchConnectivity
class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate {
var session : WCSession!
var items = [Items]()
func loadData() {
let moc = (UIApplication.shared.delegate as! AppDelegate).managedObjectContext
let request = NSFetchRequest<Items>(entityName: "Items")
request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)]
request.predicate = NSPredicate(format: "remove == 0", "remove")
do {
try
self.items = moc!.fetch(request)
// success ...
} catch {
// failure
print("Fetch failed")
}
}
//WATCH EXTENSION FUNCTIONS
//IOS 9.3
/** Called when the session has completed activation. If session state is WCSessionActivationStateNotActivated there will be an error with more details. */
//HAVE TO INCLUDE
@available(iOS 9.3, *)
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?){
print("iPhone WCSession activation did complete")
}
@available(iOS 9.3, *)
func sessionDidDeactivate(_ session: WCSession) {}
func sessionWatchStateDidChange(_ session: WCSession) {}
func sessionDidBecomeInactive(_ session: WCSession) {
}
//APP DELEGATE FUNCTIONS
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
//Check if session is supported and Activate
if (WCSession.isSupported()) {
session = WCSession.default()
session.delegate = self;
session.activate()
}
return true
}
}
//DID RECIEVE MESSAGE
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void) {
loadData()
func loadItems() {
watchItems.removeAll()
for a in self.items {
watchItems.append(a.title)
}
}
var watchItems = ["1","2","3","4","5"]
let value = message["Value"] as? String
//This is called when user loads app, and takes some time when using refresh action, sometimes times out
if value == "HELLOiPhone/[email protected]=" {
print("Hello Message Recieved")
loadItems()
//send a reply
replyHandler([ "Items" : Items ])
}
//Not sure if receiving but does not delete array and send back to watch
if value == "[email protected]+=-/" {
for index in self.items {
index.remove = 1
//Saves MOC
}
loadData()
loadTasksData()
//send a reply
replyHandler([ "Items" : Items ])
}
else {
for index in self.items {
if index.title == value {
index.remove = 1
//Saves MOC
}
}
loadData()
loadTasksData()
//send a reply
replyHandler([ "Items" : Items ])
}
}
İZLE
import WatchConnectivity
class SimplelistInterfaceController: WKInterfaceController, WCSessionDelegate {
/** Called when the session has completed activation. If session state is WCSessionActivationStateNotActivated there will be an error with more details. */
@available(watchOS 2.2, *)
public func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
//Fetch data is a function which sends a "HELLOiPhone/[email protected]=" message to receive the array and displays in the table. This works
fetchData()
}
var session : WCSession!
var items = ["Refresh Items"]
override func didAppear() {
fetchData()
}
override func willActivate() {
// This method is called when watch view controller is about to be visible to user
super.willActivate()
//Check if session is supported and Activate
if (WCSession.isSupported()) {
session = WCSession.default()
session.delegate = self
session.activate()
}
fetchData()
}
override func awake(withContext context: Any?) {
super.awake(withContext: context)
fetchData()
}
@IBAction func refresh() {
print("Refresh")
//Works but sometimes message is delayed
fetchData()
}
@IBAction func removeAll() {
print("Remove All Items is called")
if WCSession.default().isReachable {
let messageToSend = ["Value":"[email protected]+=-/"]
print("\(messageToSend)")
session.sendMessage(messageToSend, replyHandler: { replyMessage in
if let value = replyMessage["Items"] {
self.items = value as! [String]
Not receiving message
print("Did Recieve Message, items = \(self.items)")
}
}, errorHandler: {error in
// catch any errors here
print(error)
})
}
fetchData()
}
}
'WCSession' API'leri yalnızca özellik listesi türleriyle sözlükler alır, ancak ben 'Öğeler' gönderiyorsunuz. Bu nesneler nelerdir ve WCSession API'ları tarafından desteklendiklerinden emin misiniz? – ccjensen
@ccjensen Öğeler aslında bir "NSManagedObject" ürünüdür, ancak ben bunları getirmeden önce bir dizi oluşturmak için dize değeri olan başlık özelliklerini kullanıyorum. Ancak saatteki her getirme için, telefonun verileri güncellemesi ve refetch etmesi gerekiyor. Bu olmuyor ve çoğu kez hatayı alıyor. – JUSDEV
Ayrıca saat gerçekte verileri görüntülerken aslında gayet iyi, ancak nesneyi kaldırmaya çalışırken yanıt vermiyor. – JUSDEV