18

アプリ拡張機能のView Controllerから親アプリを起動する方法を知っている人はいますか?

アプリ拡張機能からメインアプリを起動したいだけです。

4

8 に答える 8

10

WWDC セッションの iOS および OS X 用の拡張機能の作成、パート 1の 22 分頃にopenURL:completionHandler:、UIViewController のextensionContextのメソッドを使用してカスタム URL スキームを開くと述べています。

[self.extensionContext openURL:[NSURL URLWithString:@"your-app-custom-url-scheme://your-internal-url"]
             completionHandler:nil];
于 2014-09-11T10:52:21.843 に答える
5

アクション拡張機能を使用して、現在動作中のアプリで動作しています

1- 親アプリの plist に、次のようなカスタム URL を追加します ここに画像の説明を入力

2-拡張ビューコントローラーに両方の機能を追加します

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-ボタンアクションまたは実行したい場所でこの関数を呼び出します

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

ここで homevc は、表示する必要があるビューコントローラーのクラス名です

4-アプリデリゲートで次のようなメソッドを実装します

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

うまく動作することを願っています。拡張アプリと親アプリの間でデータを共有することもできます

于 2020-02-20T12:19:44.007 に答える
2

ここで同様の質問をしました: Communicating with/opening Containing app from Share extension。基本的に、いくつかのことを行うことができます。

  1. UIWebView の loadRequest webView を使用して、含まれているアプリの URL で NSURL 要求を読み込みます。例えば、

    NSURL *url = [NSURL URLWithString:@"myurl"];
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    [self.webView loadRequest:request];
    
  2. UIDocumentInteractionController とカスタム ファイル拡張子タイプを使用して、含まれているアプリ (および含まれているアプリのみ) へのリンクを提供します。

  3. 「偽の」NSURL セッションを開始して、次の機能を取得します。iOS では、バックグラウンド タスクの完了時に拡張機能が実行されていない場合、システムはバックグラウンドで含まれているアプリを起動し、application:handleEventsForBackgroundURLSession:completionHandler: アプリ デリゲート メソッドを呼び出します。 .

最初のものはおそらくあなたの最善の策です。

于 2014-09-09T17:02:44.493 に答える
1

これは、少なくともキーボード拡張機能の有効なソリューション (iOS 9.2 でテスト済み)です。このカテゴリは、隠しsharedApplicationオブジェクトにアクセスするための特別なメソッドを追加し、それを呼び出しますopenURL:。(もちろんopenURL:、アプリ スキームでメソッドを使用する必要があります。)

extension UIInputViewController {

    func openURL(url: NSURL) -> Bool {
        do {
            let application = try self.sharedApplication()
            return application.performSelector("openURL:", withObject: 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?.nextResponder()
        }

        throw NSError(domain: "UIInputViewController+sharedApplication.swift", code: 1, userInfo: nil)
    }

}
于 2015-12-23T00:31:56.513 に答える