How to Support 3D Touch - Static Action on Xcode6

来源:互联网 发布:sd卡数据修复 编辑:程序博客网 时间:2024/05/16 19:42

Background

As Apple mentioned in developer documents:

With iOS 9, new iPhone models add a third dimension to the user interface.

A user can now press your Home screen icon to immediately access functionality provided by your app.
Within your app, a user can now press views to see previews of additional content and gain accelerated access to features.

U.S managers hope adopt part of them(home screen static action) in current release. But we need to huge effort(e.g IPv6 related task) to upgrade Xcode7, and current release had been in last development sprint. So I have to try implement ‘home screen static action’ feature using Xcode6.

Issues

After took a rough review about Apple’s documents. To implement ‘home screen static action’ feature, Apple introduced one new class named UIApplicationShortcutItem and one new application delegate method named - (void) application: (UIApplication *)application performActionForShortcutItem: (UIApplicationShortcutItem *)shortcutItem completionHandler;

Above api were introduced since iOS9, how make it happen using Xcode6(maxim iOS version, iOS 8)?

How

Basically we would use runtime to resolve above issues. See below:

@class UIApplicationShortcutItem;- (void) handleShortCutItem: (UIApplicationShortcutItem *)shortcutItem;{    if ([[shortcutItem valueForKey: @"type"] isEqualToString: @"Foo"])    {        /* quick action 'Foo' */    }    else if ([[shortcutItem valueForKey: @"type"] isEqualToString: @"Bar"])    {        /* quick action 'Bar' */    }    else    {        /* default handle */    }}- (void) application: (UIApplication *)application performActionForShortcutItem: (UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL successed))completionHandler;{    [self handleShortCutItem: shortcutItem];}

More Code

Modify the Info.plist

    <key>UIApplicationShortcutItems</key><array>    <dict>        <key>UIApplicationShortcutItemIconFile</key>        <string>UIApplicationShortcutIconTypeCompose</string>        <key>UIApplicationShortcutItemTitle</key>        <string>Foo</string>        <key>UIApplicationShortcutItemType</key>        <string>Foo</string>        <key>UIApplicationShortcutItemUserInfo</key>        <dict>            <key>key1</key>            <string>value1</string>        </dict>    </dict>    <dict>        <key>UIApplicationShortcutItemIconType</key>        <string>UIApplicationShortcutIconTypeFavorite</string>        <key>UIApplicationShortcutItemTitle</key>        <string>Bar</string>        <key>UIApplicationShortcutItemType</key>        <string>Bar</string>        <key>UIApplicationShortcutItemUserInfo</key>        <dict>            <key>key2</key>            <string>value2</string>        </dict>    </dict></array>

Modify ApplicationDelegate

Need to judge if rawOptions contains UIApplicationLaunchOptionsShortcutItemKey key, if yes handle it and return NO to avoid execute performActionForShortcutItem repeatedly.

- (void) application: (UIApplication *)application performActionForShortcutItem: (UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL successed))completionHandler;{    RC_DLOG_TAG_BEG_ELAPSED;    [self handleShortCutItem: shortcutItem];    RC_DLOG_TAG_END_ELAPSED;}- (BOOL) application: (UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)rawOptions;{    BOOL shouldPerformAdditionalDelegateHandling = YES;    /* please replace the true value of UIApplicationLaunchOptionsShortcutItemKey from Xcode7 */    if (rawOptions && [rawOptions objectForKey: @"UIApplicationLaunchOptionsShortcutItemKey"])    {        shouldPerformAdditionalDelegateHandling = NO;        [self handleShortCutItem: [rawOptions objectForKey: @"UIApplicationLaunchOptionsShortcutItemKey"]];    }    return shouldPerformAdditionalDelegateHandling;}

Reference

Getting Started with 3D Touch

UIApplicationShortcutItems

0 0
原创粉丝点击