25

現在、私のアプリはすべて Obj-C で書かれています。3D Touchでホーム画面ショートカットを実装するサンプルコードのリンクhttps://developer.apple.com/library/content/samplecode/ApplicationShortcuts/Introduction/Intro.html#//apple_ref/doc/uid/TP40016545が完全にコンパイルされていますスイフトで。Obj-C のドキュメントに出くわした人がいるので、AppDelegate を調べてすべてを翻訳する必要はありませんか?

アップデート:

Info.plist にすべてのショートカットを追加した後、AppDelegate.m に追加しました。

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
    UINavigationController *nav = (UINavigationController *) self.tabBarController.selectedViewController;

    NSLog(@"%@", shortcutItem.type);
    if ([shortcutItem.type isEqualToString:@"com.316apps.iPrayed.addPrayerRequest"]) {
        Requests *gonow = [[Requests alloc] init];

        [nav pushViewController:gonow animated:YES];

    }
    if ([shortcutItem.type isEqualToString:@"com.316apps.iPrayed.addPrayer"]) {

      PrayerStats *controller = [[PrayerStats alloc] init];
        [nav pushViewController:controller animated:YES];

    }

    if ([shortcutItem.type isEqualToString:@"com.316apps.iPrayed.addFast"]) {

      FastStats *controller1 = [[FastStats alloc] init];
        [nav pushViewController:controller1 animated:YES];

    }

    if ([shortcutItem.type isEqualToString:@"com.316apps.iPrayed.addStudy"]) {

      StudyStats *controller2 = [[StudyStats alloc] init];
        [nav pushViewController:controller2 animated:YES];

    }
   }

これにより、他のメソッドを入れたり、didFinishLaunchingWithOptions に何かを追加したりしなくても、機能することができます。

4

5 に答える 5

25

ユーザーがクイック アクションを使用してアプリを開くことができる状態は 2 つあります。

TL;DR クイックアクションが実行されたときのアプリの状態に関係なく、常に同じことを行っているため、オーバーライドするだけで済みますapplication:performActionForShortcutItem:completionHandler:。異なることをしたい場合は、それらをそうでない場合は、オーバーライドされた場所だけで十分です。

  • 1 つは、アプリが強制終了されたか、起動時にショートカット情報を取得するバックグラウンドで実行されていない場合です。

  • もう 1 つは、アプリがバックグラウンドで実行されている場合で、新しいアプリのデリゲート メソッドに関するショートカット情報を取得します。

バックグラウンドでこれらのクイック アクション ショートカットを処理するには、App Delegate でこのメソッドをオーバーライドする必要があります。

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler

そして、あなたの

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

また

-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

アプリがクイック アクションによって起動されたかどうかを確認する必要があります。

UIApplicationShortcutItem *shortcutItem = [launchOptions objectForKey:UIApplicationLaunchOptionsShortcutItemKey];

(関連する Apple ドキュメントへのリンク) 公式 Apple ドキュメントからの引用

アプリ起動メソッド (application:willFinishLaunchingWithOptions: または application:didFinishLaunchingWithOptions:) のいずれかがクイック アクションの呼び出しを既に処理しているかどうかに応じて、システムが条件付きでこのメソッドを呼び出すようにするのは、ユーザーの責任です。ユーザーがアプリのクイック アクションを選択すると、システムは起動メソッドを (このメソッドを呼び出す前に) 呼び出し、アプリはアクティブ化する代わりに起動します。

要求されたクイック アクションは、アプリの起動時に使用されるコード パスとは異なるコード パスを使用する場合があります。たとえば、アプリが通常起動してビュー A を表示するが、アプリはビュー B を必要とするクイック アクションに応答して起動されたとします。このような場合に対処するには、起動時に、アプリがクイック アクションによって起動されているかどうかを確認します。application:willFinishLaunchingWithOptions: または application:didFinishLaunchingWithOptions: メソッドで UIApplicationLaunchOptionsShortcutItemKey 起動オプション キーをチェックして、このチェックを実行します。UIApplicationShortcutItem オブジェクトは、起動オプション キーの値として使用できます。

アプリが実際にクイック アクションを使用して起動されたことが判明した場合は、起動メソッド内で要求されたクイック アクションを実行し、そのメソッドから NO の値を返します。NO の値を返すと、システムは application:performActionForShortcutItem:completionHandler: メソッドを呼び出しません。

于 2015-09-24T23:18:39.810 に答える
3

Apple 用に提供されているサンプル コードを見ると、ショートカット項目を処理するメソッドを記述して、3 つの場所すべてで処理できるようにすることが提案されていることがわかります。

  • application: performActionForShortcutItem
  • application: didFinishLaunchingWithOptions
  • willFinishLaunchingWithOptions

私がしたことの例は次のとおりです。

- (BOOL)handleShortCutItem:(UIApplicationShortcutItem *)shortcutItem {
    BOOL handled = NO;

    if (shortcutItem == nil) {
        return handled;
    }

    if ([shortcutItem.type isEqualToString:kFavoritesQuickAction]) {
        handled = YES;
    } 

    if (handled) {
        // do action here
    }

    return handled;
}

次に、ショートカット項目を取得する任意の場所でこのメソッドを呼び出すだけです。これは、途中で役立つはずです。

于 2015-09-28T19:54:45.400 に答える