web-dev-qa-db-fra.com

Raccourcis 3D Touch Home dans Obj-C

Toutes mes applications sont actuellement écrites en Obj-C. Le lien https://developer.Apple.com/library/content/samplecode/ApplicationShortcuts/Introduction/Intro.html#//Apple_ref/doc/uid/TP40016545 pour l'exemple de code d'application des raccourcis de l'écran d'accueil avec la 3D. Touch est complètement compilé dans Swift. Quelqu'un trouve-t-il de la documentation sur Obj-C, je n'ai donc pas à parcourir mon AppDelegate et à le traduire?

METTRE À JOUR:

Après avoir ajouté tous les raccourcis dans Info.plist, j’ai ajouté dans 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];

    }
   }

Cela lui permet de fonctionner sans ajouter d'autres méthodes ni ajouter quoi que ce soit à didFinishLaunchingWithOptions.

24
user717452

Il existe deux états à partir desquels l'utilisateur peut ouvrir l'application via des actions rapides. 

TL; DR Vous faites toujours la même chose, quel que soit l'état dans lequel se trouve l'application lorsque l'action rapide est effectuée, c'est pourquoi vous devez uniquement écraser application:performActionForShortcutItem:completionHandler:. alors vous voudriez les manipuler aux deux endroits, sinon, il suffit de remplacer le remplacement.

  • Le premier est si l'application est supprimée ou ne s'exécute pas en arrière-plan et nous obtenons les informations de raccourci au lancement.

  • L'autre est si l'application est en cours d'exécution en arrière-plan où nous obtenons les informations de raccourci sur la nouvelle méthode de délégué d'application.

Pour gérer ces raccourcis d'action rapide en arrière-plan, vous devez remplacer cette méthode dans App Delegate:

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

Et pour ne pas courir en arrière-plan (tué) sur votre

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

ou

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

vous devriez vérifier si l'application a été lancée par une action rapide:

UIApplicationShortcutItem *shortcutItem = [launchOptions objectForKey:UIApplicationLaunchOptionsShortcutItemKey];

(Lien vers la documentation Apple connexe) Extrait du document officiel Apple Docs

C’est votre responsabilité de vous assurer que le système appelle cette méthode conditionnellement, selon que l'un de vos applications se lance ou non méthodes (application: willFinishLaunchingWithOptions: ou application: didFinishLaunchingWithOptions :) a déjà géré un invocation d'action rapide. Le système appelle une méthode de lancement (avant que Appelle cette méthode) lorsqu'un utilisateur sélectionne une action rapide pour votre application et votre application se lance au lieu de l'activer.

L'action rapide demandée peut utiliser des chemins de code différents de ceux de ceux utilisés par ailleurs lors du lancement de votre application. Par exemple, dites votre application se lance normalement pour afficher la vue A, mais votre application a été lancée dans réponse à une action rapide nécessitant la vue B. Pour traiter de tels cas, vérifiez, au lancement, si votre application est lancée via un rapide action. Effectuer cette vérification dans votre application: willFinishLaunchingWithOptions: ou application: didFinishLaunchingWithOptions: méthode en recherchant le fichier UIApplicationLaunchOptionsShortcutItemKey clé d'option de lancement. Le L'objet UIApplicationShortcutItem est disponible en tant que valeur du fichier touche d'option de lancement.

Si vous trouvez que votre application a bien été lancée en utilisant une action rapide, effectuer l'action rapide demandée dans la méthode de lancement et renvoyer une valeur de NO de cette méthode. Lorsque vous renvoyez une valeur de NO, le le système n’appelle pas le application: performActionForShortcutItem: completionHandler: méthode.

25
Nicolas S

Si vous consultez l'exemple de code fourni à Apple, vous constaterez qu'il vous suggère d'écrire une méthode qui gère votre élément de raccourci afin de pouvoir le gérer aux trois endroits suivants:

  • application: performActionForShortcutItem,
  • application: didFinishLaunchingWithOptions et
  • willFinishLaunchingWithOptions

Un exemple de ce que j'ai fait était:

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

Ensuite, vous appelez simplement cette méthode à tout endroit où vous obtenez un élément de raccourci. Cela devrait vous aider sur votre chemin!

3
sdoowhsoj

Implémentez ci-dessous 3 étapes simples:

Étape 1: Écrivez la méthode ci-dessous dans la classe AppDelegate pour configurer les éléments de raccourci dynamiques.

REMARQUE: vous pouvez configurer des éléments de raccourci dans info.plist si vous le souhaitez statique . (Voir documentation 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;
}

Étape 2: Dans la méthode AppDelegate, la méthode application didFinishLaunchingWithOptions écrit en dessous du code.

    // 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
            }

        }

Étape 3: Ecrivez ci-dessous la méthode déléguée et le gestionnaire d'achèvement dans la classe 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;
}
2
Sunil Targe

Je réalise un projet de démonstration objective-c pour une action rapide à l'écran d'accueil.

Démo d'action rapide 3D touch home: https://github.com/dakeshi/3D_Touch_HomeQuickAction

Le projet de démonstration implémente l'action rapide statique sans le fichier Info.plist pour éviter les situations indésirables avant le lancement de l'application, pour la première fois . Vous pouvez facilement le modifier en action rapide dynamique. 

Comme indiqué dans la documentation Apple, vous pouvez gérer une action rapide dans la méthode application: didFinishLaunchingWithOptions:. Dans ce cas, vous devez renvoyer NO au blocage pour appeler la méthode application: performActionForShortcutItem: completionHandler:.

0
sangjoon moon

Il fonctionne à la fois sur Swift 3 et 4 (uniquement sur les raccourcis de l'écran d'accueil)

//Add plist items as show in image and write following method in Appdelegate
//3D Touch Method shortcuts from home screen

func application(_ application: UIApplication, performActionFor shortcutItem:UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {

if shortcutItem.type == "Share" {
    //handle action Share
    let alert = UIAlertController(title: "3D touch Share", message: "Yahoo!!! 3D touch is working????", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        self.window?.rootViewController?.present(alert,animated: true,completion: nil)
    completionHandler(true)
   } else if shortcutItem.type == "Logout" {

    //handle action Type02
    let alert = UIAlertController(title: "3D touch Logout", message: "Yahoo!!! 3D touch is working????", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
    self.window?.rootViewController?.present(alert,animated: true,completion: nil)
    completionHandler(true)
   } else {
    completionHandler(false)
  }

 }

 enter image description here

0
Sai kumar Reddy