通过 UIActivityViewController 发送自定义数据

pet*_*ete 2 ios uiactivityviewcontroller

我尝试使用 UIActivityViewController 通过 AirDrop 将数据(NSData)从一台 iOS 设备上的应用程序发送到另一台设备。我在我的应用程序 plist 中创建了一个新的 CSM(自定义数据类型)。public.filename-extension = ppm。那么如何将 ppm 扩展添加到我尝试发送的 NSDate 对象中?我是否正确地认为,当您呈现 UIActivityViewController 时,如果我发送的对象没有我的应用程序公共扩展名(ppm),我的应用程序图标将不会显示在 UIActivityViewController 窗口中??....是的,我是真的很困惑!这是我用来呈现 UIActivityViewController 的代码

    @IBAction func shareButton(sender: AnyObject) {

    // myData is the object I want to send to be used in my app on another device

    let vc = UIActivityViewController(activityItems: [myData],applicationActivities: [])
    presentViewController(vc, animated: true, completion: nil)

    }
Run Code Online (Sandbox Code Playgroud)

基本上,我想做的就是发送要在我的应用程序中使用的自定义数据

ccj*_*sen 6

您应该查看AirDrop 示例代码,其中涵盖了定义您自己的文件类型并与其他设备上的应用程序共享该文件类型的情况。如果您想共享原始数据,关键部分是您必须创建 的实例UIActivityItemSource并将其传递给UIActivityViewController. 像这样的东西:

class DataActivityItemSource: NSObject, UIActivityItemSource {
    let myData: NSData
    let typeIdentifier: String
    let subject: String
    let previewImage: UIImage

    init(myData: NSData, typeIdentifier: String, subject: String, previewImage: UIImage) {
        self.myData = myData
        self.typeIdentifier = typeIdentifier
        self.subject = subject
        self.previewImage = previewImage
    }

    // called to determine data type. only the class of the return type is consulted. it should match what -itemForActivityType: returns later
    @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
        return myData
    }

    // called to fetch data after an activity is selected. you can return nil.
    @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
        return myData
    }

    // if activity supports a Subject field. iOS 7.0
    @objc func activityViewController(activityViewController: UIActivityViewController, subjectForActivityType activityType: String?) -> String {
        return subject
    }

    // UTI for item if it is an NSData. iOS 7.0. will be called with nil activity and then selected activity
    @objc func activityViewController(activityViewController: UIActivityViewController, dataTypeIdentifierForActivityType activityType: String?) -> String {
        return typeIdentifier
    }

    // if activity supports preview image. iOS 7.0
    @objc func activityViewController(activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: String?, suggestedSize size: CGSize) -> UIImage? {
        // look at suggestedSize and resize image (see AirDrop sample code for how to do this)
        return previewImage
    }
}


@IBAction func shareButton(sender: AnyObject) {

    // myData is the object I want to send to be used in my app on another device
    let itemSource = DataActivityItemSource(myData, "com.foo.ppm.typeIdentifier", "My Amazing Journey", aPreviewImage)
    let vc = UIActivityViewController(activityItems: [itemSource],applicationActivities: [])
    presentViewController(vc, animated: true, completion: nil)

}
Run Code Online (Sandbox Code Playgroud)