分享扩展名registeredTypeIdentifiers

时间:2017-12-08 10:24:33

标签: ios swift

我的共享扩展应该以相同的方式处理图像,视频,文件,即,只需将其写入共享容器应用程序组,但目前,我只是做这样的事情:

   if let item = extensionContext?.inputItems.first as? NSExtensionItem {  
  if let itemProvider = item.attachments?.first as? NSItemProvider {  
    if itemProvider.hasItemConformingToTypeIdentifier(contentTypeImage) {  
      itemProvider.loadItem(forTypeIdentifier: contentTypeImage, options: nil, completionHandler: { (url, error) -> Void in  
        if let shareURL = url as? URL {  
          _ = self.openURL(URL(string: "cpc:/  
          if let image = NSData(contentsOf: shareURL) {  
            _ = self.writeSharedData(data: image, to: shareURL.lastPathComponent)  
          }  
          self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)  
        }  
      })  
    } else if itemProvider.hasItemConformingToTypeIdentifier(contentTypePDF) {  
      itemProvider.loadItem(forTypeIdentifier: contentTypePDF, options: nil, completionHandler: { (url, error) -> Void in  
        if let shareURL = url as? URL {  
          _ = self.openURL(URL(string: "cpc:/  
          if let pdf = NSData(contentsOf: shareURL) {  
            _ = self.writeSharedData(data: pdf, to: shareURL.lastPathComponent)  
          }  
          self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)  
        }  
      })  
    } else if itemProvider.hasItemConformingToTypeIdentifier(contentTypeMovie) {  
      itemProvider.loadItem(forTypeIdentifier: contentTypeMovie, options: nil, completionHandler: { (url, error) -> Void in  
        if let shareURL = url as? URL {  
          _ = self.openURL(URL(string: "cpc:/  
          if let pdf = NSData(contentsOf: shareURL) {  
            _ = self.writeSharedData(data: pdf, to: shareURL.lastPathComponent)  
          }  
          self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)  
        }  
      })  
    } else if itemProvider.hasItemConformingToTypeIdentifier(contentTypeURL) {  
      itemProvider.loadItem(forTypeIdentifier: contentTypeURL, options: nil, completionHandler: { (url, error) -> Void in  
        if let shareURL = url as? URL {  
          _ = self.openURL(URL(string: "cpc:/  
          self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)  
        }  
      })  
    } else {  
      extensionContext?.completeRequest(returningItems: [], completionHandler:nil)  
    }  
  }  
}  

它分别处理类型,因此非常冗长,所以我不知道是否有任何方法可以检查和处理图像,pdf,照片的TypeIdentifier,只需1个if语句:

if itemProvider.hasItemConformingToTypeIdentifier(contentTypeURL) {  

}

谢谢, 宣

1 个答案:

答案 0 :(得分:0)

您应该有3个条件,因为没有属性或方法来获取项目提供者类型。但您可以通过将公共代码移动到单独的方法来简化代码。

func loadItem(itemProvider: NSItemProvider, contentType: NSString) {
  itemProvider.loadItem(forTypeIdentifier: contentType, options: nil, completionHandler: { (url, error) -> Void in  
    if let shareURL = url as? URL {  
      if (type == contentTypeURL) {
        //URL operation goes here
      } else {
        if let data = NSData(contentsOf: shareURL) {  
          self.writeSharedData(data: data, to: shareURL.lastPathComponent)  
        }  
      }
    } 
    self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)   
  })
}

调用方法如下

if itemProvider.hasItemConformingToTypeIdentifier(contentTypeImage) {  
  loadItem(itemProvider: itemProvider, contentType: contentTypeImage)

} else if itemProvider.hasItemConformingToTypeIdentifier(contentTypePDF) {  
  loadItem(itemProvider: itemProvider, contentType: contentTypePDF)

} else if itemProvider.hasItemConformingToTypeIdentifier(contentTypeMovie) {  
  loadItem(itemProvider: itemProvider, contentType: contentTypeMovie)

} else if itemProvider.hasItemConformingToTypeIdentifier(contentTypeURL) {  
  loadItem(itemProvider: itemProvider, contentType: contentTypeURL)

} else {
  self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)
}