2016-11-20 7 views
3

何か送信しようとすると、WCSessionが起動していないというエラーが表示されます。そして私は何が間違っているのか分からない。私は、必要とされるものであることが前提とされたservalの既製のソリューションをテストしました。しかし、私のシミュレータや物理的なデバイスでは動作しません。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]) { 

      } 
    .... 

は、任意の間違ったコードや実装があります?何も私のために働くので。

+0

この上の任意の進展? – Dan

+0

@Dan残念ながら.. – 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) 
関連する問題