Подтвердить что ты не робот

Горячие клавиши 3D Touch в Obj-C

Все мои приложения в настоящее время написаны в Obj-C. Ссылка https://developer.apple.com/library/content/samplecode/ApplicationShortcuts/Introduction/Intro.html#//apple_ref/doc/uid/TP40016545 для примера кода реализации ярлыков главного экрана с 3D Touch полностью скомпилирована в Swift. Кто-нибудь сталкивается с документацией для Obj-C, поэтому мне не нужно проходить через AppDelegate и переводить все это?

UPDATE:

После добавления всех ярлыков в 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.

4b9b3361

Ответ 1

Есть два состояния, из которых пользователь может открыть приложение с помощью быстрых действий.

TL; DR Вы всегда делаете то же самое, независимо от состояния, в котором приложение находится, когда выполняется быстрое действие, поэтому вам нужно только переопределить application:performActionForShortcutItem:completionHandler:. Поэтому, если вы хотите делать разные вещи, тогда вы захотите обработать их в два места, если не тогда, то достаточно переопределить.

  • Один из них, если приложение было убито или не работает в фоновом режиме, где мы получаем информацию о ярлыке при запуске.

  • Другое, если приложение работает в фоновом режиме, где мы получаем информацию о ярлыке нового метода делегирования приложения.

Чтобы справиться с этими быстрыми клавишами быстрого действия, когда в фоновом режиме вам необходимо переопределить этот метод в 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

Его ответственность за то, чтобы система вызывала этот метод условно, в зависимости от того, запускается ли один из ваших приложений методы (приложение: willFinishLaunchingWithOptions: или application: didFinishLaunchingWithOptions:) уже обработал быстрый вызов действий.. Система вызывает метод запуска (до вызов этого метода), когда пользователь выбирает быстрое действие для вашего приложения и приложение запускается вместо активации.

Запрошенное быстрое действие может использовать коды кода, отличные от те, которые используются иначе, когда приложение запускается. Например, скажем, ваше приложение обычно запускается для отображения вида A, но ваше приложение было запущено в ответ на быстрое действие, которому требуется представление B. Чтобы справиться с такими случаями, проверьте, при запуске, запускается ли ваше приложение через быстрый действие. Выполните эту проверку в своем application: willFinishLaunchingWithOptions: или application: didFinishLaunchingWithOptions: метод, проверяя Кнопка запуска ключа UIApplicationLaunchOptionsShortcutItemKey. Объект UIApplicationShortcutItem доступен как значение ключ запуска.

Если вы обнаружите, что ваше приложение действительно было запущено с помощью быстрого действия, выполнить запрошенные быстрые действия в рамках метода запуска и вернуть значение NO от этого метода. Когда вы возвращаете значение NO, система не вызывает application: performActionForShortcutItem: completeHandler: метод.

Ответ 2

Если вы посмотрите пример кода, предоставленного для Apple, вы увидите, что они предлагают написать метод, который обрабатывает ваш ярлык, чтобы вы могли обрабатывать его во всех трех местах:

  • 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;
}

Затем вы просто вызываете этот метод в любом месте, где вы получаете ярлык. Это должно помочь вам по пути!

Ответ 3

Внесите ниже три простых шага:

Шаг 1: Запишите метод ниже в классе AppDelegate для настройки динамических ярлыков.

ПРИМЕЧАНИЕ. Вы можете настроить ярлыки в файле info.plist, если хотите, чтобы он был статичным. (См. Документация Apple.

/**
 *  @brief config dynamic shortcutItems
 *  @discussion after first launch, users can see dynamic shortcutItems
 */
- (void)configDynamicShortcutItems {
    // config image shortcut items
    // if you want to use custom image in app bundles, use iconWithTemplateImageName method
    UIApplicationShortcutIcon *shortcutSearchIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeSearch];
    UIApplicationShortcutIcon *shortcutFavoriteIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeFavorite];

    UIApplicationShortcutItem *shortcutSearch = [[UIApplicationShortcutItem alloc]
                                                 initWithType:@"com.sarangbang.QuickAction.Search"
                                                 localizedTitle:@"Search"
                                                 localizedSubtitle:nil
                                                 icon:shortcutSearchIcon
                                                 userInfo:nil];

    UIApplicationShortcutItem *shortcutFavorite = [[UIApplicationShortcutItem alloc]
                                                 initWithType:@"com.sarangbang.QuickAction.Favorite"
                                                 localizedTitle:@"Favorite"
                                                 localizedSubtitle:nil
                                                 icon:shortcutFavoriteIcon
                                                 userInfo:nil];


    // add all items to an array
    NSArray *items = @[shortcutSearch, shortcutFavorite];

    // add the array to our app
    [UIApplication sharedApplication].shortcutItems = items;
}

Шаг 2: В методе AppDelegate class application didFinishLaunchingWithOptions напишите ниже код.

    // UIApplicationShortcutItem is available in iOS 9 or later.
        if([[UIApplicationShortcutItem class] respondsToSelector:@selector(new)]){

            [self configDynamicShortcutItems];

            // If a shortcut was launched, display its information and take the appropriate action
            UIApplicationShortcutItem *shortcutItem = [launchOptions objectForKeyedSubscript:UIApplicationLaunchOptionsShortcutItemKey];

            if(shortcutItem)
            {
                // When the app launch at first time, this block can not called.
                //App launch process with quick actions
                [self handleShortCutItem:shortcutItem];
            }else{
                // normal app launch process without quick action
            }

        }

Шаг 3: Запишите ниже метод делегата и обработчик завершения в классе AppDelegate.

/*
 Called when the user activates your application by selecting a shortcut on the home screen, except when
 application(_:,willFinishLaunchingWithOptions:) or application(_:didFinishLaunchingWithOptions) returns `false`.
 You should handle the shortcut in those callbacks and return `false` if possible. In that case, this
 callback is used if your application is already launched in the background.
 */

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

    BOOL handledShortCutItem = [self handleShortCutItem:shortcutItem];

    completionHandler(handledShortCutItem);
}


/**
 *  @brief handle shortcut item depend on its type
 *
 *  @param shortcutItem shortcutItem  selected shortcut item with quick action.
 *
 *  @return return BOOL description
 */
- (BOOL)handleShortCutItem : (UIApplicationShortcutItem *)shortcutItem{

    BOOL handled = NO;

    NSString *bundleId = [NSBundle mainBundle].bundleIdentifier;

    NSString *shortcutSearch = [NSString stringWithFormat:@"%@.Search", bundleId];
    NSString *shortcutFavorite = [NSString stringWithFormat:@"%@.Favorite", bundleId];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];


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

        SecondViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"secondVC"];

        self.window.rootViewController = vc;

        [self.window makeKeyAndVisible];

    }

    else if ([shortcutItem.type isEqualToString:shortcutFavorite]) {
        handled = YES;

        ThirdViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"thirdVC"];

        self.window.rootViewController = vc;

        [self.window makeKeyAndVisible];
    }


    return handled;
}

Ответ 4

Я делаю демонстрационный проект objective-c для быстрого действия на домашнем экране.

Демо-версия 3D touch домой: https://github.com/dakeshi/3D_Touch_HomeQuickAction

Демо-проект реализует статические быстрые действия без файла Info.plist, чтобы избежать нежелательных ситуаций перед запуском приложения. Вы можете легко изменить его на динамичное быстрое действие.

Как упоминалось в документации Apple, вы можете обрабатывать быстрые действия в приложении: метод didFinishLaunchingWithOptions:. В этом случае вы должны вернуть NO для блокировки для вызова приложения: performActionForShortcutItem: completeHandler: method.