2015-07-08 20 views
10

Son zamanlarda, bir projede çalıştığım için yine de Watch/iPhone iletişimine bağlı. Ama kodum bazen işe yarıyor ve bazen işe yaramıyor, bu da benim için biraz tuhaf çünkü kodun işe yarayıp yaramadığını düşünüyorum. 50/50 olamaz. Bu yüzden neyin yanlış gittiğine dair hiçbir fikrim yok. iPhone'daWCSession.sendMessage çalışıyor 50/50

kurulum WCSession: Watch üzerinde

class WatchCommunicationController: NSObject, WCSessionDelegate { 

    var session : WCSession? 

    override init(){ 

     // super class init 
     super.init() 

     // if WCSession is supported 
     if WCSession.isSupported() { // it is supported 

      // get default session 
      session = WCSession.defaultSession() 

      // set delegate 
      session!.delegate = self 

      // activate session 
      session!.activateSession() 

     } else { 

      print("iPhone does not support WCSession") 
     } 
    } 

    ... ... 
} 

benzer WCSession kurulumu:

class PhoneCommunicationController: NSObject, WCSessionDelegate { 

    var session : WCSession? 

    override init(){ 

     // super class init 
     super.init() 

     // if WCSession is supported 
     if WCSession.isSupported() { // it is supported 

      // get default session 
      session = WCSession.defaultSession() 

      // set delegate 
      session!.delegate = self 

      // activate session 
      session!.activateSession() 
     } else { 

      print("Watch does not support WCSession") 
     } 
    } 

    ... ... 
} 

Watch mesajı göndermek:

fonk sendGesture (jest: GKGesture) {

// if WCSession is reachable 
if session!.reachable {  // it is reachable 

    // create the interactive message with gesture 
    let message : [String : AnyObject] 
    message = [ 
       "Type":"Gesture", 
       "Content":gesture.rawValue 
       ] 

    // send message 
    session!.sendMessage(message, replyHandler: nil, errorHandler: nil) 
    print("Watch send gesture \(gesture)") 

} else{      // it is not reachable 

    print("WCSession is not reachable") 
} 

}

ilgili enum:

enum GKGesture: Int { 
    case Push = 0, Left, Right, Up, Down 
} 

iPhone'da iletisini: nasılsa

func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) { 

     //retrieve info 
     let type = message["Type"] as! String 
     let content = message["Content"] 

     switch type { 

     case "Gesture": 
      handleGesture(GKGesture(rawValue: content as! Int)!) 
     default: 
      print("Received message \(message) is invalid with type of \(type)") 
     } 

    } 

    func handleGesture(gesture : GKGesture){ 

     print("iPhone receives gesture \(gesture)") 

     var notificationName = "" 

     switch gesture { 

     case .Up: 
      notificationName = "GestureUp" 
     case .Down: 
      notificationName = "GestureDown" 
     case .Left: 
      notificationName = "GestureLeft" 
     case .Right: 
      notificationName = "GestureRight" 
     case .Push: 
      notificationName = "GesturePush" 
     } 

     NSNotificationCenter.defaultCenter().postNotificationName(notificationName, object: nil) 

    } 

Xcode benim Watch uygulamasını hata ayıklama olamaz hata ayıklama oturumu taşikardi. Nedenini bilmiyorum. Bu yüzden tek taraflı iPhone ile hata ayıkladım.

bazen

+0

"İçeriği sıfırla ve ayarları" denediniz ve saat/iPhone simülatörlerini ve Xcode'unuzu yeniden başlattınız mı? Bu, hata ayıklama oturumu ekli almak için ipuçları. Bunun nasıl gittiğini anlatın ve daha sonra iPhone ve Apple Watch'ımla – Philip

+0

hata ayıklama ile ilgili WatchConnectivity sorunları konusunda size yardımcı olabilirim. –

+0

ulaşılabilirlik için özel bir şey yapmak zorunda mıydınız? Benim kod çok küçük benzer, ama benim kontrol her zaman geri bildirim – prawn

cevap

6

: Eğer kalkarken ve sadece hatayı baskı ile alabilirsiniz çalışan, ancak bu kodu nakliye ise gerçekten uygun hataları işlemek gerektiğini ise Şimdilik hata işleyicisi !! uygulanmadı WCSession içinde transfer olurken Int Intel'in NSNumber'e sarılıp sarılmayacağını bilmiyorum. Ben Int'i işe yaramayacak enumun temel sınıfı olarak kullanıyorum ve String temel sınıf olduğunda çalışıyorum.

Bağlantı Bilinen Sorun NSNumber kullanırken Uygulamanız çökebilir ve NSDate WCSession API ile itiraz ediyor.

Geçici çözüm: WNSession API'lerini çağırmadan önce numaralı telefona bir NSNumber veya NSDate nesnesini bir dizeye dönüştürün. Alıcıya tarafındaki ters dönüşümü yapın.

Watch OS 2 Beta 4 release note

2

Benim tahminim sendMessage için çağrı başarısız durumlarda bir hata dönen olmasıdır. Baskı dışarı "jest alır” ve bazen değil. Ve bildirim almak için aynı var, ama sen

// send message 
session.sendMessage(message, replyHandler: nil, errorHandler: { (error) -> Void in 
    print("Watch send gesture \(gesture) failed with error \(error)") 
}) 
print("Watch send gesture \(gesture)") 
+0

Enum'umu Int'ten String'e değiştirerek sabitledim. Ve şimdi her zaman çalışıyorum. Nedenini düşünebilir misin? Daha fazla bilgi: Bu sendMessage'ı tetiklemek için saatteki düğmeye bastığımda her şey değişir, durum çubuğunda küçük progressIndicator gösterilir. Ama artık değişimden sonra değil. –

+0

hayır, bu bana hiç mantıklı gelmiyor :) Muhtemelen gerçek kodlara bakmalıyım ve sizin için daha fazla cevap almak için kendim çalıştırabilirim – ccjensen

1

Kişisel akış doğrudur ama zorluk hata ayıklama nasıl anlamaktır:

ayıklama İzle:

  1. çalıştırın iPhone hedef ve zaman yapılır çarptı Durdur düğmesi.
  2. Simülatörün içindeki iOS uygulamasını açın (Xcode'dan değil, simülatörden manuel olarak çalıştırın) ve orada asılı kalmasına izin verin.
  3. İzleme hedefine geçin (AppName WatchKit Uygula), ilgili kesme noktasını koyun ve çalıştırın.
  4. iOS uygulaması arka planda otomatik olarak konacak ve ihtiyacınız olan her şeyi göndermek için sendMessage yöntemini (İzleme hedefinde) kullanabilecek ve iOS uygulamanızda bir replayHandler varsa, ilgili İzleme hedefe sendMessage içindeki mesajları (yani InterfaceController)

Küçük Swift örnek: iOS uygulamasıyla izlebir Sözlüğü gönderme

:

if WCSession.defaultSession().reachable == true { 
     let requestValues = ["Send" : "From iWatch to iPhone"] 
     let session = WCSession.defaultSession() 

     session.sendMessage(requestValues, 
      replyHandler: { (replayDic: [String : AnyObject]) -> Void in 
       print(replayDic["Send"]) 

      }, errorHandler: { (error: NSError) -> Void in 
       print(error.description) 
     }) 
    } 
    else 
    { 
     print("WCSession isn't reachable from iWatch to iPhone") 
    } 

İzle'den mesaj alma ve iOS uygulamasından bir tekrarını gönderme:

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { 

     print(message.values) 

     var replyValues = Dictionary<String, AnyObject>() 

     replyValues["Send"] = "Received from iphone" 
     // Using the block to send back a message to the Watch 
     replyHandler(replyValues) 
    } 

ayıklama iPhone:

ayıklama tam tersi izlemek Ayrıca

@sharpBaga'nın cevabı önemli bir yere sahiptir.