观看连接:未调用 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) {
}];
}
我的手表应用程序在 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()
}
永远不会调用以下函数,出现 none 的 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 并在我的 class 名称后包含了 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 我有一个用例,其中 phone 使用消息故意启动一种与手表的“链接”过程,我 运行 遇到了这个问题。除了重新启动物理 phone 之外,没有什么可以修复它。所以你可以试试 :-)
我正在使用 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) {
}];
}
我的手表应用程序在 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()
}
永远不会调用以下函数,出现 none 的 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 并在我的 class 名称后包含了 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 我有一个用例,其中 phone 使用消息故意启动一种与手表的“链接”过程,我 运行 遇到了这个问题。除了重新启动物理 phone 之外,没有什么可以修复它。所以你可以试试 :-)