`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()
}
}