【问题标题】:How to send and receive custom data with AirDrop如何使用 AirDrop 发送和接收自定义数据
【发布时间】:2016-09-03 17:02:53
【问题描述】:

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

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

谁能帮忙?

【问题讨论】:

    标签: ios swift uti airdrop


    【解决方案1】:

    AirDrop sample code 涵盖了如何定义您自己的文件类型/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 启动句柄

      目标-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
      

      和你实际的NSData blob

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

      然后在以下方法中,您需要返回您在应用的Info.plist 中注册的自定义类型的 UTI。

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

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

    【讨论】:

    • 请不要在不发表评论的情况下投反对票。 +1
    • 知道如何通过 AirDrop 将 p8 文件传输到 iOS 设备吗?
    【解决方案2】:

    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' 在您的应用中执行您需要的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 2017-08-19
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多