天天看點

3D touch 的 應用 --備用

在iPhone 6s和iPhone 6s Plus中Apple引入了3D Touch技術。3D Touch的觸控技術,被蘋果稱為新一代多點觸控技術。其實,就是此前在Apple Watch上采用的Force Touch,螢幕可感應不同的感壓力度。

3D touch 的 應用 --備用
iOS9提供了四類API( ​

​Home Screen Quick Action​

​ 、 ​

​UIKit Peek & Pop​

​、 ​

​WebView Peek & Pop​

​ 和 ​

​UITouch Force Properties​

​ )用于操作3D Touch。不過無論使用哪一種API,首先需要做的事情是檢查3D Touch是否可用。 

檢測是否支援3D Touch

在iOS9中提供如下的接口用于檢查裝置是否支援3D Touch:

@property(nonatomic, readonly) UIForceTouchCapability forceTouchCapability;      

其中 ​

​UIForceTouchCapability​

​ 是一個枚舉類型,具體的描述情況如下: 

  • UIForceTouchCapability 
  • UIForceTouchCapabilityUnknown //3D Touch檢測失敗
  • UIForceTouchCapabilityUnavailable //3D Touch不可用
  • UIForceTouchCapabilityAvailable //3D Touch可用

這3個枚舉值就是我們來判斷裝置是否開啟3D Touch功能,可以在UIViewController生命周期的viewWillAppear中做如下判斷:

if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
  //do something
}      

當然在生命周期内,如果使用者有意修改了裝置的3D Touch功能,我們還有一個地方來重新檢測:

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
  //do something
}      

Home Screen Quick Action

在iPhone 6s或者iPhone 6s Plus上面,當使用者按壓App的Icon圖示的時候,會彈出Quick Action,當使用者選擇其中的Action的時候,App會啟動并實作相應的功能。這一過程相當于在PC上面的右鍵快捷菜單的功能,如下圖所示的效果:

3D touch 的 應用 --備用

開發環境

官方文檔上指出Xcode7.0以上的模拟器不支援3D Touch,必須使用支援3D Touch的裝置(iPhone 6s或者iPhone 6s Plus)進行調試。但是這并不能阻止我們在模拟器上面進行調試,GitHub上面早有大神提供了模拟器調試Quick Action的方法,項目的位址是: ​

​https://github.com/DeskConnect/SBShortcutMenuSimulator​

​ 。下面簡單介紹一下安裝的步驟: 

①編譯

git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.git
cd SBShortcutMenuSimulat
make      

②讓SpringBoard支援SBShortcutMenuSimulator

在開啟模拟器的情況下,在SBShortcutMenuSimulator目錄下面執行如下兩行指令:

xcrun simctl spawn booted launchctl debug system/com.apple.SpringBoard --environment DYLD_INSERT_LIBRARIES=$PWD/SBShortcutMenuSimulator.dylib
xcrun simctl spawn booted launchctl stop com.apple.SpringBoard      

③預覽效果

​echo 'com.apple.mobilecal' | nc 127.0.0.1 8000​

​ ,其中com.apple.mobilecal指的是系統自帶的月曆的Bundle ID,運作的時候替換成你的應用的Bundle ID即可。 

建立方式

上面的示例圖中有四個Action Item,其中每個Action是使用UIApplicationShortcutItem這個對象進行描述的,下面列出每一個UIApplicationShortcutItem中能夠包含的資訊:

3D touch 的 應用 --備用

建立Quick Action有兩種方式:靜态和動态

①以靜态方式建立

靜态建立的方式是在Info.plist檔案中進行聲明的

<key>UIApplicationShortcutItems</key>
<array>
  <dict>
      <key>UIApplicationShortcutItemType</key>
      <string>com.devzeng.homePage</string>
      <key>UIApplicationShortcutItemTitle</key>
      <string>首頁</string>
      <key>UIApplicationShortcutItemSubtitle</key>
      <string>這是首頁</string>
      <key>UIApplicationShortcutItemIconFile</key>
      <string>icon_home.png</string>
      <key>UIApplicationShortcutItemUserInfo</key>
      <dict>
          <key>scheme</key>
          <string>devzeng://home</string>
      </dict>
  </dict>
  <dict>
      <key>UIApplicationShortcutItemType</key>
      <string>com.devzeng.about</string>
      <key>UIApplicationShortcutItemTitle</key>
      <string>關于我們</string>
      <key>UIApplicationShortcutItemSubtitle</key>
      <string>這是關于我們</string>
      <key>UIApplicationShortcutItemIconFile</key>
      <string>icon_about.png</string>
      <key>UIApplicationShortcutItemUserInfo</key>
      <dict>
          <key>scheme</key>
          <string>devzeng://about</string>
      </dict>
  </dict>
</array>      

②以動态方式建立

動态建立是在程式初始化的時候用代碼動态添加。 ​

​UIApplication​

​ 對象多了一個支援快捷方式的數組(shortcutItems), 如果需要增加快捷方式,可以指派給shortcutItems屬性。 

@property(nonatomic, copy) NSArray <UIApplicationShortcutItem *> *shortcutItems;      

示例代碼如下:

//建立ShortcutItem
UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"icon_register.png"];//建立快捷item的icon即UIApplicationShortcutItemIconFile
NSDictionary *info1 = @{@"scheme":@"devzeng://register"};//建立快捷item的userinfo即UIApplicationShortcutItemUserInfo
UIMutableApplicationShortcutItem *item1 = [[UIMutableApplicationShortcutItem alloc] initWithType:@"com.devzeng.registerPage" localizedTitle:@"注冊" localizedSubtitle:@"注冊新使用者" icon:icon1 userInfo:info1];
//建立ShortcutItem
UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"icon_shop.png"];
NSDictionary *info2 = @{@"scheme":@"devzeng://shop"};
UIMutableApplicationShortcutItem *item2 = [[UIMutableApplicationShortcutItem alloc] initWithType:@"com.devzeng.shopPage" localizedTitle:@"購物車" localizedSubtitle:@"檢視購物車" icon:icon2 userInfo:info2];
//建立ShortcutItem
UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"icon_help.png"];
NSDictionary *info3 = @{@"scheme":@"devzeng://help"};
UIMutableApplicationShortcutItem *item3 = [[UIMutableApplicationShortcutItem alloc] initWithType:@"com.devzeng.helpPage" localizedTitle:@"幫助" localizedSubtitle:@"幫助手冊" icon:icon3 userInfo:info3];
//注冊ShortcutItem
[UIApplication sharedApplication].shortcutItems = items;      

說明:

1)系統限制每個App最多能夠顯示4個Action Item,其中包括靜态方式和動态方式進行建立的;

2)如果靜态和動态方式同時使用的時候,給UIApplication的shortcutItems指派的時候不會覆寫

響應回調

當app在背景的時候UIApplication提供了一個回調方法

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

我們依據這個回調中的shortcutItem的type和userinfo來做出不同的事件處理,而最後的completionHandler在API的說明中我們看到當應用并非在背景,而是直接重新開程序的時候,直接傳回No,那麼這個時候,我們的回調會放在

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

UIApplication又給我們一個從launchOptions中擷取這個shortcutItem的key(UIApplicationLaunchOptionsShortcutItemKey)

UIApplicationShortcutItem *item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
//根據不同的Action響應不同的事件      

在performActionForShortcutItem回調中

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler {
    if (shortcutItem) {
        //根據不同的Action響應不同的事件
    }
    if (completionHandler) {
        completionHandler(YES);
    }
}