swift – iOS Action Extension: Get text value from the action extension and show it on the Container appwithout the use of App Group


`Currently, I am able to navigate to the Container app(Viewcontroller) from action extension using url scheme. But could not able to pass the text value from the action extension.

In the ActionViewController, on the actionAppNavigation button action i am trying to pass the text value to the Container app(ViewController) through Scenedelegate.`

import UIKit
import MobileCoreServices
import UniformTypeIdentifiers

class ActionViewController: UIViewController {

    @IBOutlet weak var myTextView: UITextView!
        var convertedString: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let textItem = self.extensionContext!.inputItems[0]
            as! NSExtensionItem

        let textItemProvider = textItem.attachments![0]

        if textItemProvider.hasItemConformingToTypeIdentifier(UTType.text.identifier) {
            textItemProvider.loadItem(
             forTypeIdentifier: UTType.text.identifier,
                      options: nil,
             completionHandler: { (result, error) in
                 self.convertedString = result as? String

                             if self.convertedString != nil {
                                 self.convertedString = self.convertedString!.uppercased()

                                 DispatchQueue.main.async {
                                     self.myTextView.text = self.convertedString!
                                     
                                 }
                             }
                        })
        }
      
    }

@IBAction func actionAppNavigation(_ sender: UIButton) {
if let text = self.myTextView.text,
           let escapedText = text.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) {

            let urlString = "newshare://?textSent=\(escapedText)"
            if let url = URL(string: urlString) {
                let nsurl = NSURL(string: urlString)
                let selector = sel_registerName("openURL:")
                    var responder = self as UIResponder?
                    while let r = responder, !r.responds(to: selector) {
                        responder = r.next
                    }
                    _ = responder?.perform(selector, with: nsurl)
            } else {
                print("Error: Unable to create URL from string")
            }

        } else {
            print("Error: Unable to get valid text from myTextView")
        }
       
    }
 @IBAction func done() {
        let returnProvider =
                NSItemProvider(item: convertedString as NSSecureCoding?,
                              typeIdentifier: UTType.text.identifier)

            let returnItem = NSExtensionItem()

            returnItem.attachments = [returnProvider]
                self.extensionContext!.completeRequest(
                    returningItems: [returnItem], completionHandler: nil)
    }

In Scene delegate,

import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?


    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let _ = (scene as? UIWindowScene) else { return }
                let storyboard = UIStoryboard(name: "Main", bundle: nil)
                guard let rootVC = storyboard.instantiateViewController(identifier: "ViewController") as? ViewController else {
                    print("ViewController not found")
                    return
                }
                let rootNC = UINavigationController(rootViewController: rootVC)
                self.window?.rootViewController = rootNC
                self.window?.makeKeyAndVisible()
    }

    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
           if let url = URLContexts.first?.url {
               print(url)
               let urlStr = url.absoluteString //1
               // Parse the custom URL as per your requirement.
               let component = urlStr.components(separatedBy: "=") // 2
               if component.count > 1, let appId = component.last { // 3
                   print(appId)
                   let topViewController = self.window?.rootViewController as? UINavigationController
                   let currentVC = topViewController?.topViewController as? ViewController
                   currentVC?.receivedLabel.text = "Application Id : " + appId
               }
           }
       }
}

In Container app(ViewController),

import UIKit
import UniformTypeIdentifiers
class ViewController: UIViewController {

    @IBOutlet var receivedLabel: UILabel!

 override func viewDidLoad() {
        super.viewDidLoad()
}
}


Latest articles

spot_imgspot_img

Related articles

Leave a reply

Please enter your comment!
Please enter your name here

spot_imgspot_img