Я создал расширение общего доступа в Swift 4 и пытался заставить его принимать изображения всех типов. По какой-то причине кажется, что он принимает только скриншоты, когда я пытаюсь поделиться из библиотеки фотографий. Никакие другие изображения не перенаправляются в мое приложение.
Для типа контента я сейчас использую kUTTypeData
, но также пробовал kUTTypeImage
, kUTTypeJPEG
, kUTTypeJPEG2000
, kUTTypePNG
и kUTTypeURL
.
Приложение появляется правильно в списке общего доступа, поэтому проблема с NSExtensionActivationRule
не возникает.
Вот мой код для расширения общего доступа:
import UIKit
import Social
import MobileCoreServices
class ShareViewController: SLComposeServiceViewController {
let sharedKey = "ImageSharePhotoKey"
var imagesData: [Data] = []
override func viewDidLoad() {
super.viewDidLoad()
self.manageImages()
}
func redirectToHostApp(key: String) {
let url = URL(string: "AppName://dataUrl=\(key)")
var responder = self as UIResponder?
let selectorOpenURL = sel_registerName("openURL:")
while (responder != nil) {
if (responder?.responds(to: selectorOpenURL))! {
let _ = responder?.perform(selectorOpenURL, with: url)
}
responder = responder!.next
}
self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
}
func manageImages() {
let content = extensionContext!.inputItems[0] as! NSExtensionItem
let contentType = kUTTypeData as String
for (index, attachment) in (content.attachments!).enumerated() {
if attachment.hasItemConformingToTypeIdentifier(contentType) {
attachment.loadItem(forTypeIdentifier: contentType, options: nil) { [weak self] data, error in
if error == nil, let this = self {
var contentData: Data? = nil
//data could be raw Data
if let data = data as? Data {
contentData = data
//data could be an URL
} else if let url = data as? URL {
contentData = try? Data(contentsOf: url)
}
//data could be an UIImage object (e.g. ios11 screenshot editor)
else if let imageData = data as? UIImage {
contentData = imageData.pngData()
}
// proceed here with contentData
let rawImage = UIImage(data: contentData ?? Data())
// CONVERTED INTO FORMATTED FILE : OVER COME MEMORY WARNING
// YOU USE SCALE PROPERTY ALSO TO REDUCE IMAGE SIZE
let image = UIImage.resizeImage(image: rawImage!, width: rawImage?.size.width ?? 0, height: rawImage?.size.height ?? 0)
let imgData = image.pngData()
this.imagesData.append(imgData!)
if index == (content.attachments?.count)! - 1 {
DispatchQueue.main.async {
let userDefaults = UserDefaults(suiteName: "group.com.myName.AppName")
userDefaults?.set(this.imagesData, forKey: this.sharedKey)
userDefaults?.synchronize()
self?.redirectToHostApp(key: this.sharedKey)
}
}
}
}
}
}
}
override func isContentValid() -> Bool {
return true
}
override func didSelectPost() {
}
override func configurationItems() -> [Any]! {
return []
}
}
extension UIImage {
class func resizeImage(image: UIImage, width: CGFloat, height: CGFloat) -> UIImage {
UIGraphicsBeginImageContext(CGSize(width: width, height: height))
image.draw(in: CGRect(x: 0, y: 0, width: width, height: height))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
}
Вот мой текущий файл PLIST для расширения:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>ShareExt</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>5.0</string>
<key>CFBundleVersion</key>
<string>5</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<string>SUBQUERY (
extensionItems,
$extensionItem,
SUBQUERY (
$extensionItem.attachments,
$attachment,
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.plain-text" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.data" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.content" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.png" ||
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.compuserve.gif"
).@count == $extensionItem.attachments.@count
).@count == 1
</string>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
</dict>
</plist>
Будем признательны за любые предложения или помощь в том, как заставить это принимать изображения всех форматов!