2016-02-02 17 views
6

Watch接続を使用してiPhoneからWatchにアレイをリクエストしています。エラー:「メッセージ返信が長すぎます」 - WCSession Watch OS2

アイデアは時計からsendMessageであり、iPhoneはdidReceiveMessageの方法で配列に返信します。

iPhoneは応答していないようですが、ウォッチからメッセージを送信するとiPhoneがアプリケーションを開くと思っていました。私はsendMessageしかしまだ運がないときにアプリケーションを開くことさえしようとしました。私が十分に待っていると、次のエラーメッセージが表示されます。

Error Domain=WCErrorDomain Code=7012 "Message reply took too long." UserInfo={NSLocalizedDescription=Message reply took too long., NSLocalizedFailureReason=Reply timeout occured.}

誰かが間違っている可能性がありますか?

アップルウォッチ

import WatchKit 
import Foundation 
import CoreData 
import WatchConnectivity 

class BookmarkedInterfaceController: WKInterfaceController, WCSessionDelegate { 

var session : WCSession! 
var objects: [AnyObject]! 

@IBOutlet var table: WKInterfaceTable! 

override func willActivate() { 
    super.willActivate() 
    //Check if session is supported and Activate 
    if (WCSession.isSupported()) { 
     session = WCSession.defaultSession() 
     session.delegate = self 
     session.activateSession() 
    } 
    sendMessageToIphone() 
} 
func sendMessageToIphone() { 
    if WCSession.defaultSession().reachable { 

     print("WCSession is reachabe") 

     let messageDict = ["Request": "iPhone Can You Give Me The Array"] 
     WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in 
      print(replyDict) 
      }, errorHandler: { (error) -> Void in 
       print(error) 
     }) 
    } 
} 

func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) { 
    //recieving message from iphone 
    print("recieved message from iphone \(message)") 

    objects.append(message["Array"]!) 

    print("Objects array = \(objects)")   
} 

コンソール出力

WCSession is reachabe Array nil

iPhoneアプリの委任

import UIKit 
import CoreData 
import WatchConnectivity 

@UIApplicationMain 

class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate { 

var window: UIWindow? 
var session : WCSession! 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    //Check if session is supported and Activate 
    if (WCSession.isSupported()) { 
     session = WCSession.defaultSession() 
     session.delegate = self 
     session.activateSession() 
    } 
} 

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

    print("did recieve message from Watch") 

    let applicationData = ["Array":["One", "Two", "Three"]] 

    replyHandler(applicationData) 

} 

iPhoneから何も実行されていません。私が手動でアプリを開いても。

+0

あなたのコードは私にはうまく見えます。あなたは同じダミーデータ( '' Array ":[" One "、" Two "、" Three "]')を使っています。実際のデータを返送するために他のコードブロックが実行されている場合は、まったく別の問題がある可能性があるためです。例えば。カスタムオブジェクトの配列は、このようにウォッチアプリに戻すことはできません。 – Gandalf

+0

@ガンダルフ私は、まずWCSession関数内で送られて印刷された文字列の配列を使って練習しようとしていました。私の目的は、テーブルに表示するウォッチにNSManagedObjectの配列を送信することでした。だから、基本的に電話機の返信ハンドラは、オブジェクトの辞書と配列をウォッチに送ります。本当に奇妙なことに私は電話機に応答することができません:/ Xcodeを新しいリリースで更新し、最高のために願う – RileyDev

答えて

3

あなたは時計が要求されたデータが含まれて送信されたメッセージに返信をしたい場合は、次のようにコードを変更する必要があります。

ウォッチ

func sendMessageToIphone() { 
    if WCSession.defaultSession().reachable { 

     print("WCSession is reachabe") 

     let messageDict = ["Request": "iPhone Can You Give Me The Array"] 
     WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in 
      print("Array \(replyDict["array"])") 
      }, errorHandler: { (error) -> Void in 
       print(error) 
     }) 
    } 
} 

電話

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

    print("did recieve message from Watch") 

    let applicationData = ["Array":["One", "Two", "Three"]] 

    //If identifier from recievedMessage is for Objects 

    replyHandler(applicationData) 

} 

そして別に、電話機からのsendMessageが時計によって受信されない理由は、使用しているsendMessage呼び出しに間違ったデリゲートメソッドを実装したためです。

あなたは、このデリゲートメソッドは、受信側で呼び出すことができますゼロ replyHandlerでのsendMessageを呼び出す場合:あなたはnil以外 replyHandlerでのsendMessageを呼び出す場合 func session(session: WCSession, didReceiveMessage message: [String : AnyObject])

このデリゲートメソッドは次のようになります受信側で呼び出されます。 func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)

+0

ありがとう、返信ありがとう、私はあなたの提案にコードを変更しました、 iPhoneから時計のメッセージを受信します。あなたは私が 'funcセッション(セッション:WCSession、didReceiveMessageメッセージ:[文字列:AnyObject]){print(" iPhoneからのメッセージを受け取りました\(メッセージ) ")}'また、現在の更新では、私はコンソールで次の出力を取得します。 'WCSession is reachable Array nilプログラムは終了コードで終了しました:0' – RileyDev

+0

奇妙な;おそらく 'print(" Array "(replyDict [" array "])") ')' print( "replyDict \(replyDict)") ' – ccjensen

0

メッセージを送信する前にアクティブ化する必要があります。また、保留中のメッセージが失われる可能性があるため、セッションをアクティブにする前にデリゲートを設定する必要があります。

iphone側:

import UIKit 
import WatchConnectivity 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate { 

var window: UIWindow? 
var session : WCSession! 

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

    print("did recieve message from Watch") 
    let applicationData = ["Array":["One", "Two", "Three"]] 

    //If identifier from recievedMessage is for Objects 
    session.sendMessage(applicationData, replyHandler: { reply in 
     print("Got reply: \(reply)") 
     }, errorHandler: { error in 
      print("error: \(error)") 
    }) 
} 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    session = WCSession.defaultSession() 
    session.delegate = self 
    session.activateSession() 
    return true 
} 
} 

iWatch拡張子InterfaceController あなたはインタフェースコントローラwillactivate方法でセッションをアクティブにする必要があります。

import WatchKit 
import Foundation 
import WatchConnectivity 

class InterfaceController: WKInterfaceController, WCSessionDelegate { 

var session : WCSession! 
var objects: [AnyObject]! 

override func awakeWithContext(context: AnyObject?) { 
    super.awakeWithContext(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() 
    session = WCSession.defaultSession() 
    session.delegate = self 
    session.activateSession() 
    objects = [] 
    sendMessageToIphone() 
} 

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

func sendMessageToIphone() { 
    if WCSession.defaultSession().reachable{ 

     print("WCSession is reachabe") 

     let messageDict = ["Request": "iPhone Can You Give Me The Array"] 
     WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in 
      print(replyDict) 
      }, errorHandler: { (error) -> Void in 
       print(error) 
     }) 
    } 
} 

func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) { 
    //recieving message from iphone 
    print("recieved message from iphone \(message)") 

    objects.append(message["Array"]!) 

    print("Objects array = \(objects)") 
} 
} 

注意。最初にiphoneアプリケーションを実行します。その後、拡張機能を実行し、フォアグラウンドでiPhoneアプリを保つ。

+0

を変えてみてください。セッションを開き、デリゲートを設定します。 – RileyDev

+0

@ JKSDEVウォッチ側:オブジェクト配列を初期化していません。 willActivateメソッドで空の配列オブジェクト= []を作成してください。 –

関連する問題