web-dev-qa-db-ja.com

今日のアプリ拡張ウィジェットをタップして含まれるアプリを開く

これらの Apple Docs の助けを借りて、通知センター内にその日の引用を表示するアプリケーション+ QuotesにTodayウィジェットを実装しました。私が達成したいのは、ユーザーがToday通知ビュー内で+ QuotesウィジェットをタップしたときにContaining App、この場合は+ Quotesを開くことです。今日のビュー。 -(void)openURL:(NSURL *)URL completionHandler:(void (^)(BOOL success))completionHandlerを呼び出すラベルをボタン上にオーバーレイして、それを含むアプリを開くと宣言したカスタムURLスキームを開きました。問題は、Containing Appを開かないことです。

+Quotes Today App Extension Widget

-(IBAction)myButton:(id)sender {
    NSURL *customURL = [NSURL URLWithString:@"PositiveQuotes://"];
    [self openURL:customURL completionHandler:nil];
}
56
Daniel Storm

編集:OK、ここで少し修正します。上記の提案と次のコードのように、ラベルの上にボタンを配置することで動作しました:

- (IBAction) goToApp: (id)sender { 
    NSURL *url = [NSURL URLWithString:@"floblog://"];
    [self.extensionContext openURL:url completionHandler:nil]; 
  }

「Touch Up Inside」イベントにリンクしました。ただし、これにより、ユーザーが[今日]ビューをスクロールしたときにアプリが起動します。

=======================================

私は同じ問題に遭遇しました。ただし、iOS 8の最初のベータ版の リリースノート に言及しているため、現時点では解決策がないようです。

既知の問題:拡張機能からopenURLが機能しません。

したがって、少なくともベータ2まで待つ必要があると思います。

63
sunseeker

Apple Doc によるSwift 2バージョン

extensionContext?.openURL(NSURL(string: "foo://")!, completionHandler: nil)

Swift 3バージョン

extensionContext?.open(URL(string: "foo://")! , completionHandler: nil)

そして、カスタムURLスキームInfo.plistに追加することを忘れないでください

enter image description here

49
Quanlong

@sunseekerによる答えは良いものですが、コメントでは「隠されています」。そして、これは不可能であると受け入れられている答えが示しているように、訪問者を誤解させる可能性があります。

このコードは機能します:

- (IBAction)launchHostingApp:(id)sender
{
  NSURL *pjURL = [NSURL URLWithString:@"hostingapp://home"];
  [self.extensionContext openURL:pjURL completionHandler:nil];
}

Yosemite Beta 1でXcode 6.0(6A215l)を使用しています。

そしてAppleは Handling Commons Scenarios で言っています:

拡張機能は、含まれているアプリを直接開くように指示しません。代わりに、NSExtensionContextのopenURL:completionHandler:メソッドを使用して、システムに含まれているアプリを開くように指示します。拡張機能がこのメソッドを使用してURLを開くと、システムはリクエストを実行する前に検証します。

28
teriiehina

非表示のボタンを追加せずにこれを行う別の方法は、UILabelにUITapGestureRecognizerを追加することです(ラベルのuserInteractionEnabledを必ずtrueに設定してください)。ハンドラーのレコグナイザーの状態を確認して、UIGestureReconizerStateEnded(CanceledまたはFailedではない)に到達したことを確認してから、openUrlコードを実行します。

3
EPage_Ed

念のため、ここにSwift 3のバージョンとエラー処理バージョンを示します。

let myAppUrl = URL(string: "main-screen:")!
extensionContext?.open(myAppUrl, completionHandler: { (success) in
    if (!success) {
        print("error: failed to open app from Today Extension")
    }
})

これを機能させるには、アプリケーションのinfo.plist(ソースコードとして開く)を開き、最上部でこの後

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

以下を追加すると、アプリはどのURLを処理する必要があるのか​​を知ることができます。 完全な例 含まれているアプリを開き、アプリと拡張機能の間でユーザーデフォルトを共有する方法です。

2
Mikita Manko