【问题标题】:Send NSArray Via AirDrop通过 AirDrop 发送 NSArray
【发布时间】:2014-03-31 18:57:47
【问题描述】:

我有一个NSMutableArray self.certificates

这个数组由保存的字符串和核心数据组成。我想通过 AirDrop 发送这个。我已经检查了serialization,并且我正在尝试将其与以下内容一起发送

- (void)send{

NSData *jsonData2 = [NSJSONSerialization dataWithJSONObject:self.certificates options:NSJSONWritingPrettyPrinted error:nil];

NSString *jsonString = [[NSString alloc] initWithData:jsonData2 encoding:NSUTF8StringEncoding];
NSLog(@"Electrical Certificates List:\n%@", jsonString);


UIActivityViewController *activityCtr = [[UIActivityViewController alloc] initWithActivityItems:@[jsonString]
                                                                          applicationActivities:nil];

NSMutableArray *excludedActivities = [self iOSActivities].mutableCopy;
[excludedActivities addObject:UIActivityTypeAddToReadingList];
[excludedActivities addObject:UIActivityTypePostToFlickr];
[excludedActivities addObject:UIActivityTypePostToTencentWeibo];
[excludedActivities addObject:UIActivityTypePostToVimeo];
[activityCtr setExcludedActivityTypes:excludedActivities];

[self presentViewController:activityCtr
                   animated:YES
                 completion:nil];
}

这给了我以下错误
'NSInvalidArgumentException', reason: 'Invalid type in JSON write (Certificate)'

我已将数据转换为字符串,所以不确定这里缺少什么

我研究过NSInvalidArgumentException, reason: 'Invalid type in JSON write (__NSDate)'How to send NSArray to web service

【问题讨论】:

    标签: ios objective-c cocoa-touch serialization airdrop


    【解决方案1】:

    在数组转换为数据之前,JSONSerialization 抛出异常。

    要共享自定义数据类型,您需要在模型对象上实现 NSCodingUIActivityItemSource

    @interface CertificateGroup : NSObject <NSCoding, UIActivityItemSource>
    
    @property(copy, nonatomic) NSArray *certificates;
    
    @end
    
    @implementation CertificateGroup
    
    - (void)encodeWithCoder:(NSCoder *)aCoder {
        // Save all your custom properties
        [aCoder encodeObject:self.certificates forKey:@"certificates"]l
    }
    
    - (id)initWithCoder:(NSCoder *)aDecoder {
        self = [super init];
        if (self) {
            // Read back properties
            self.certificates = [aDecoder decodeObjectForKey:@"certificates"];
        }
        return self;
    }
    
    - (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
    {
        //Let the activity view controller know NSData is being sent by passing this placeholder.
        return [NSData data];
    }
    
    - (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
    {
        //Serialize this object for sending. NSCoding protocol must be implemented for the serialization to occur.
        return [NSKeyedArchiver archivedDataWithRootObject:self];
    }
    
    - (NSString *)activityViewController:(UIActivityViewController *)activityViewController dataTypeIdentifierForActivityType:(NSString *)activityType {
        return @"com.mycompany.myapp.certificates";
    }
    
    @end
    

    然后,当您创建活动视图控制器时:

    CertificatesGroup *group = [CertificatesGroup new];
    group.certificates = self.certificates;
    UIActivityViewController *activityCtr = [[UIActivityViewController alloc] initWithActivityItems:@[group]
                                                                              applicationActivities:nil];
    ...
    

    您的应用代理应实现 -application:openURL:sourceApplication:annotation: 并解码传入的证书。

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
         NSData *groupData = [NSData dataWithContentsOfURL:url];
         CertificatesGroup *group = [NSKeyedUnarchiver unarchiveObjectWithData:groupData];
         NSLog(@"%@", group.certificates);
         return YES;
    }
    

    有关详细信息,请参阅 Apple 的 AirDropSample 项目,尤其是 APLProfile.h/.mAPLProfileViewController.h/.mAppDelegate.m

    【讨论】:

    • 感谢您的回复,这给了我archivedString 的零字符串
    • 啊,它可能不是一个有效的字符串。您也许可以将NSData 对象直接传递给活动视图控制器。但是,我假设您希望能够在接收设备上的应用中打开这些数据,然后对其进行解码?
    • 是的,NSMutable 数组填充了一个表格视图,我想将它发送到另一个设备并接收解码。只是一种手动保持设备同步的方法,尝试了 iCloud,但似乎根本无法正常运行!
    • 您的证书是自定义对象,还是由框架提供?
    • 它们是自定义对象
    猜你喜欢
    • 2013-10-17
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多