7

我已经为此苦苦挣扎了很久,因为我找不到任何详细的例子。

在我的应用程序中,我有一组自定义数据,我想通过 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 示例,但它们专注于共享图像等常见类型,我发现没有人详细共享自定义数据类型。

任何人都可以帮忙吗?

4

2 回答 2

11

AirDrop 示例代码介绍了如何定义您自己的文件类型/UTI,并使用它通过 AirDrop 发送您的自定义数据。

主要需要的零件如下。

  1. 您应用程序中的以下键和值Info.plist

    <...>
    <key>CFBundleDocumentTypes</key>
    <array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>AirDrop Profile File Type</string>
        <key>LSHandlerRank</key>
        <string>Default</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>com.apple.customProfileUTI.customprofile</string>
        </array>
    </dict>
    </array>
    <...>
    
  2. 支持接收您的自定义类型
    在应用程序委托中,fileURL通过实现处理启动

    Objective-C

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    

    迅速

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        // Check if your app can open the URL
        // If it can, do something with the url and options, then return true
        // otherwise return false
    }
    

    确保删除/移动文件以清理inbox收到的文档所在的文件夹(在您的应用程序的沙箱内)。

  3. 支持发送自定义类型
    您传递给的项目UIActivityViewController应该是fileURL您注册为自定义文件类型的扩展名的文件,或者是符合UIActivityItemSource协议并返回NSData类型的对象

    - (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
    

    和你的实际NSDatablob

    - (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
    

    然后在以下方法中,您将希望返回您在应用程序的Info.plist.

    - (NSString *)activityViewController:(UIActivityViewController *)activityViewController dataTypeIdentifierForActivityType:(NSString *)activityType
    

示例代码有一个很好的例子来说明如何完成所有这些,以及如何通过包含适当大小和裁剪的预览照片来改善整个用户体验。

于 2016-09-04T06:16:54.617 回答
1

iOS13(及以上)

如果 AppDelegate 中的 open url 委托方法没有被调用

func application(_ app: UIApplication, open url: URL, options [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { ...}

您应该在 SceneDelegate 中使用 openURLContexts:

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    guard let url = URLContexts.first?.url else {return}    
}

然后你可以在你的应用程序中使用“url”来做你需要的事情。

于 2021-10-29T05:34:51.213 回答