2016-04-09 19 views
0

私はWCSessionにNatashaTheRobotシングルトンを使用していましたが、sendMessageを正しく動作させることができませんでした。sendMessage - WatchConnectivityに関する問題

私の目標は、ウォッチアプリからiOSアプリにメッセージを送信し、iOSアプリからウォッチアプリに辞書を転送することです。

はここ

import WatchKit 
import WatchConnectivity 

class ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate { 

var session:WCSession! 
var boolCheck = Int() 

func applicationDidFinishLaunching() { 

    WatchSessionManager.sharedManager.startSession() 
    print("Here i am") 
} 

func applicationDidBecomeActive() { 
    print("I AWOKE") 
} 

func applicationWillResignActive() { 

} 

} 

class WatchSessionManager: NSObject, WCSessionDelegate { 

static let sharedManager = WatchSessionManager() 
private override init() { 
    super.init() 
} 

private let session: WCSession = WCSession.defaultSession() 

func startSession() { 
    session.delegate = self 
    session.activateSession() 
    if WCSession.isSupported(){ 
     self.session.sendMessage(["b":"peek"], replyHandler: nil, errorHandler: nil) 
     print("works") 
    } else { 
     print("don't work") 
    } 

func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) { 
    let sweetN = message["b"]! as? String 
    dispatch_async(dispatch_get_main_queue(), { 
     if sweetN == "insertData1" { 
      NSNotificationCenter.defaultCenter().postNotificationName("sweetData1", object: nil) 
    }) 
} 
func sendMessage(message: [String : AnyObject], 
    replyHandler: (([String : AnyObject]) -> Void)? = nil, 
    errorHandler: ((NSError) -> Void)? = nil) 
{ 
    session.sendMessage(message, replyHandler: replyHandler, errorHandler: errorHandler) 
    print("this is message \(replyHandler)") 
    var pretty = replyHandler 
} 

ここで(AppDelegateとは別の)iOSアプリでWCSingletonで私のコード

import WatchConnectivity 

@available(iOS 9.0, *) 
class WatchSessionManager: NSObject, WCSessionDelegate { 

static let sharedManager = WatchSessionManager() 
private override init() { 
    super.init() 
} 

private let session: WCSession? = WCSession.isSupported() ? WCSession.defaultSession() : nil 

private var validSession: WCSession? { 

    if let session = session where session.paired && session.watchAppInstalled { 
     return session 
    } 
    return nil 
} 

func startSession() { 
    session?.delegate = self 
    session?.activateSession() 
} 
func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) { 
    //receieve messages from watch 
    print(message["b"]! as? String) 
    let sweetN = message["b"]! as? String 
    dispatch_async(dispatch_get_main_queue(), { 
     if sweetN == "peek"{ 
      NSNotificationCenter.defaultCenter().postNotificationName("giveMeInfo", object: nil) 
     } 
    } 
    }) 
} 

@available(iOS 9.0, *) 
extension WatchSessionManager { 

func sendMessage(message: [String : AnyObject], 
    replyHandler: (([String : AnyObject]) -> Void)? = nil, 
    errorHandler: ((NSError) -> Void)? = nil) 
{ 
    session!.sendMessage(message, replyHandler: replyHandler, errorHandler: errorHandler) 
} 

} 

だとここで私が使用する方法ですExtensionDelegateで私のコードですViewController(発射されたNSNotificationCenter)。しかし、コードのこの部分は決して実行されません(これは奇妙です、なぜなら、私がapplicationContextを使うと完全に動作するからです)。

func giveMeInfo(){ 
     let linesAdd1 = linesAdd as! AnyObject 
     WatchSessionManager.sharedManager.sendMessage(["a":linesAdd1]) 
} 

これらの部品を一緒に使用する方法についての洞察は非常に歓迎します。

答えて

2

あなたのコードは、私には少し混乱して、右に見えるが、あなたは次のような理由から、このアプローチでのトラブルに実行されます:あなたにViewControllerをウォッチの変更に通知を受信した場合

  • 非アクティブ状態、のsendMessage()メソッドは、バックデータを送信するために動作しません:それはアクティブで、ランニングバックグラウンドで対応するiOSアプリをウェイクアップし、それが到達可能になりながら

    は、あなたのWatchKit拡張子からこのメソッドを呼び出します。 iOSアプリからこのメソッドを呼び出すと、対応するWatchKit拡張機能が起動されません。このメソッドを呼び出すと、相手が到達不能になる(またはメッセージが配信される前に到達できなくなる)場合、errorHandlerブロックは適切なエラーで実行されます。 errorHandlerブロックは、messageパラメータに非プロパティリストデータ型が含まれている場合にも呼び出すことができます。

  • データを戻したい場合は、返信ブロックを使用する必要があります。 しかし、あなたの設定でこれらのブロックを理由と呼ばれることはありません。

のsendMessage(返信== nilの) - > didReceiveMessage(...メッセージ:)

のsendMessage(= nilを答えます!) - - > didReceiveMessage(...メッセージ:replyHandler :)

  • 一方、あなたはcontextMethodを使用する場合:

    データ項目トンの辞書を転送するために、このメソッドを使用しますo相手のアプリ。機会が発生すると、カウンターパートが目を覚ますまでにデータを使用できるようにするという目的で、コンテキストデータが送信されます。相手のセッションはデータをセッションに配信します:didReceiveUpdate:そのデリゲートのメソッド。相手はセッションのreceivedApplicationContextプロパティからデータを取得することもできます。

私はこれが役に立てば幸い;)