通过上述方法请求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);
                                           }
                                       }];
}

在应用程序委托中:
- (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方法返回NSMutableDictionarys的NSMutableArray,其中填充了NSMutableStrings(标题,链接,imageURL等)。

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

最佳答案

您正在击中Law of Leaky Abstractions

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

抽象泄漏:

回复(feedsDictionary)

返回的字典只能包含

  • NSData
  • NSString
  • NSDate
  • NSArray
  • NSDictionary

    如果您的返回字典包含超出此范围的任何内容,例如自定义
    类实例,然后您得到那个糟糕的错误,说reply()是
    从来没有打电话,即使你做到了!



  • 解决方案1 ​​:序列化您的对象并将其从“应用程序到手表”发送,然后在手表上反序列化(也称为“编组/解组”)。
  • 这需要使用NSCoding,如上一篇文章中所述:序列化为NSData *流,发送Reply(dataStream),然后在WatchKit扩展中反序列化。
  • NSCoding很痛苦。您需要在发送之前显式使用NSKeyedArchiver进行序列化,并使用NSKeyedUnarchiver对tutorial here进行反序列化。
  • 需要大量的原始代码来支持类Object本身内的编码/解码(以满足NSCoder)

  • 解决方案2 :简单地传递一个字符串作为Key,并在Watch Extension中实例化您的对象(而不是传递胖对象实例本身)
  • 通过单击{class} .m,按Command + Option + 1,然后单击“Target Membership”(目标成员资格)下的“... WatchKit Extension”复选框,允许WatchKit扩展针对您的类文件进行编译(无论如何,您都需要这样做,即使有解决方案1)
  • 例如您的WatchKit扩展程序将分配/初始化模型的新实例,而不是尝试通过
  • 传递该实例
  • 例如您将URL作为字符串传递,并且WatchKit扩展将进行NSURLConnection调用。
  • 关于ios - Watchkit-应用程序:handleWatchKitExtensionRequest错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30060914/

    10-13 05:49