1

ストーリーボードとセグエ ベースのナビゲーションを使用する Facebook 対応の iOS 5 アプリがあり、「iOS ネイティブ ディープ リンク」の実装方法について混乱しています。Improving App Distribution on iOSのサンプル コードでは、a が表示されるだけですが、 UIAlertView2 つの連続したシーク操作を開始しようとしています。

この質問の目的のために、アプリケーションを 3 つのビュー コントローラーに簡略化し ましMYCategoryTableViewControllerた。通常のフローでは、アプリケーションが開き、カテゴリのテーブルが表示されます。ユーザーがカテゴリを選択すると、その選択したカテゴリの項目の表を表示するセグエがあります。最後に、アイテムが選択されると、アイテムの詳細ビューを表示するセグエがあります。MYItemsTableViewControllerMYItemViewControllerMYCategoryTableViewControllerMYItemsTableViewControllerMYItemViewController

prepareForSeguefromは、そのMYCategoryTableViewControllerカテゴリを表す宛先ビュー コントローラーのプロパティを設定します。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"ITEMS_SEGUE"]) {
        MYItemsTableViewController *vc = [segue destinationViewController];        
        MYCategory *mycategory = [self.fetchedResultsController objectAtIndexPath:[self.tableView indexPathForSelectedRow]];
        vc.mycategory = mycategory;
    }
}

prepareForSeguefromは、そのMYItemsTableViewControllerカテゴリを表す宛先ビュー コントローラーのプロパティを設定します。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"ITEM_SEGUE"]) {
        MYItemViewController *vc = [segue destinationViewController];
        MYItem *myitem = [self.fetchedResultsController objectAtIndexPath:[self.tableView indexPathForSelectedRow]];
        vc.myitem = myitem;
    }
}

質問: に何かを実装する必要があることはわかっていますがapplication:openURL、次に何をすればよいかわかりません。着信 URL がMYCategoryおよびMYItemオブジェクトをルックアップするための識別子を提供すると仮定します。performSegueWithIdentifierそれがどのように相互作用しprepareForSegue、モデルオブジェクトを宛先ビューコントローラーにどのように設定するかはわかりませんでした。

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    // get "target_url" from incoming url
    // and parse out MYCategory and MYItem identifiers

    // something like this???
    [self.window makeKeyAndVisible];
    [self.window.rootViewController performSegueWithIdentifier:@"ITEM_SEGUE" sender:self];

    return [facebook handleOpenURL:url];
}

更新: テーブルビューのセルをプログラムで選択しても、関連するセグエが実行されないというアイデアがありました。たぶん、からのURLを保存して、自然にロードapplication:openURL:させます。MYCategoryTableViewController次に の間viewWillAppearに を呼び出しtableView selectRowAtIndexPathperformSegueWithIdentifierから に遷移しMYItemsTableViewControllerます。で同じパターンを繰り返しますがMYItemsTableViewController、呼び出しの前に URL をクリアしperformSegueWithIdentifierます。

4

1 に答える 1

1

これが私が働いたものです。ではMYAppDelegate、ディープ リンクの ID を表す文字列を取得しました。

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    NSString *deepLinkId;  
    // more code that parses url

    // only deep link if MYCategoryTableViewController is active controller
    UIViewController *rootContoller = self.window.rootViewController;
    if ([rootContoller isKindOfClass:[UINavigationController class]]) {
        UINavigationController *navController = (UINavigationController *)rootContoller;
        if ([navController.topViewController isKindOfClass:[MYCategoryTableViewController class]]) {
            self.deepLinkId = deepLinkId;
        }
    }
}

次に、MYCategoryTableViewController読み込み時に呼び出しselectRowAtIndexPath、次にperformSegueWithIdentifier.

- (void)processDeepLink {  
    if (_appDelegate.deepLinkId) {
        MYItem *myitem = [MYItem lookupById:_appDelegate.deepLinkId inManagedObjectContext:_appDelegate.dataDocument.managedObjectContext];
        if (myitem) {
            NSIndexPath *indexPath = [self.fetchedResultsController indexPathForObject:myitem.mycategory];
            [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];
            [self performSegueWithIdentifier:@"ITEMS_SEGUE" sender:self];
        }
    }
}

そして、MYItemViewController負荷時も同様の流れです。

if (_appDelegate.deepLinkId) {
    MYItem *plate = [MYItem lookupById:_appDelegate.deepLinkId inManagedObjectContext:_appDelegate.dataDocument.managedObjectContext];
    NSIndexPath *indexPath = [self.fetchedResultsController indexPathForObject:plate];
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];

    _appDelegate.deepLinkId = nil;
    [self performSegueWithIdentifier:@"ITEM_SEGUE" sender:self];
}

UIApplicationDidBecomeActiveNotificationまた、アプリケーションが既に開いている場合の使用例についても観察する必要がありました。

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(processDeepLink)
                                             name:UIApplicationDidBecomeActiveNotification
                                           object:nil];
于 2012-06-08T01:55:50.870 に答える