6

そのため、Watch Connectivity を使用して、iPhone から Watch に配列を要求しています。

アイデアはsendMessage時計からであり、iPhone はdidReceiveMessageメソッド内の配列で応答します。

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

エラー Domain=WCErrorDomain Code=7012 「メッセージの返信に時間がかかりすぎました。」UserInfo={NSLocalizedDescription=メッセージの返信に時間がかかりすぎました., NSLocalizedFailureReason=返信のタイムアウトが発生しました.}

私がどこで間違っているのか誰か知っていますか?

アップルウォッチ

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 は到達可能配列 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 からは何も実行されていません。アプリを手動で開いても。

4

2 に答える 2

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 呼び出しに対して間違ったデリゲート メソッドを実装したためです。

nilの replyHandler で sendMessage を呼び出すと、このデリゲート メソッドが受信側で呼び出されます。 func session(session: WCSession, didReceiveMessage message: [String : AnyObject])

nil 以外のreplyHandlerで sendMessage を呼び出すと、このデリゲート メソッドが受信側で呼び出されます。 func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)

于 2016-02-03T06:41:14.773 に答える
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 アプリをフォアグラウンドに保ちます。

于 2016-02-05T11:18:22.720 に答える