我目前有一个问题。 我想要的行为:如果我打开我的WatchKit应用程序,我打电话给" openParentApplication"。我收到了我想要的数据。 但是,如果我在真实设备上进行测试,那么自从我在iPhone中打开父应用程序后它就无法运行。 但是,当我在模拟器中进行测试时,它可以在不打开父应用程序的情况下工作。
我的Xcode版本是6.3.2和iOS 8.3。
可能是什么问题?
InterfaceController.m
- (void)awakeWithContext:(id)context {
[super awakeWithContext:context];
NSDictionary *userInfo = @{@"request":@"refreshData"};
[WKInterfaceController openParentApplication:userInfo reply:^(NSDictionary *replyInfo, NSError *error)
{
entries = replyInfo;
NSLog(@"Reply: %@",replyInfo);
[self reloadTable];
[self.city setText:[entries valueForKey:@"city"][0] ];
}];
}
AppDelegate.m
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply
{
NSString *refresh = [userInfo valueForKey:@"request"];
if([refresh isEqualToString:@"refreshData"])
{
NSString *city = [[NSUserDefaults standardUserDefaults] stringForKey:@"City"];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:[NSString stringWithFormat:@"http://blackdriver.adappter.de/api/retrieve.php?city=%@",[city stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject)
{
reply(responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"Error: %@", error);
}];
}
}
编辑 - 正确答案: 请参阅评论中的mohammed alwaili链接
答案 0 :(得分:3)
openParentApplication:reply
请求必须立即返回,因此您必须请求额外的时间来完成asynchronous
请求(交替运行synchronous
请求,但这是可怕的做法)。
来自 Apple WatchKit Developer Tips and Best Practices :
如果Apple Watch上的应用需要执行更长时间的运行背景 任务,如网络电话,你应该依靠你的iPhone应用程序来完成工作。使用WKInterfaceController中的openParentApplication:reply:方法在后台唤醒您的iPhone应用程序并返回您的WatchKit扩展程序所需的数据。处理WatchKit请求的UIApplicationDelegate方法必须立即返回。 如果需要异步调用,例如,要执行网络连接,请使用后台任务确保您的应用在其有机会发送回复之前不会被暂停。