私のアプリはすべてObj-Cで書かれています。リンク https://developer.Apple.com/library/content/samplecode/ApplicationShortcuts/Introduction/Intro.html#//Apple_ref/doc/uid/TP40016545 ホーム画面を実装するサンプルコード3D Touchのショートカットは、Swiftで完全にコンパイルされています。誰もが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に何かを追加したりすることなく、機能することができます。
ユーザーがクイックアクションを使用してアプリを開くことができる状態は2つあります。
TL; DRクイックアクションが実行されるアプリの状態に関係なく、常に同じことを実行しているため、必要なのはオーバーライドapplication:performActionForShortcutItem:completionHandler:
したがって、異なることをしたい場合は、2つの場所でそれらを処理します。そうでない場合は、オーバーライドするだけで十分です。
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 Documentation)へのリンク 公式からの引用Apple Docs
アプリ起動メソッド(application:willFinishLaunchingWithOptions:またはapplication:didFinishLaunchingWithOptions :)のいずれかがすでにクイックアクション呼び出しを処理しているかどうかに応じて、システムがこのメソッドを条件付きで呼び出すことを保証するのはユーザーの責任です。ユーザーがアプリのクイックアクションを選択すると、システムは(このメソッドを呼び出す前に)起動メソッドを呼び出し、アプリはアクティブ化する代わりに起動します。
要求されたクイックアクションでは、アプリの起動時に使用されるコードパスとは異なるコードパスが使用される場合があります。たとえば、通常、アプリはビューAを表示するために起動しますが、ビューBを必要とするクイックアクションに応答してアプリが起動されたとします。 UIApplicationLaunchOptionsShortcutItemKey起動オプションキーを確認して、application:willFinishLaunchingWithOptions:またはapplication:didFinishLaunchingWithOptions:メソッドでこのチェックを実行します。 UIApplicationShortcutItemオブジェクトは、起動オプションキーの値として使用できます。
アプリが実際にクイックアクションを使用して起動されたことがわかった場合、起動メソッド内で要求されたクイックアクションを実行し、そのメソッドからNOの値を返します。値NOを返すと、システムはapplication:performActionForShortcutItem:completionHandler:メソッドを呼び出しません。
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;
}
次に、ショートカット項目を取得する任意の場所でこのメソッドを呼び出すだけです。これはあなたの道に沿ってあなたを助けるはずです!
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:In 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;
}
ホーム画面のクイックアクションのためのObjective-Cデモプロジェクトを作成します。
Dタッチホームクイックアクションデモ:https://github.com/dakeshi/3D_Touch_HomeQuickAction
デモプロジェクトでは、Info.plistファイルを使用しない静的クイックアクションを実装して、最初にアプリを起動する前に不要な状況を回避します。動的クイックアクションに簡単に変更できます。
Appleドキュメンテーションで述べたように、application:didFinishLaunchingWithOptions:メソッドでクイックアクションを処理できます。その場合、 application:performActionForShortcutItem:completionHandler:メソッドの呼び出しをブロックするには、NOを返す必要があります。
Swift 3と4(ホーム画面のショートカットのみ))の両方で動作します
//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)
}
}