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