iOS 3D touch 之 Home Screen Quick Action 的创建

由于 3D touch 的功能 iPhone 的模拟器并不支持、但是这并不能阻止我们进行调试
在 gitHub 早有大神提供了模拟器调试 Quick Action 的方法
项目的地址是:https://github.com/DeskConnect/SBShortcutMenuSimulator
下面简单介绍一下安装的步骤:
打开终端

git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.git
cd SBShortcutMenuSimulatmake

如果电脑中有多个Xcode版本,先做如下操作,如果只有Xcode7 那么你可以跳过此步

sudo xcode-select -switch /Applications/Xcode2.app/Contents/Developer/

这里需要注意的是:上面命令中,Xcode2.app 是你电脑中Xcode的名字
如果名字中有空格,需要修改一下,把空格去掉,否则会影响终端命令的正常执行。

然后你需执行如下命令进入 SBShortcutMenuSimulator 的目录

cd SBShortcutMenuSimulatmake

继续执行下面的两个命令

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

看到终端输出下面这些提示 说明服务已经配置成功了
Service configured for next launch.

接着我们就可以通过向指定端口发送消息的方法来在模拟器上 模拟 3D Touch 的效果:

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

需要注意的是 单引号中 com.apple.mobilecal 是应用的 Bundle ID
如果要测试你自己的应用,直接将其改成你们应用的 Bundle ID 即可
上面的 'com.apple.mobilecal' iOS系统的日历
我们可以看一下模拟器上的效果:


Simulator Screen Shot 2015年11月27日 下午4.01.19
* 这里不得不提一下 apple 公司考虑事情确实很周到
当我们的 app 在屏幕的靠左边的位置时
3D touch 的菜单弹出时 图片在左边、文字在右边 如上图所示的样子

---------------------- 牛逼的分割线 ----------------------

相反当我们的 app 在屏幕的右边时
3D touch 的菜单弹出时 图片在右边、文字在左边 如下图所示

Simulator Screen Shot 2015年11月27日 下午4.02.50.png


接下来就是如何将装逼进行到底
如何创建 Quick Action 也就是重按 app 图标时弹出的那几个菜单


imooc 免费 IT 教育

正如上面的图中有两个Action Item 【历史记录】【查看下载】
每个 Action 都是使用 UIApplicationShortcutItem 这个对象进行创建的
下面列出每一个 UIApplicationShortcutItem 中能够包含的信息:

名称描述必须
UIApplicationShortcutItemTypeitem事件的唯一标示、通过茨表示可以确定点击的那个itemYES
UIApplicationShortcutItemTitleitem的标题、subtitle为空时、title过长可能会换行显示YES
UIApplicationShortcutItemSubtitleitem的子标题、在title下方以小文字显示NO
UIApplicationShortcutItemIconTypeitem图标枚举、系统的样式NO
UIApplicationShortcutItemIconFile自定义item图标、大小为 35*35 的单一颜色样式呈现、 如果设置此项 UIApplicationShortcutItemIconType 将会失效NO
UIApplicationShortcutItemUserInfo以字典的形式 key : valueNO
* Home Screen Quick Action 的创建 有两种方式
1. 静态
2. 动态
* 需要注意的是
每个App最多能够显示 4个Action Item4个Action Item4个Action Item
重要的事情要说 三 遍 最多4个Action Item
支持【静态方式】和【动态方式】同时存在、并不会冲突
如果你比较够叛逆、够任性、同时使用了【静态】和【动态】方式
那么你给 UIApplication 的 shortcutItems 这个数组赋值的时候并不会覆盖、并不会覆盖、并不会覆盖
我又说了三遍... 见谅
  • 静态方式

    静态创建的方式是在项目的 Info.plist 文件中添加数组即可

    <key>UIApplicationShortcutItems</key>
    <array>
         <dict>
            <key>UIApplicationShortcutItemType</key>
            <string>download</string> 
            <key>UIApplicationShortcutItemTitle</key>
            <string>历史记录</string>
            <key>UIApplicationShortcutItemSubtitle</key>
            <string></string>
            <key>UIApplicationShortcutItemIconFile</key>            
            <string>shortcut_history.png</string>
            <key>UIApplicationShortcutItemUserInfo</key>
            <dict>
                     <key>***</key>
                     <string>***</string>
            </dict>
         </dict> 
         <dict> 
               <key>UIApplicationShortcutItemType</key>
               <string>download</string>
               <key>UIApplicationShortcutItemTitle</key>
               <string>查看下载</string>
               <key>UIApplicationShortcutItemSubtitle</key>
               <string></string>
               <key>UIApplicationShortcutItemIconFile</key>
               <string>shortcut_download.png</string>
               <key>UIApplicationShortcutItemUserInfo</key>
               <dict> 
                    <key>***</key>
                    <string>***</string>
               </dict>
         </dict>
    </array>
  • 动态方式

    动态方式需要在 application didFinishLachingWithOption: 方法中实现

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
      if (self.forceTouchCapability == UIForceTouchCapabilityAvailable) {
          // 为了更直观的阅读代码 这里分成两行写
          UIApplicationShortcutIcon *historyIcon;
          historyIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"shortcut_history"];
          UIApplicationShortcutItem *historyItem = [[UIApplicationShortcutItem alloc]
                                                    initWithType:@"history"
                                                    localizedTitle:@"历史记录"
                                                    localizedSubtitle:nil
                                                    icon:historyIcon
                                                    userInfo:nil];

           // 为了更直观的阅读代码 这里分成两行写
          UIApplicationShortcutIcon *downloadIcom;
          downloadIcom = [UIApplicationShortcutIcon iconWithTemplateImageName:@"shortcut_download"];
          UIApplicationShortcutItem *downloadItem = [[UIApplicationShortcutItem alloc]
                                                     initWithType:@"download"
                                                     localizedTitle:@"查看下载"
                                                     localizedSubtitle:nil
                                                     icon:downloadIcom
                                                     userInfo:nil];

          application.shortcutItems = @[historyItem, downloadItem];
    }
}

关于Quick Action 中 item 的点击事件 回调响应

- (void)application:(UIApplication *)application 
           performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem     
           completionHandler:(void (^)(BOOL))completionHandler {

}

我可以从 shortcutItem 的 type 和 userinfo 来做不同的事件处理
而最后的 completionHandler 在 API 的说明中我们看到当应用并非在后台
而是直接重新开进程的时候,会直接返回NO 这样的话我们的回调会放在

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

这时候 UIApplication 刚好提供了一个可以从 launchOptions 这个字典中
获取到 shortcutItem 的 key UIApplicationLaunchOptionsShortcutItemKey
有了这个Key 我们就可以处理不同的事件

UIApplicationShortcutItem *item;  // 为了更直观的阅读代码 这里分成两行写
item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];

这样我们根据获取到不同的 Action Item 来处理不同的事件
在 performActionForShortcutItem 回调中

- (void)application:(UIApplication *)application 
        performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
        completionHandler:(void(^)(BOOL succeeded))completionHandler  
{
        if ([shortcutItem.type isEqualToString:@"history"]) {
            NSLog(@"历史记录");
        }else if ([shortcutItem.type isEqualToString:@"download"]){
            NSLog(@"查看下载");
        }
        if (completionHandler) { 
              completionHandler(YES); 
        }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS中,我们可以使用Action Extension来扩展应用程序的功能。Action Extension是一种允许用户在其他应用程序中执行特定操作的扩展,例如分享内容、保存信息等。 要创建Action Extension扩展,可以按照以下步骤进行操作: 1. 在Xcode中打开你的应用程序项目。 2. 在左侧导航栏中选择项目的名称,打开项目设置。 3. 在顶部菜单栏中选择"Target"。 4. 点击页面下方的"+"按钮,选择"Action Extension"作为新的目标。 5. 输入Extension的名称,例如"ShareExtension",然后点击"Finish"。 6. Xcode会自动生成一些默认的文件和设置,你可以根据需求进行修改。 7. 打开"Info.plist"文件,配置Action Extension的一些基本信息,例如名称、图标等。 8. 在Action Extension的代码文件中,你可以获取分享的内容,并进行相应的处理。 9. 你还可以在Action Extension中添加自定义的界面,使用户能够更方便地进行操作。 10. 编译并运行你的应用程序,可以选择其他应用程序中的内容,然后在分享菜单中找到你的Action Extension,执行相应的操作。 需要注意的是,为了使Action Extension正常工作,还需要在应用程序设置中配置一些权限和共享数据的支持。你可以在"Capabilities"选项卡中设置对应的权限和所需的共享数据类型。 创建Action Extension后,你可以将其与应用程序打包在一起分发,用户可以通过在其他应用程序中选择分享菜单来使用你的Action Extension。 总的来说,创建iOS中的Action Extension扩展是一个相对简单的过程,通过使用Action Extension,你可以方便地为你的应用程序提供更多的功能和交互方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值