How to launch a parent iOS App from its App Extension How to launch a parent iOS App from its App Extension ios ios

How to launch a parent iOS App from its App Extension


In the WWDC session Creating Extensions for iOS and OS X, Part 1 around the 22 minute mark the say to use the openURL:completionHandler: method from the UIViewController's extensionContext to open a custom URL scheme

[self.extensionContext openURL:[NSURL URLWithString:@"your-app-custom-url-scheme://your-internal-url"]             completionHandler:nil];


Working solution in Swift 3.1 (tested in iOS10):

You need to create your own URL Scheme for your host app, then add this function to your ViewController and call it with openURL("myScheme://myIdentifier")

//  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.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}


it is working in my current working app using action extension

1- in parent app plist add custom URL likeenter image description here

2- add both functions in your extension view controller

func openURL(url: NSURL) -> Bool {    do {        let application = try self.sharedApplication()        return application.performSelector(inBackground: "openURL:", with: url) != nil    }    catch {        return false    }}func sharedApplication() throws -> UIApplication {    var responder: UIResponder? = self    while responder != nil {        if let application = responder as? UIApplication {            return application        }        responder = responder?.next    }    throw NSError(domain: "UIInputViewController+sharedApplication.swift", code: 1, userInfo: nil)}

3- call this function in your button action or somewhere you want to do

self.openURL(url: NSURL(string:"openPdf://HomeVC")!)

here homevc is the class name of your View controller which should be presented

4- in your app delegate implement the method like

  func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {    let urlPath : String = url.absoluteString    print(urlPath)    if urlPath.contains("HomeVC"){        //here go to firstViewController view controller        self.window = UIWindow(frame: UIScreen.main.bounds)        let storyboard = UIStoryboard(name: "Main", bundle: nil)        let initialViewController = storyboard.instantiateViewController(withIdentifier: "homeVC")        self.window?.rootViewController = initialViewController        self.window?.makeKeyAndVisible()    }}

I hope will work fine, can also share data between extension app and parent app