Расширение iOS Share не работает с изображениями из библиотеки фотографий

Я создал расширение общего доступа в 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>

Будем признательны за любые предложения или помощь в том, как заставить это принимать изображения всех форматов!


person Shalin Shah    schedule 29.12.2020    source источник


Ответы (1)


Попробуйте с kUTTypeFileURL. Если ваше приложение вообще не отображается на листе общего доступа, проблема может быть связана с NSExtensionActivationRule, вы можете исключить эту проблему, используя значение NSExtensionActivationRule как TRUEPREDICATE. Глядя на значение NSExtensionActivationRule, я не вижу в этом никаких проблем.

Попробуйте с kUTTypeFileURL, если это не сработает, отладьте и найдите значение attachment.registeredTypeIdentifiers при совместном использовании изображения. и вы можете попробовать одно из этих значений.

Проверьте значение attachment.registeredTypeIdentifiers перед загрузкой attachment.loadItem(forTypeIdentifier: contentType, options: nil)

person Manish Punia    schedule 30.12.2020
comment
kUTTypeFileURL тоже не сработало. Как мне проверить значение registeredTypeIdentifiers для всего, что я импортирую? Операторы печати в моем коде не регистрируются, поэтому хотелось бы получить некоторые указатели. Спасибо! - person Shalin Shah; 30.12.2020
comment
attachment имеют свойство registeredTypeIdentifiers. Вы можете проверить значение этого свойства непосредственно перед загрузкой. - person Manish Punia; 30.12.2020