WatchKit openParentApplication:回复

时间:2015-06-07 08:53:19

标签: ios iphone xcode6 watchkit

我目前有一个问题。 我想要的行为:如果我打开我的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链接

1 个答案:

答案 0 :(得分:3)

openParentApplication:reply请求必须立即返回,因此您必须请求额外的时间来完成asynchronous请求(交替运行synchronous请求,但这是可怕的做法)。

来自 Apple WatchKit Developer Tips and Best Practices

  

如果Apple Watch上的应用需要执行更长时间的运行背景   任务,如网络电话,你应该依靠你的iPhone应用程序来完成工作。使用WKInterfaceController中的openParentApplication:reply:方法在后台唤醒您的iPhone应用程序并返回您的WatchKit扩展程序所需的数据。处理WatchKit请求的UIApplicationDelegate方法必须立即返回。 如果需要异步调用,例如,要执行网络连接,请使用后台任务确保您的应用在其有机会发送回复之前不会被暂停。