funciona como apple ios objective-c swift ios9 3dtouch

ios - como - 3d touch iphone se



3D Touch Home Atajos en Obj-C (5)

Hay dos estados desde donde el usuario puede abrir la aplicación a través de Acciones rápidas.

TL; DR Siempre estás haciendo lo mismo, independientemente del estado en que se encuentre la aplicación cuando se realiza la acción rápida, por eso solo necesitas anular la application:performActionForShortcutItem:completionHandler: Entonces, si quisieras hacer cosas diferentes, entonces querría manejarlos en los dos lugares, si no, entonces solo lo anulado es suficiente.

  • Uno es si la aplicación se cancela o no se ejecuta en segundo plano, donde obtenemos la información de acceso directo al iniciar.

  • La otra es si la aplicación se ejecuta en segundo plano, donde obtenemos la información de acceso directo en el nuevo método de delegado de la aplicación.

Para manejar estos métodos abreviados de acción rápida cuando esté en segundo plano, debe anular este método en App Delegate:

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

Y por no correr en segundo plano (matado) en tu

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

o

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

debe comprobar si la aplicación se inició mediante una acción rápida:

UIApplicationShortcutItem *shortcutItem = [launchOptions objectForKey:UIApplicationLaunchOptionsShortcutItemKey];

(Enlace a la documentación de Apple relacionada) Cita de los documentos oficiales de Apple

Es su responsabilidad asegurarse de que el sistema llame a este método condicionalmente, dependiendo de si uno de los métodos de inicio de su aplicación (aplicación: willFinishLaunchingWithOptions: o application: didFinishLaunchingWithOptions :) ya ha manejado una invocación de acción rápida. El sistema llama a un método de inicio (antes de llamar a este método) cuando un usuario selecciona una acción rápida para su aplicación y ésta se inicia en lugar de activarse.

La acción rápida solicitada podría emplear rutas de código diferentes a las utilizadas de otra manera cuando se inicie su aplicación. Por ejemplo, digamos que su aplicación normalmente se inicia para mostrar la vista A, pero su aplicación se inició en respuesta a una acción rápida que necesita la vista B. Para manejar estos casos, verifique, al iniciar, si su aplicación se inicia a través de una acción rápida. Realice esta comprobación en su aplicación: willFinishLaunchingWithOptions: o application: didFinishLaunchingWithOptions: método al verificar la clave de opción de inicio UIApplicationLaunchOptionsShortcutItemKey. El objeto UIApplicationShortcutItem está disponible como el valor de la clave de opción de inicio.

Si descubre que su aplicación se inició con una acción rápida, realice la acción rápida solicitada dentro del método de inicio y devuelva un valor de NO de ese método. Cuando devuelve un valor de NO, el sistema no llama a la aplicación: performActionForShortcutItem: completedHandler: método.

Todas mis aplicaciones están actualmente escritas en Obj-C. El enlace https://developer.apple.com/library/content/samplecode/ApplicationShortcuts/Introduction/Intro.html#//apple_ref/doc/uid/TP40016545 para el código de ejemplo de implementación de Accesos directos de pantalla de inicio con 3D Touch está completamente compilado En Swift. ¿Alguien ha encontrado documentación para Obj-C, por lo que no tengo que revisar mi AppDelegate y traducirlo todo?

ACTUALIZAR:

Después de agregar todos los accesos directos en Info.plist, agregué en el 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]; } }

Esto permite que funcione, sin poner ningún otro método o agregando nada a didFinishLaunchingWithOptions.


Realizo un proyecto de demostración objetivo-c para la acción rápida de la pantalla de inicio.

Demostración de acción rápida de 3D Touch Home: https://github.com/dakeshi/3D_Touch_HomeQuickAction

El proyecto Demo implementa la acción rápida estática sin el archivo Info.plist para evitar situaciones no deseadas antes de iniciar la aplicación al principio. Puedes cambiarlo fácilmente a la acción rápida dinámica.

Como se mencionó en la documentación de Apple, puede manejar una acción rápida en la aplicación: didFinishLaunchingWithOptions: method. En ese caso, debería devolver NO al bloque para llamar a la aplicación: performActionForShortcutItem: completedHandler: method.


Si observa el código de muestra proporcionado para Apple, verá que sugieren que escriba un método que maneje su elemento de acceso directo para poder manejarlo en los tres lugares:

  • application: performActionForShortcutItem ,
  • application: didFinishLaunchingWithOptions y
  • willFinishLaunchingWithOptions

Un ejemplo de lo que hice fue:

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

Luego, simplemente llamará a este método en cualquier lugar donde obtenga un elemento de acceso directo. ¡Esto debería ayudarte en tu camino!


Funciona tanto en swift 3 como en 4 (solo en los accesos directos de la pantalla de inicio)

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


Implementar debajo de 3 simples pasos:

Paso 1: Escriba el método a continuación en la clase AppDelegate para configurar elementos de acceso directo dinámicos.

NOTA: puede configurar los elementos de acceso directo en info.plist si lo desea estático. (Consulte la documentación de 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; }

Paso 2: En la application didFinishLaunchingWithOptions clase AppDelegate , el método application didFinishLaunchingWithOptions escribe debajo del código.

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

Paso 3: Escriba a continuación el método de delegado y el controlador de finalización en la clase 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; }