yasiru
yasiru

Reputation: 15

Pass data from Ios Extension to React Native side

I am new to this native implementation and I implemented native share extension for ios in react native.

import UIKit import Social import CoreServices

class ShareViewController: UIViewController {

private let typeText = String(kUTTypeText)
private let typeURL = String(kUTTypeURL)
private let typeImage = String(kUTTypeImage)
private let typePDF = String(kUTTypePDF)
private let appURL = "ShareExtension101://"
private let groupName = "group.ShareExtension102"
private let urlDefaultName = "incomingURL"

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // 1
    guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem,
        let itemProvider = extensionItem.attachments?.first else {
            self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil)
            return
    }

    if itemProvider.hasItemConformingToTypeIdentifier(typeText) {
        handleIncomingText(itemProvider: itemProvider)
    } else if itemProvider.hasItemConformingToTypeIdentifier(typeURL) {
        handleIncomingURL(itemProvider: itemProvider)
    } else if itemProvider.hasItemConformingToTypeIdentifier(typeImage) {
        handleIncomingImage(itemProvider: itemProvider)
    } else if itemProvider.hasItemConformingToTypeIdentifier(typePDF) {
        handleIncomingPDF(itemProvider: itemProvider)
    } else {
        print("Error: Unsupported content type")
        self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil)
    }
}

private func handleIncomingText(itemProvider: NSItemProvider) {
    itemProvider.loadItem(forTypeIdentifier: typeText, options: nil) { (item, error) in
        if let error = error { print("Text-Error: \(error.localizedDescription)") }


        if let text = item as? String {
            do {// 2.1
                let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
                let matches = detector.matches(
                    in: text,
                    options: [],
                    range: NSRange(location: 0, length: text.utf16.count)
                )
                // 2.2
                if let firstMatch = matches.first, let range = Range(firstMatch.range, in: text) {
                    self.saveURLString(String(text[range]))
                }
            } catch let error {
                print("Do-Try Error: \(error.localizedDescription)")
            }
        }

        self.openMainApp()
    }
}

private func handleIncomingURL(itemProvider: NSItemProvider) {
    itemProvider.loadItem(forTypeIdentifier: typeURL, options: nil) { (item, error) in
        if let error = error { print("URL-Error: \(error.localizedDescription)") }

        if let url = item as? NSURL, let urlString = url.absoluteString {
            self.saveURLString(urlString)
        }

        self.openMainApp()
    }
}

private func handleIncomingImage(itemProvider: NSItemProvider) {
    itemProvider.loadItem(forTypeIdentifier: typeImage, options: nil) { (item, error) in
        if let error = error { print("Image-Error: \(error.localizedDescription)") }

        if let image = item as? UIImage {
            // Handle the incoming image
            // You can save it, display it, or perform any other action
            print("Image data")
            if let imageData = image.jpegData(compressionQuality: 1.0)?.base64EncodedString() {
            self.sendImageToReactNative(imageData)
        }
        }

        self.openMainApp()
    }
}

private func sendImageToReactNative(_ imageData: String) {
    UserDefaults(suiteName: groupName)?.set(imageData, forKey: "incomingImageData")
}   

private func handleIncomingPDF(itemProvider: NSItemProvider) {
    itemProvider.loadItem(forTypeIdentifier: typePDF, options: nil) { (item, error) in
        if let error = error { print("PDF-Error: \(error.localizedDescription)") }

        if let pdfData = item as? Data {
            // Handle the incoming PDF
            // You can save it, display it, or perform any other action
        }

        self.openMainApp()
    }
}

private func saveURLString(_ urlString: String) {
    UserDefaults(suiteName: self.groupName)?.set(urlString, forKey: self.urlDefaultName)
}

private func openMainApp() {
    self.extensionContext?.completeRequest(returningItems: nil, completionHandler: { _ in
        guard let url = URL(string: self.appURL) else { return }
        _ = self.openURL(url)
    })
}

 

// Courtesy: https://stackoverflow.com/a/44499222/13363449 👇🏾
// Function must be named exactly like this so a selector can be found by the compiler!
// Anyway - it's another selector in another instance that would be "performed" instead.
@objc private func openURL(_ url: URL) -> Bool {
    var responder: UIResponder? = self
    while responder != nil {
        if let application = responder as? UIApplication {
            return application.perform(#selector(openURL(_:)), with: url) != nil
        }
        responder = responder?.next
    }
    return false
}

}

When I open the gallery and try to share an image It opened my app, But I want to display the image in my react native app, Any Idea on this send image data to react native side. Rn version 0.71 and xcode version 15.1

Upvotes: 0

Views: 42

Answers (0)

Related Questions