首页 文章

Watch Connectivity:didReceiveMessage未调用

提问于
浏览
3

我正在使用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 .

Edit:

我用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)!)
}

1 回答

  • 8

    WCSession中有2个session:didReceiveMessage方法 . 您应该在Apple Watch一侧使用replyHandler实现一个 .

    此外,Apple Watch屏幕是否开启?来自iPhone的SendMessage仅在Apple Watch应用程序处于活动状态且屏幕打开时才起作用 . 另一方面,即使iPhone应用程序未启动,从Apple Watch到iPhone的SendMessage也能正常工作 .

    如果要在使用Watch应用程序时请求数据,可以切换Watch App以调用sendMessage方法 . iPhone应用程序将使用其replyHandler将您需要的数据发送回 Watch . 如果这样做,您需要将iPhone应用程序中的WCSession初始化代码移动到应用程序中: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"});
        }
    }
    

相关问题