Guest User

Untitled

a guest
Nov 18th, 2017
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.00 KB | None | 0 0
  1. import UIKit
  2. import MobileCoreServices
  3.  
  4. enum CatError: Error {
  5. case invalidTypeIdentifier
  6. }
  7.  
  8. protocol Shareable where Self: NSObject {
  9. static var shareIdentifier: String { get }
  10. }
  11.  
  12. extension Shareable {
  13. static var shareIdentifier: String {
  14. let bundle = Bundle.main.bundleIdentifier!
  15. let typeString = String(describing: type(of: self))
  16. return "\(bundle).\(typeString)"
  17. }
  18. }
  19.  
  20. final class Cat: NSObject, Shareable {
  21.  
  22. let name: String
  23. let image: UIImage
  24.  
  25. init(name: String, image: UIImage) {
  26. self.name = name
  27. self.image = image
  28. super.init()
  29. }
  30.  
  31. var data: Data? {
  32. return """
  33. {
  34. "name": "\(name)",
  35. "image": "\(UIImageJPEGRepresentation(image, 1.0)!.base64EncodedString())"
  36. }
  37. """.data(using: .utf8)
  38. }
  39.  
  40. init(data: Data) {
  41. let json = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
  42. name = json["name"] as! String
  43. let imageData = Data(base64Encoded: json["image"] as! String)!
  44. image = UIImage(data: imageData)!
  45. super.init()
  46. }
  47. }
  48.  
  49. // Providing Cat to destinationApp
  50. extension Cat: NSItemProviderWriting {
  51.  
  52. // Tell which identifiers are cat will be conforming to
  53. static var writableTypeIdentifiersForItemProvider: [String] {
  54. // General identifiers are not recommended, specific identifiers are welcome
  55. return [Cat.shareIdentifier, kUTTypeImage as String, kUTTypePlainText as String]
  56. }
  57.  
  58. // Prepare data for providing to destinationAPP
  59. func loadData(withTypeIdentifier typeIdentifier: String, forItemProviderCompletionHandler completionHandler: @escaping (Data?, Error?) -> Void) -> Progress? {
  60.  
  61. switch typeIdentifier {
  62. case Cat.shareIdentifier:
  63. completionHandler(data, nil)
  64. case kUTTypeImage as NSString as String:
  65. completionHandler(UIImageJPEGRepresentation(image, 1.0), nil)
  66. case kUTTypePlainText as NSString as String:
  67. completionHandler(name.data(using: .utf8), nil)
  68. default:
  69. completionHandler(nil, CatError.invalidTypeIdentifier)
  70. }
  71.  
  72. // I'm not returning any progress
  73. return nil
  74. }
  75. }
  76.  
  77. // Receiving cat from sourceApp
  78. extension Cat: NSItemProviderReading {
  79.  
  80. // Tell which indentifiers cal will be expecting
  81. static var readableTypeIdentifiersForItemProvider: [String] {
  82. return [Cat.shareIdentifier, kUTTypeImage as String, kUTTypePlainText as String]
  83. }
  84.  
  85. static func object(withItemProviderData data: Data, typeIdentifier: String) throws -> Cat {
  86.  
  87. switch typeIdentifier {
  88. case Cat.shareIdentifier:
  89. return Cat(data: data)
  90. case kUTTypeImage as NSString as String:
  91. return Cat(name: "no name", image: UIImage(data: data)!)
  92. case kUTTypePlainText as NSString as String:
  93. return Cat(name: String(data: data, encoding: .utf8)!, image: UIImage())
  94. default:
  95. throw CatError.invalidTypeIdentifier
  96. }
  97. }
  98. }
Add Comment
Please, Sign In to add comment