簡體   English   中英

觀看連接:沒有調用 didReceiveMessage

[英]Watch Connectivity: didReceiveMessage not called

我正在使用 WatchConnectivity 框架從我的應用程序接收一個字符串。 以下是我如何從應用程序發送 Obj-C 中的字符串:

-(void) viewDidLoad {

    //WATCHKIT
    WCSession* session = [WCSession defaultSession];
    session.delegate = self;
    [session activateSession];

    [self sendInfoToWatch];
}

-(void) sendInfoToWatch {

    WCSession* session = [WCSession defaultSession];
    session.delegate = self;
    [session activateSession];

    [session sendMessage:@{@"a":@"hello"} replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {

    } errorHandler:^(NSError * _Nonnull error) {

    }];
}

我的 Watch 應用程序使用 Swift。 這是我檢索消息的方式:

注意: “支持 wc 會話”有效並記錄到控制台

override func willActivate() {
    if(WCSession.isSupported()){
        NSLog("wc session is supported")
        self.session = WCSession.defaultSession()
        self.session.delegate = self
        self.session.activateSession()
    }

    super.willActivate()
}

永遠不會調用以下函數,也不會顯示任何 NSLog,因此 QRCodeTitleLabel 不會更新其文本。

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

    QRCodeTitleLabel.setText(message["a"]! as? String)

    NSLog("This was called")
    NSLog((message["a"]! as? String)!)

}

有誰知道為什么不調用此方法?

此外,我已經導入了 WatchConnectivity 並在我的類名之后包含了 WCSessionDelegate。

編輯:

我用replyHandler添加了這個函數,但是這個方法仍然沒有被調用:

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
    QRCodeTitleLabel.setText(message["a"]! as? String)

    NSLog("This was called")
    NSLog((message["a"]! as? String)!)
}

WCSession 中有 2 個 session:didReceiveMessage 方法。 您應該在 Apple Watch 端使用 replyHandler 來實現。

另外,Apple Watch 屏幕是否亮着? 來自 iPhone 的 SendMessage 僅在 Apple Watch 應用程序處於活動狀態且屏幕處於開啟狀態時有效。 另一方面,即使未啟動 iPhone 應用程序,從 Apple Watch 到 iPhone 的 SendMessage 也能正常工作。

如果您想在使用手表應用程序時請求數據,您可以將手表應用程序切換為調用 sendMessage 方法。 iPhone 應用程序將使用其 replyHandler 將您需要的數據發送回手表。 如果這樣做,您需要將 iPhone 應用程序中的 WCSession 初始化代碼移動到 application:didFinishLaunchingWithOptions 方法中(因為如果在后台啟動,您的視圖控制器將不會被初始化)。

// ***On the watch***
// ExtensionDelegate
func applicationDidFinishLaunching() { 
    self.session = WCSession.defaultSession();       
    self.session.delegate = self
    self.session.activateSession()
}

// Where you want to get the data from the iPhone
self.session.sendMessage(["retrieveData":[:]], replyHandler: { (result) -> Void in
    // TODO: Handle your data from the iPhone
}, errorHandler: { (error) -> Void in
    // TODO: Handle error - iPhone many not be reachable
})

// ***On the iPhone***
// AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.session = [WCSession defaultSession];
    self.session.delegate = self;
    [self.session activateSession];
}

- (void)session:(WCSession *)session didReceiveMessage:(nonnull NSDictionary<NSString *,id> *)message replyHandler:(nonnull void (^)(NSDictionary<NSString *,id> * _Nonnull))replyHandler
{
    if ([message objectForKey:@"retrieveData"])
    {
        replyHandler(@{@"a":@"hello"});
    }
}

FWIW 我有一個用例,手機故意使用消息功能啟動一種與手表的“鏈接”過程,我遇到了這個問題。 除了重新啟動物理電話外,什么也無法解決。 所以你可以試試:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM