通过watchConnectivity发送NSObject

时间:2015-12-31 12:01:40

标签: ios objective-c watchkit watch-os-2 watchconnectivity

我正在开发我们应用程序的WatchOS 2版本并坚持我只能发送一个带有“updateApplicationContext:(NSDictionary *)”函数的字符串。

我希望我可以使用一些变量将NSObject作为对象发送到此NSDictionary中。几天后,我仍然没有找到解决这个问题的方法。无论如何都要在函数上发送NSObject吗?

如果无法发送NSObject,是否可以发送类似结构的内容?

我的代码如下:

-(void)updateWatchData
{
    //Objective-C
    if ([WCSession isSupported]) {
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];

        if(session.isPaired) {
            //Objective-C
            DLog("Sending watch data");
            NSMutableArray *kalenderData = [[NSMutableArray alloc] init];

            for (int i = 0; i < self.dataContainerViews.count; i++) {
                DataContainerView *container = self.dataContainerViews[i];

                if(container.listType == ListGPKalender){
                    for(int j = 0; j < container.tableArray.count; j++){
                        GrandPrix *gp = container.tableArray[j];
                        WatchGrandPrix *watchGp = [[WatchGrandPrix alloc] init];

                        watchGp.gpnaam = gp.gpnaam;

                        [kalenderData addObject:watchGp];
                    }
                }
            }

            NSArray *keys = [NSArray arrayWithObjects:@"kalenderData", nil];
            NSArray *objects = [NSArray arrayWithObjects:kalenderData, nil];
            NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

            NSError *anyError;
            if([[WCSession defaultSession] updateApplicationContext:dictionary error:&anyError]){
                DLog("Data Send!");
            }else{
                DLog("Failed to send data with error: %@", anyError);
            }
        }
    }
}

NSObject只是:

@interface WatchGrandPrix : NSObject

@property(nonatomic,strong) NSString *gpnaam;

@end

我得到的错误是

  

无法发送错误数据:错误域= WCErrorDomain代码= 7010   “Payload包含不受支持的类型。”   UserInfo = {NSLocalizedDescription = Payload包含不受支持的类型。,   NSLocalizedRecoverySuggestion =仅传递有效类型。}

谢谢!

2 个答案:

答案 0 :(得分:2)

我一直在通过将自定义对象序列化为Json字符串来发送自定义对象。我创建了一个github project,为此目的快速序列化任何对象。它包括一个操场,显示如何进行序列化/反序列化。

答案 1 :(得分:1)

您可以将对象转换为属性列表表示(基本上代替模型对象的数组,您有一个字典数组,其中每个字典是值的映射,其中键是变量的名称和值是一个plist兼容类型,代表值)。

另一个带宽效率较低的选项是使您的对象符合NSSecureCoding并使用类似NSKeyedArchiver的东西将其转换为NSData并发送NSData数组。