淺談3D Touch(1) -- Home screen quick action

1. 背景:

隨著iOS9 和 iPhone 6s的普及爹梁,蘋果官方提供的3D Touch將帶給我們更好玩切平,更便捷的操作習(xí)慣头谜,桌面快捷菜單可謂是3D Touch功能中最實(shí)用的一個(gè)私爷,有了它煞聪,用戶不再需要進(jìn)入app后做額外的操作斗躏,便能快速進(jìn)入指定的頁面。

2. 前期工作:

由于手頭“并(wo)沒(xiang)有(yao)”iPhone 6s 的設(shè)備昔脯,很多人說瑟捣,那我怎么開發(fā)這個(gè)功能呢馋艺?不怕,github上早有大神寫好了模擬器的解決方案迈套。按照這個(gè)文檔上的方法依次執(zhí)行捐祠,你的模擬器也能喚出快捷菜單。

3. 正式接入

①.創(chuàng)建UIApplicationShortcutItem

我們先來看一下每個(gè)UIApplicationShortcutItem中能夠包含哪些信息

key Description required
UIApplicationShortcutItemType 事件的唯一標(biāo)識(shí)桑李,可以通過這個(gè)標(biāo)識(shí)來辨別你具體點(diǎn)擊了哪個(gè)事件 Y
UIApplicationShortcutItemTitle 標(biāo)題踱蛀,在沒有子標(biāo)題的情況下如果標(biāo)題太長能自動(dòng)換行 Y
UIApplicationShortcutItemSubtitle 子標(biāo)題,在標(biāo)題的下方 N
UIApplicationShortcutItemIconType 枚舉選取系統(tǒng)中的一個(gè)圖標(biāo)類型 N
UIApplicationShortcutItemIconFile 自定義一個(gè)圖標(biāo)贵白,以單一顏色35x35的大小展示率拒,如果設(shè)置這個(gè),UIApplicationShortcutItemIconType將不起作用 N
UIApplicationShortcutItemUserInfo 字典禁荒,里面可以添加各種key猬膨、value對(duì) N

UIApplicationShortcutItem 的創(chuàng)建有2種方式

  • 第一種是在info.plist里面靜態(tài)添加:
<key>UIApplicationShortcutItems</key>
<array>
    <dict>
        <key>UIApplicationShortcutItemType</key>
        <string>3dtouch.homePage</string>
        <key>UIApplicationShortcutItemTitle</key>
        <string>首頁</string>
        <key>UIApplicationShortcutItemSubtitle</key>
        <string>這是首頁</string>
        <key>UIApplicationShortcutItemIconFile</key>
        <string>shouye.png</string>
        <key>UIApplicationShortcutItemUserInfo</key>
        <dict>
            <key>url</key>
            <string>index</string>
        </dict>
    </dict>
    <dict>
        <key>UIApplicationShortcutItemType</key>
        <string>3dtouch.guanzhupage</string>
        <key>UIApplicationShortcutItemTitle</key>
        <string>關(guān)注</string>
        <key>UIApplicationShortcutItemSubtitle</key>
        <string>這是關(guān)注</string>
        <key>UIApplicationShortcutItemIconFile</key>
        <string>guanzhu.png</string>
        <key>UIApplicationShortcutItemUserInfo</key>
        <dict>
            <key>url</key>
            <string>guanzhu</string>
        </dict>
    </dict>
</array>
  • 第二種是在程序初始化的時(shí)候用代碼動(dòng)態(tài)添加:

我們先看一下UIApplicationShortcutItem.h,發(fā)現(xiàn)它的使用非常簡單,習(xí)慣完全符合官方API固有方式呛伴,而且和之前那種方式所構(gòu)建的包含的信息是一一對(duì)應(yīng)的勃痴,其中有3個(gè)@interface分別是:

  • UIApplicationShortcutIcon
  • UIApplicationShortcutItem
  • UIMutableApplicationShortcutItem
//創(chuàng)建快捷item的icon 即UIApplicationShortcutItemIconFile
UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"money"];

UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"gouwuche"];

UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"wode"];
    
//創(chuàng)建快捷item的userinfo 即UIApplicationShortcutItemUserInfo
NSDictionary *info1 = @{@"url":@"money"};
NSDictionary *info2 = @{@"url":@"gouWuche"};
NSDictionary *info3 = @{@"url":@"wode"};
    
//創(chuàng)建ShortcutItem
UIMutableApplicationShortcutItem *item1 = [[UIMutableApplicationShortcutItem alloc]initWithType:@"3dtouch.moneyPage" localizedTitle:@"資產(chǎn)" localizedSubtitle:@"這是資產(chǎn)" icon:icon1 userInfo:info1];

UIMutableApplicationShortcutItem *item2 = [[UIMutableApplicationShortcutItem alloc]initWithType:@"3dtouch.shopPage" localizedTitle:@"購物車" localizedSubtitle:@"這是購物車" icon:icon2 userInfo:info2];

UIMutableApplicationShortcutItem *item3 = [[UIMutableApplicationShortcutItem alloc]initWithType:@"3dtouch.mypage" localizedTitle:@"我的" localizedSubtitle:@"這是我的" icon:icon3 userInfo:info3];
    
//把原有的shortcutItems拿出來,把動(dòng)態(tài)的放進(jìn)去
NSArray *items = @[item1, item2, item3];

NSArray *existingItems = [UIApplication sharedApplication].shortcutItems;

NSArray *updatedItems = [existingItems arrayByAddingObjectsFromArray:items];
    
//塞回去
[UIApplication sharedApplication].shortcutItems = updatedItems;

最后我們來看一下效果:

img_1

看上去是不是非常和諧热康?其實(shí)我告訴你沛申,我們已經(jīng)踩到了坑里了

我在運(yùn)行中發(fā)現(xiàn):

NSArray *existingItems = [UIApplication sharedApplication].shortcutItems;

所獲得的existingItems并不是我們之前設(shè)置在info.plist里面的,而是上一次

[UIApplication sharedApplication].shortcutItems = updatedItems;

賦值給他的姐军,又因?yàn)槲易宰髀斆鞯淖隽艘淮?/p>

NSArray *updatedItems = [existingItems arrayByAddingObjectsFromArray:items];

所以我們每運(yùn)行一次铁材,shortcutItems中的元素個(gè)數(shù)就會(huì)多3個(gè),

img_2

那為什么展示出來沒有問題呢奕锌?

仔細(xì)看剛剛發(fā)的那張效果圖著觉,我擦,只有4個(gè)惊暴,對(duì)了饼丘,這個(gè)就是表象上不出錯(cuò)的原因,在API上并沒有寫shortcutItems有任何個(gè)數(shù)限制缴守,也沒有寫快捷窗口的個(gè)數(shù),但是實(shí)際上镇辉,最多只能顯示4個(gè)屡穗,而且shortcutItems這個(gè)里面的對(duì)象恐怕是早已被系統(tǒng)默默的存到了某個(gè)plist里了,每當(dāng)程序啟動(dòng)時(shí)忽肛,會(huì)向系統(tǒng)要app的Bundle Identifier對(duì)應(yīng)的shortcutItems村砂,并非我們事先想要的info.plist中的items,當(dāng)然以上只是我從現(xiàn)象做出的合理猜測(cè)屹逛,我們并不需要關(guān)心info.plist中的那些靜態(tài)item础废,只需要?jiǎng)討B(tài)創(chuàng)建的item直接打包賦值過去

[UIApplication sharedApplication].shortcutItems = @[item1, item2, item3];

至于只展示4個(gè)的問題汛骂,這個(gè)我們無能為力了,系統(tǒng)做了限制评腺。

②.Item點(diǎn)擊回調(diào)

當(dāng)app在后臺(tái)的時(shí)候UIApplication提供了一個(gè)回調(diào)方法

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler NS_AVAILABLE_IOS(9_0);

我們依據(jù)這個(gè)回調(diào)中的shortcutItem的type和userinfo來做出不同的事件處理,而最后的completionHandler在API的說明中我們看到當(dāng)應(yīng)用并非在后臺(tái)帘瞭,而是直接重新開進(jìn)程的時(shí)候,直接返回No蒿讥,那么這個(gè)時(shí)候蝶念,我們的回調(diào)會(huì)放在

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

UIApplication又給我們一個(gè)從launchOptions中獲取這個(gè)shortcutItem的key--UIApplicationLaunchOptionsShortcutItemKey,所以在這2個(gè)都進(jìn)行對(duì)shortcutItem的操作后芋绸,我們這個(gè)功能算是完成了

在didFinishLaunchingWithOptions中媒殉,由于某些客戶端會(huì)有啟動(dòng)動(dòng)畫,所以這邊加了3秒摔敛,具體因程序而異

UIApplicationShortcutItem *item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
__weak typeof(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    __strong typeof(weakSelf) strongSelf = weakSelf;
    if (strongSelf)
    {
        [strongSelf actionWithShortcutItem:item];
    }
});

在performActionForShortcutItem回調(diào)中

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler
{
    if (shortcutItem)
    {
        [self actionWithShortcutItem:shortcutItem];
    }
    
    if (completionHandler)
    {
        completionHandler(YES);
    }
}

最后就是統(tǒng)一處理actionWithShortcutItem的地方廷蓉,由于我這個(gè)demo中所有的type對(duì)應(yīng)的行為都一樣的,所以我這邊沒有對(duì)type做區(qū)分马昙,甚至所以的item可以用同一個(gè)type

-(void)actionWithShortcutItem:(UIApplicationShortcutItem *)item
{
    if (item.userInfo)
    {
        NSLog(@"%@",item.userInfo[@"url"]);
    }
}

好了桃犬,3D Touch的第一個(gè)功能就介紹到這里 Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末给猾,一起剝皮案震驚了整個(gè)濱河市疫萤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敢伸,老刑警劉巖扯饶,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異池颈,居然都是意外死亡尾序,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門躯砰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來每币,“玉大人,你說我怎么就攤上這事琢歇±嫉。” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵李茫,是天一觀的道長揭保。 經(jīng)常有香客問我,道長魄宏,這世上最難降的妖魔是什么秸侣? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上味榛,老公的妹妹穿的比我還像新娘椭坚。我一直安慰自己,他們只是感情好搏色,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布善茎。 她就那樣靜靜地躺著,像睡著了一般继榆。 火紅的嫁衣襯著肌膚如雪巾表。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天略吨,我揣著相機(jī)與錄音集币,去河邊找鬼。 笑死翠忠,一個(gè)胖子當(dāng)著我的面吹牛鞠苟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秽之,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼当娱,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了考榨?” 一聲冷哼從身側(cè)響起跨细,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎河质,沒想到半個(gè)月后冀惭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掀鹅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年散休,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乐尊。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡戚丸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扔嵌,到底是詐尸還是另有隱情限府,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布痢缎,位于F島的核電站胁勺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏牺弄。R本人自食惡果不足惜姻几,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望势告。 院中可真熱鬧蛇捌,春花似錦、人聲如沸咱台。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽回溺。三九已至春贸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遗遵,已是汗流浹背萍恕。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留车要,地道東北人允粤。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像翼岁,于是被迫代替她去往敵國和親类垫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容