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 like
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