wake-up-neo.net

3D-Touch-Start-Kurzbefehle in Obj-C

Alle meine Apps sind derzeit in Obj-C geschrieben. Der Link https://developer.Apple.com/library/content/samplecode/ApplicationShortcuts/Introduction/Intro.html#//Apple_ref/doc/uid/TP40016545 für den Beispielcode für die Implementierung von Home Screen Shortcuts mit 3D Touch ist komplett in Swift kompiliert. Hat jemand eine Dokumentation für Obj-C gefunden, so dass ich mein AppDelegate nicht durchgehen und alles übersetzen muss?

AKTUALISIEREN:

Nachdem ich alle Verknüpfungen in Info.plist hinzugefügt hatte, fügte ich in AppDelegate.m hinzu:

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

    }
   }

Dadurch kann es funktionieren, ohne andere Methoden einzufügen oder didFinishLaunchingWithOptions hinzuzufügen.

24
user717452

Es gibt zwei Zustände, aus denen der Benutzer die App über Schnellaktionen öffnen kann. 

TL; DR Sie machen immer dasselbe, unabhängig von dem Status, in dem sich die App befindet, wenn die schnelle Aktion ausgeführt wird. Deshalb müssen Sie nur application:performActionForShortcutItem:completionHandler: überschreiben. Wenn Sie also andere Dinge tun wollten, dann möchten Sie sie an beiden Stellen behandeln, wenn nicht, dann reicht das überschriebene aus.

  • Eine davon ist, ob die App beendet wird oder nicht im Hintergrund ausgeführt wird, wo wir beim Start die Verknüpfungsinformationen erhalten.

  • Die andere ist, wenn die App im Hintergrund ausgeführt wird, wo wir die Verknüpfungsinformationen zur neuen App-Delegatenmethode erhalten.

Um diese Schnellzugriffsverknüpfungen im Hintergrund auszuführen, müssen Sie diese Methode in App Delegate überschreiben:

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

Und damit Sie nicht im Hintergrund (getötet) auf Ihrem Computer laufen

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

oder

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

sie sollten prüfen, ob die App durch eine Schnellaktion gestartet wurde:

UIApplicationShortcutItem *shortcutItem = [launchOptions objectForKey:UIApplicationLaunchOptionsShortcutItemKey];

(Link zur zugehörigen Apple-Dokumentation) Zitat aus den offiziellen Apple Docs

Es liegt in Ihrer Verantwortung sicherzustellen, dass das System diese Methode aufruft abhängig davon, ob eine App gestartet wird oder nicht Methoden (application: willFinishLaunchingWithOptions: oder application: didFinishLaunchingWithOptions :) hat bereits ein .__ behandelt. Schneller Handlungsaufruf. Das System ruft eine Startmethode (vor Aufruf dieser Methode) auf, wenn ein Benutzer eine Schnellaktion für Ihre App auswählt und Ihre App startet statt zu aktivieren.

Die angeforderte Schnellaktion kann andere Codepfade als .__ verwenden. die sonst verwendet werden, wenn Ihre App gestartet wird. Sagen Sie zum Beispiel Ihre App Wird normalerweise gestartet, um Ansicht A anzuzeigen, aber Ihre App wurde in .__ gestartet. Antwort auf eine schnelle Aktion, die Ansicht B benötigt. Um solche Fälle zu bearbeiten, muss Prüfen Sie beim Start, ob Ihre App über eine schnelle .__ gestartet wird. Aktion. Führen Sie diese Überprüfung in Ihrem .__ aus. application: willFinishLaunchingWithOptions: oder application: didFinishLaunchingWithOptions: Methode durch Überprüfen auf die UIApplicationLaunchOptionsShortcutItemKey-Startoptionsschlüssel. Das Das UIApplicationShortcutItem-Objekt ist als Wert von .__ verfügbar. Optionstaste starten.

Wenn Sie feststellen, dass Ihre App tatsächlich mit einer schnellen Aktion gestartet wurde, Führen Sie die angeforderte Schnellaktion innerhalb der Startmethode aus und geben Sie .__ zurück. ein Wert von NO aus dieser Methode. Wenn Sie den Wert NO zurückgeben, wird der System ruft nicht die Anwendung: PerformActionForShortcutItem: completionHandler: Methode.

25
Nicolas S

Wenn Sie sich den Beispielcode ansehen, der für Apple bereitgestellt wird, wird empfohlen, dass Sie eine Methode schreiben, die Ihr Verknüpfungselement verarbeitet, sodass Sie es an allen drei Stellen bearbeiten können:

  • application: performActionForShortcutItem,
  • application: didFinishLaunchingWithOptions und
  • willFinishLaunchingWithOptions

Ein Beispiel für das, was ich getan habe, war:

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

Dann würden Sie diese Methode einfach überall aufrufen, wo Sie ein Verknüpfungselement erhalten. Dies sollte Ihnen auf Ihrem Weg helfen!

3
sdoowhsoj

Implementiere unter 3 einfachen Schritten:

Schritt 1: Schreiben Sie die unten stehende Methode in die Klasse AppDelegate, um dynamische Verknüpfungselemente zu konfigurieren.

ANMERKUNG: Sie können Verknüpfungselemente in info.plist konfigurieren, wenn Sie möchten, dass sie statisch sind .. (Siehe Apple-Dokumentation. )

/**
 *  @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;
}

Schritt 2: In AppDelegate Klasse application didFinishLaunchingWithOptions Methode unter dem Code schreiben.

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

        }

Schritt 3: Schreiben Sie in der Klasse AppDelegate die Delegatmethode und den Beendigungshandler.

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

Ich mache ein Objective-c-Demoprojekt für eine schnelle Aktion auf dem Startbildschirm.

Schnellstart-Demo für 3D-Touch-Startseite: https://github.com/dakeshi/3D_Touch_HomeQuickAction

Das Demo-Projekt implementiert die statische Schnellaktion ohne Info.plist -Datei, um unerwünschte Situationen zu vermeiden, bevor die App zuerst gestartet wird. Sie können sie leicht in die dynamische Schnellaktion ändern. 

Wie in der Apple-Dokumentation erwähnt, können Sie mit application: didFinishLaunchingWithOptions: schnelle Aktionen ausführen. In diesem Fall sollten Sie NEIN zurückgeben, um den Aufruf von application: performActionForShortcutItem: completionHandler: aufzurufen.

0
sangjoon moon

Es funktioniert sowohl auf Swift 3 als auch auf 4 (nur bei Startbildschirmen)

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