Watchkit -application:handleWatchKitExtensionRequest错误

时间:2015-05-05 18:48:16

标签: ios objective-c xcode plist watchkit

通过上述方法请求XML项目字典时出现以下错误:

> NSLocalizedDescription=The UIApplicationDelegate in the iPhone App never called reply() in -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]

传递由NSStrings的NSMutableArray组成的NSDictionary没有问题。

从界面控制器:

- (void) requestFeedsFromPhone
{
    [WKInterfaceController openParentApplication:@{@"request":@"feeds"}
                                       reply:^(NSDictionary *replyInfo, NSError *error) {

                                           // the request was successful
                                           if(error == nil) {

                                               // get the array of items
                                               NSMutableDictionary *tempDictionary = replyInfo[@"feeds"];


                                               NSLog(@"tempDictionary: %@", tempDictionary[@"feedsArray"]);
                                               self.feeds = tempDictionary[@"feedsArray"];
                                               [self setupTable];
                                           }
                                           else{
                                               NSLog(@"ERROR: %@", error);
                                           }
                                       }];
}

在app delegate中:

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

    MasterViewController *mainController = (MasterViewController*)  self.window.rootViewController;

    //this is the troublesome line - calling this method results in the error
    NSDictionary *feedsDictionary = [mainController returnFeedsDictionary];

    reply(@{@"feeds": feedsDictionary});
}

在MasterViewController中:

-(NSDictionary *) returnFeedsDictionary
{

    NSURL *url = [NSURL URLWithString:@"http://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss"];
    SeparateParser *separateParser = [[SeparateParser alloc] initWithURL:url];
    [separateParser parse];
    NSArray *tempArray = [separateParser returnFeeds];
    return @{@"feedsArray": tempArray};

}

returnFeeds方法返回NSMutableDictionar的NSMutableArray,其中填充了NSMutableStrings(title,link,imageURL等)。

我假设我的问题是我的一些数据不符合属性列表,但我认为数组,字符串和字典是可以接受的。

3 个答案:

答案 0 :(得分:4)

你正在点击Law of Leaky Abstractions

您的iPhone-App和WatchKit-Extension作为两个独立的进程和两个单独的沙箱运行。 OpenParentApplication / handleWatchKitExtensionRequest / reply机制只是Apple提供的一种便利机制,用于包装进程内通信。

抽象泄漏:

应答(feedsDictionary)

返回的字典只能包含

  • NSData的
  • 的NSString
  • 的NSDate
  • 的NSArray
  • 的NSDictionary

    如果您的返回字典包含除此之外的任何内容,就像自定义一样 类实例,然后你得到回复()的糟糕错误 从来没有打电话,即使你做了!

解决方案1 ​​:序列化您的对象并从app-to-Watch发送,然后反序列化观察(又称编组/解组)。

  • 这需要使用NSCoding,如上面的帖子所述:Serialize to NSData * stream,send reply(dataStream),然后在WatchKit Extension中反序列化。
  • NSCoding是一种痛苦。您需要在发送前显式使用NSKeyedArchiver进行序列化,并使用NSKeyedUnarchiver反序列化tutorial here
  • 需要大量的代码来支持Object类本身内的编码/解码(以满足NSCoder)

解决方案2 :只需传递一个字符串作为Key,并在Watch Extension中实例化您的对象(而不是传递胖对象实例本身)

  • 允许WatchKit Extension针对您的类文件进行编译,方法是单击{class} .m,按下命令+选项+ 1,然后单击" ... WatchKit Extension"目标成员资格下的复选框(无论如何,即使使用解决方案1,也需要执行此操作)

  • e.g。您的WatchKit扩展将分配/初始化模型的新实例,而不是尝试将其传递到

  • e.g。您可以将URL作为字符串传递,并且WatchKit扩展名将进行NSURLConnection调用。

答案 1 :(得分:1)

echo '<li>' . '<a target="_blank" href="' . $row['picture_link'] . '">' . $row['picture_text'] . '</a>' . '</li>' . '<br/>'; 中,确保按照documentation中的说明启动后台任务。这可以确保iPhone上的主应用程序在发送回复之前不会被暂停。

iPhone主应用程序的app委托中的代码:

handleWatchKitExtensionRequest

答案 2 :(得分:0)

您可以尝试在回复词典中使用NSKeyedArchiver。我有这个问题,因为数据的序列化问题,这有帮助。