如何使用AirDrop发送和接收自定义数据

由于找不到任何详细的例子,我多年来一直在努力解决这个问题。

在我的应用程序中,我有一系列自定义数据,我想通过AirDrop发送给具有相同应用程序的其他用户。

第一步是发送数据:

@IBAction func share_Button_Click(sender: UIBarButtonItem) { let dataToShare: NSData = getMyCustomNSData() let controller = UIActivityViewController(activityItems: [dataToShare], applicationActivities: nil) controller.excludedActivityTypes = [UIActivityTypePostToFacebook, UIActivityTypePostToTwitter, UIActivityTypePostToWeibo, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypePostToFlickr, UIActivityTypePostToTencentWeibo, UIActivityTypeMail, UIActivityTypeAddToReadingList, UIActivityTypeOpenInIBooks, UIActivityTypeMessage] self.presentViewController(controller, animated: true, completion: nil) } 

这会将我的数据转换为NSData对象,用户获取AirDrop共享选项,并将数据转移到另一部手机。 到现在为止还挺好…

但是其他用户的应用程序如何知道如何接收它?

我已经阅读过关于自定义UTI类型并且已经声明了一个,但说实话我不知道在声明中放什么。 那么你如何向iOS表明你发送的数据符合这个特定的UTI?

这里和那里有AirDrop示例在线,但他们专注于共享像图像这样的常见类型,我发现没有人通过共享详细的自定义数据类型工作。

有人可以帮忙吗?

AirDrop示例代码涵盖了如何定义您自己的文件类型/ UTI并使用它来使用AirDrop发送您的自定义数据。

主要要求是:

  1. App的info.plist

<...> CFBundleDocumentTypes CFBundleTypeName AirDrop Profile File Type LSHandlerRank Default LSItemContentTypes com.apple.customProfileUTI.customprofile <...>

  1. 为了支持接收你的自定义类型:在app delegate中,通过实现- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 。 确保删除/移动文件以清理收件箱中的内容。

  2. 要支持发送一个自定义类型:您传递给UIActivityViewController的项目应该是fileURL到具有您注册为自定义文件类型的扩展名的文件,或者是一个符合UIActivityItemSource协议并返回NSData类型的对象的文件in - (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController ,以及您的实际NSData blob - (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType 。 然后在- (NSString *)activityViewController:(UIActivityViewController *)activityViewController dataTypeIdentifierForActivityType:(NSString *)activityType您想要返回您在info.plist中注册的自定义类型的UTI。

示例代码提供了如何完成所有这些操作的一个很好的示例,以及如何通过包含正确大小和裁剪的预览照片来使整个UX更好。