0

我一直在阅读有关 watchkit 示例应用程序链接的信息- 我已经让它与我自己的应用程序一起使用。控制器的所有开/关检查花费了一些时间。

好吧 - 我的问题是,我需要手表应用程序需要 HTTP 并发出请求 - 我认为“最佳实践”方法是在 IOS 应用程序中实现所有逻辑,然后将其提供给 WatchOS 应用程序。(如果我错了,请纠正我)。

但老实说,我对我的 /platforms/ios/"watchappname" extension/app/bootstrap.js 如何与我的 IOS 应用程序进行通信有点困惑。

你的做法是什么?

注意:如果您有类似的问题,请知道我也在他们的GITHUB repo上发布了这个

4

3 回答 3

0

使用 Watch Connectivity Framework,使用 WCSession。你可以看看这个教程这个。当我尝试以编程方式连接手表和 iPhone 时,它​​帮助了我很多

于 2015-07-22T19:15:45.763 回答
0

我认为您正在寻找的方法是这个:

-(void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply

在您的 iPhone 应用程序的 AppDelegate.m 文件中,您应该添加此方法。在您应该使用的方法内

__block UIBackgroundTaskIdentifier watchKitHandler;
watchKitHandler = [[UIApplication sharedApplication] beginBackgroundTaskWithName:@"backgroundTask"
                                                               expirationHandler:^{
                                                                   watchKitHandler = UIBackgroundTaskInvalid;
                                                               }];

dispatch_after( dispatch_time( DISPATCH_TIME_NOW, (int64_t)NSEC_PER_SEC * 10), dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^{
    [[UIApplication sharedApplication] endBackgroundTask:watchKitHandler];
} );

所以总而言之,你的 iPhone 应用程序上的方法应该是这样的:

//handle watch app request

-(void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply
{



//Make it a background task

__block UIBackgroundTaskIdentifier watchKitHandler;
watchKitHandler = [[UIApplication sharedApplication] beginBackgroundTaskWithName:@"backgroundTask"
                                                               expirationHandler:^{
                                                                   watchKitHandler = UIBackgroundTaskInvalid;
                                                               }];

NSString* command = [userInfo objectForKey:@"command"];

if ([command isEqualToString:@"request"]) {

    //do some action here

// use the reply dictionary if necessary

NSDictionary *responseObject = @{@"info": @"some Info"};

reply(responseObject);    

} else if ([command isEqualToString:@"request2"]) {

    // do some other action here

}

//finish background task

dispatch_after( dispatch_time( DISPATCH_TIME_NOW, (int64_t)NSEC_PER_SEC * 10), dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^{
    [[UIApplication sharedApplication] endBackgroundTask:watchKitHandler];
} );
}

在手表方面,您应该使用以下代码:

NSDictionary *request = @{ @"command": @"request", @"info": @"some additional things here for example"};
[WKInterfaceController openParentApplication:request reply:^(NSDictionary *replyInfo, NSError *error ) {

//do something with the reply dictionary here

    NSLog(@"%@", replyInfo);

}];

希望,这对你有帮助。

编辑:

此代码仅适用于 watchOS 1。如果您已经在为 watchOS 2 进行开发,请查看Watch Connectivity Framework

于 2015-07-22T18:50:07.120 回答
0

对于 watchOS 2.0,您需要查看使用Watch Connectivity 框架而不是openParentApplication 根据文档:

该框架提供了在后台或两个应用程序都处于活动状态时传输数据的选项,并替换了 WKInterfaceController 类的现有 openParentApplication:reply: 方法。

于 2015-07-22T19:05:26.217 回答