了解 handleWatchKitExtensionRequest
Understanding handleWatchKitExtensionRequest
我正在 iPhone 应用程序上测试一些代码的执行。我遵循 Apple 建议的文档(不使用后台任务,仅使用 控制台日志 )。但是我在控制台上没有得到任何东西(我想看到字符串 "howdy")。
这是因为我是运行模拟器上的WatchKit Extension应用吗?还是我遗漏了什么?
Apple 说:
If you are using openParentApplication:reply:, make sure you create a
background task immediately upon entering
application:handleWatchKitExtensionRequest:reply:. This will make sure
that the iPhone app gets time in the background instead of being
suspended again. Additionally, wrap the call to endBackgroundTask: in
a dispatch_after of 2 seconds to ensure that the iPhone app has time
to send the reply before being suspended again.
我在 WatchKit 扩展上的实现(链接到按钮的操作方法):
- (IBAction)sendMessageToApp{
NSString *requestString = [NSString stringWithFormat:@"executeMethodA"]; // This string is arbitrary, just must match here and at the iPhone side of the implementation.
NSDictionary *applicationData = [[NSDictionary alloc] initWithObjects:@[requestString] forKeys:@[@"theRequestString"]];
[WKInterfaceController openParentApplication:applicationData reply:^(NSDictionary *replyInfo, NSError *error) {
NSLog(@"\nReply info: %@\nError: %@",replyInfo, error);
}];
NSLog(@"sending message..");
}
我在 AppDelegate.m 文件上的实现:
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply {
NSString * request = [userInfo objectForKey:@"requestString"];
NSLog(@"howdy");
// This is just an example of what you could return. The one requirement is
// you do have to execute the reply block, even if it is just to 'reply(nil)'.
// All of the objects in the dictionary [must be serializable to a property list file][3].
// If necessary, you can covert other objects to NSData blobs first.
NSArray * objects = [[NSArray alloc] initWithObjects:[NSDate date],[NSDate date],[NSDate date], [NSDate date], nil];
NSArray * keys = [[NSArray alloc] initWithObjects:@"objectAName", @"objectdName", @"objectBName", @"objectCName", nil];
NSDictionary * replyContent = [[NSDictionary alloc] initWithObjects:objects forKeys:keys];
reply(replyContent);
}
我在控制台中得到的信息:
2015-04-16 14:43:44.034 FanLink WatchKit Extension[3324:142904] <InterfaceController: 0x608000081fe0> initWithContext
2015-04-16 14:44:04.848 FanLink WatchKit Extension[3324:142904] sennding message..
2015-04-16 14:44:04.854 FanLink WatchKit Extension[3324:142904]
Reply info: {
objectAName = "2015-04-16 13:44:04 +0000";
objectBName = "2015-04-16 13:44:04 +0000";
objectCName = "2015-04-16 13:44:04 +0000";
objectdName = "2015-04-16 13:44:04 +0000";
}
Error: (null)
- 您的控制台日志是正确的,因为您当前仅调试 WatchKit 扩展目标因此您将收到以 WatchKit 扩展编写的日志。 iOS App 中编写的 NSLog 不会在控制台打印。
这是因为您只是在调试 WatchKit 扩展目标。如果您还想在控制台中查看主应用程序日志,则需要通过 Xcode 调试器附加主应用程序的进程。
转到调试-->附加进程-->(然后 select 通过标识符并键入你的应用程序名称)
为了更好地浏览,我为您找到了这个专门用于 WatchKit/WatchKit 扩展调试的好资源:
https://mkswap.net/m/blog/How+to+debug+an+iOS+app+while+the+WatchKit+app+is+currently+running+in+the+simulator
不知道是不是题外话但是上面的代码中有一个简单的错误
在手表套件中有 initWithObjects:@[requestString] forKeys:@[@"theRequestString"]
并在 appdelegate NSString * request = [userInfo objectForKey:@"requestString"];
"theRequestString" 不对应 "requestString"
我花了一些时间才弄明白为什么我的函数没有启动
感谢它提供的代码
我正在 iPhone 应用程序上测试一些代码的执行。我遵循 Apple 建议的文档(不使用后台任务,仅使用 控制台日志 )。但是我在控制台上没有得到任何东西(我想看到字符串 "howdy")。
这是因为我是运行模拟器上的WatchKit Extension应用吗?还是我遗漏了什么?
Apple 说:
If you are using openParentApplication:reply:, make sure you create a background task immediately upon entering application:handleWatchKitExtensionRequest:reply:. This will make sure that the iPhone app gets time in the background instead of being suspended again. Additionally, wrap the call to endBackgroundTask: in a dispatch_after of 2 seconds to ensure that the iPhone app has time to send the reply before being suspended again.
我在 WatchKit 扩展上的实现(链接到按钮的操作方法):
- (IBAction)sendMessageToApp{
NSString *requestString = [NSString stringWithFormat:@"executeMethodA"]; // This string is arbitrary, just must match here and at the iPhone side of the implementation.
NSDictionary *applicationData = [[NSDictionary alloc] initWithObjects:@[requestString] forKeys:@[@"theRequestString"]];
[WKInterfaceController openParentApplication:applicationData reply:^(NSDictionary *replyInfo, NSError *error) {
NSLog(@"\nReply info: %@\nError: %@",replyInfo, error);
}];
NSLog(@"sending message..");
}
我在 AppDelegate.m 文件上的实现:
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply {
NSString * request = [userInfo objectForKey:@"requestString"];
NSLog(@"howdy");
// This is just an example of what you could return. The one requirement is
// you do have to execute the reply block, even if it is just to 'reply(nil)'.
// All of the objects in the dictionary [must be serializable to a property list file][3].
// If necessary, you can covert other objects to NSData blobs first.
NSArray * objects = [[NSArray alloc] initWithObjects:[NSDate date],[NSDate date],[NSDate date], [NSDate date], nil];
NSArray * keys = [[NSArray alloc] initWithObjects:@"objectAName", @"objectdName", @"objectBName", @"objectCName", nil];
NSDictionary * replyContent = [[NSDictionary alloc] initWithObjects:objects forKeys:keys];
reply(replyContent);
}
我在控制台中得到的信息:
2015-04-16 14:43:44.034 FanLink WatchKit Extension[3324:142904] <InterfaceController: 0x608000081fe0> initWithContext
2015-04-16 14:44:04.848 FanLink WatchKit Extension[3324:142904] sennding message..
2015-04-16 14:44:04.854 FanLink WatchKit Extension[3324:142904]
Reply info: {
objectAName = "2015-04-16 13:44:04 +0000";
objectBName = "2015-04-16 13:44:04 +0000";
objectCName = "2015-04-16 13:44:04 +0000";
objectdName = "2015-04-16 13:44:04 +0000";
}
Error: (null)
- 您的控制台日志是正确的,因为您当前仅调试 WatchKit 扩展目标因此您将收到以 WatchKit 扩展编写的日志。 iOS App 中编写的 NSLog 不会在控制台打印。
这是因为您只是在调试 WatchKit 扩展目标。如果您还想在控制台中查看主应用程序日志,则需要通过 Xcode 调试器附加主应用程序的进程。 转到调试-->附加进程-->(然后 select 通过标识符并键入你的应用程序名称)
为了更好地浏览,我为您找到了这个专门用于 WatchKit/WatchKit 扩展调试的好资源: https://mkswap.net/m/blog/How+to+debug+an+iOS+app+while+the+WatchKit+app+is+currently+running+in+the+simulator
不知道是不是题外话但是上面的代码中有一个简单的错误 在手表套件中有 initWithObjects:@[requestString] forKeys:@[@"theRequestString"]
并在 appdelegate NSString * request = [userInfo objectForKey:@"requestString"];
"theRequestString" 不对应 "requestString"
我花了一些时间才弄明白为什么我的函数没有启动
感谢它提供的代码