通过 watchConnectivity 发送一个 NSObject
Send an NSObject by 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
我得到的错误是
Failed to send data with error: Error Domain=WCErrorDomain Code=7010
"Payload contains unsupported type."
UserInfo={NSLocalizedDescription=Payload contains unsupported type.,
NSLocalizedRecoverySuggestion=Only pass valid types.}
谢谢!
您可以将对象转换为 属性 列表表示(基本上,您有一个字典数组,而不是模型对象的数组,其中每个字典都是值的映射,其中键是名称变量和值是表示值的 plist 兼容类型)。
另一种带宽效率较低的选择是使您的对象符合 NSSecureCoding 标准,并使用 NSKeyedArchiver 之类的工具将其转换为 NSData 并发送 NSData 数组。
我一直在通过将自定义对象序列化为 Json 字符串来发送它们。为此,我创建了一个 github project 可以快速序列化任何对象。它包括一个演示如何执行 serialization/deserialization.
的游乐场
我正在开发我们的应用程序的 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
我得到的错误是
Failed to send data with error: Error Domain=WCErrorDomain Code=7010 "Payload contains unsupported type." UserInfo={NSLocalizedDescription=Payload contains unsupported type., NSLocalizedRecoverySuggestion=Only pass valid types.}
谢谢!
您可以将对象转换为 属性 列表表示(基本上,您有一个字典数组,而不是模型对象的数组,其中每个字典都是值的映射,其中键是名称变量和值是表示值的 plist 兼容类型)。
另一种带宽效率较低的选择是使您的对象符合 NSSecureCoding 标准,并使用 NSKeyedArchiver 之类的工具将其转换为 NSData 并发送 NSData 数组。
我一直在通过将自定义对象序列化为 Json 字符串来发送它们。为此,我创建了一个 github project 可以快速序列化任何对象。它包括一个演示如何执行 serialization/deserialization.
的游乐场