ios - 观看连接 : didReceiveMessage not called

标签 ios objective-c swift watchkit watchconnectivity

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

    }];
}

My Watch 应用程序采用 Swift 语言。这是我检索消息的方式:

Note: "wc session is supported" works and gets logged to the console

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 也可以正常工作。

如果你想在使用 watch 应用时请求数据,你可以将 watch 应用切换为调用 sendMessage 方法。 iPhone 应用程序将使用其 replyHandler 将您需要的数据发送回 watch 。如果这样做,您需要将 iPhone 应用程序中的 WCSession 初始化代码移动到 application:didFinishLaunchingWithOptions 方法中(因为如果在后台启动,您的 View Controller 将不会被初始化)。

// ***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"});
    }
}

关于ios - 观看连接 : didReceiveMessage not called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35133038/

相关文章:

swift - 使用自定义路径在 Swift 包管理器中解析 list 文件失败

ios - 直接从 NSTimeInterval 到 NSDateComponents 到 NSString 转换?

ios - 为什么beginBackgroundTaskWithExpirationHandler提前结束?

objective-c - 如何在 XCode 中初始化一个包含组中所有文件的数组?

ios - 获取带有经纬度的城市和国家名称(iOS)

ios - Swift:如何使用快速操作从 AppDelegate 访问某个 TabBar 选项卡?

ios - RestKit 0.20 — 核心数据 : error: Failed to call designated initializer on NSManagedObject class (again)

ios - UIButton setAutoresizingMask 无法以编程方式工作

ios - nsurlconnection 在以下情况下不返回错误

iphone - 在 UITableViewController 中弹出多个级别