2016-11-20 97 views
3

我得到的WCSession沒有被激活錯誤,當我嘗試發送的東西。我不知道我做錯了什麼。我測試了「必須」工作的僕人預製解決方案。但它不適用於我的模擬器和物理設備。WCSession還沒有被激活

一些代碼:

我的應用程序委託:

import UIKit 
import CoreData 
import WatchConnectivity 


@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate { 

    var window: UIWindow? 


    func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : String]) -> Void) { 
     replyHandler(["message": "Hello Watch!"]) 
    } 

    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { 
    } 

    func sessionDidBecomeInactive(_ session: WCSession) { 

    } 

    func sessionDidDeactivate(_ session: WCSession) { 

    } 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     // Override point for customization after application launch. 

     if WCSession.isSupported() { 
      let session = WCSession.default() 
      session.delegate = self 
      session.activate() 
     } 

     return true 
    } 

........ 


} 

我interfaceController:

import WatchKit 
import Foundation 
import WatchConnectivity 


class InterfaceController: WKInterfaceController { 


    override func awake(withContext context: Any?) { 
     super.awake(withContext: context) 

     // Configure interface objects here. 
    } 

    override func willActivate() { 
     // This method is called when watch view controller is about to be visible to user 
     super.willActivate() 

     if WCSession.default().isReachable { 
      let messageDict = ["message": "hello iPhone!"] 

      WCSession.default().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in 
       //print(replyDict) 
      }, errorHandler: { (error) -> Void in 
       // print(error) 
      }) 
     } 

    } 

    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { 
    } 

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

    } 

    override func didDeactivate() { 
     // This method is called when watch view controller is no longer visible 
     super.didDeactivate() 
    } 
} 

的extensionDelegate:

import WatchKit 
    import WatchConnectivity 

     class ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate { 

     func applicationDidFinishLaunching() { 
      // Perform any final initialization of your application. 
      if WCSession.isSupported() { 
       let session = WCSession.default() 
       session.delegate = self 
       session.activate() 
      } 
     } 

     func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { 
     } 

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

      } 
    .... 

是否有任何錯誤代碼或實施S'因爲沒有爲我工作。

+0

對此有何進展? – Dan

+0

@丹不幸不.. – da1lbi3

回答

10

我想出了我的問題,我認爲你的問題是相似的。我在過去曾致電activate()後立即嘗試發送消息,但自從引入​​函數後,我需要從那裏發送消息。

所以我認爲您的解決方案就是其中之一:

  1. 讓您InterfaceController是WCSessionDelegate,將所有 WCSession激活調用那裏,並從 ​​
  2. 發送消息從 發送郵件​​在ExtensionDelegate(在我的 應用程序中,我處理ExtensionDelegate中的所有通信)
  3. ExtensionDelegate從​​發佈通知,並在 InterfaceController
從這個

除了增加一個觀察者來處理它,我想你也可能有問題,因爲session(didReceiveMessage:)聲明是錯誤的AppDelegate中(或至少我有一個問題,當我想你的代碼)

新的聲明是:

func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void)