使用watchOS2从AppleWatch向iPhone应用程序发送消息

时间:2015-12-14 14:04:43

标签: ios objective-c watchkit

我尝试使用WCSession方法从iwatchExtension(在ButtonClick上)向iPhone应用发送消息,如

[[WCSession defaultSession] sendMessage:applicationData
                                   replyHandler:^(NSDictionary *reply)

但委托方法  - (void)session:(WCSession *)session didReceiveMessage:未被调用。

当我在将数据从iPhone传递到iWatch时尝试相同时,它可以正常工作。所有委托方法都在" Extension Delegate"中正确调用。类。

1 个答案:

答案 0 :(得分:2)

如果您查看WCSession委托方法的定义,您会发现其接收性质存在细微差别。检查粗体引用。

  

/ **在接收者的代表身上调用。将在启动时调用   如果传入的消息导致接收器启动。 * /
   - (void)session:(WCSession *)session didReceiveMessage:(NSDictionary *)message;

     

/ **当发送者发送一个时,在接收者的代表上调用   期待回复的消息。如果是,将在启动时调用   传入消息导致接收器启动。 * /
   - (void)session:(WCSession *)session didReceiveMessage:(NSDictionary *)message   replyHandler:(无效(^)(的NSDictionary   * replyMessage))replyHandler;

在为replyHandler:提供非空参数时,您应该在其他代理中接收消息,即-(void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message

您正在使用[WCSession defaultSession] sendMessage:...]进行通信,缺少委托分配以及您尚未激活会话。

在您的Extention类中,为WCSession创建一个ivar并编写此代码

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];
    // Configure interface objects here.    
    if([WCSession isSupported])
    {
        session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    }    
}

然后发送消息[session sendMessage:applicationData replyHandler:^(NSDictionary *reply)

AppDelegate.m文件中,只需创建WCSession的实例并激活它,然后使用正确的delegate方法捕获邮件。

if([WCSession isSupported]) {
     appSession = [WCSession defaultSession];
     appSession.delegate = self;
     [appSession activateSession];
}

我相信这可以解决你的问题。