【iOS扩展开发攻略】Action Extension

Unity动态加载Texture2D全攻略:从本地到网络,原理、实战与性能优化 在Unity开发中,资源管理是核心课题,而纹理(Texture)作为最常用的资源类型之一,其高效加载直接影响应用性能与用户体验。动态加载技术允许开发者在运行时按需加载图片资源,而非在启动时全部载入,这能显著优化内存占用、提升加载速度,并为热更新奠定基础。其技术原理涉及从文件字节流解码为像素数据,并创建为GPU可用的Texture2D对象。在工程实践中,开发者需根据资源来源(如本地StreamingAssets、Resources或远程服务器)选择不同API,并妥善处理平台差异、异步操作与内存管理。针对网络加 阅读详情

上一篇《iOS扩展开发攻略:Share Extension》介绍了分享扩展的开发与使用,本篇主要还是讲述在系统分享菜单中最底下一栏的功能扩展:Action Extension,该扩展跟Share Extension实现比较类似只是在使用场景上进行了区分,Share Extension主要用于将Host应用中的内容分享到Container应用中,而Action Extension则主要用于将Host应用中的内容进行对应处理,原则上来说作用范围比Share Extension要广。

那么,下面将详细讲解开发Action Extension具体的操作步骤:

1. 创建Action Extension扩展Target

1、打开项目设置,在TARGETS侧栏地下点击“+”号来创建一个新的Target,如图:
创建Target

2、然后选择”iOS” -> “Application Extension” -> “Action Extension”,点击“Next”。如图:

选择扩展类型

3、给扩展起个名字,这里填写了“Action”,然后要注意Action Type这里有两个选项:** Presents User Interface 和 No User Interface **。前者是触发扩展后会弹出一个UI界面,后者是不带界面的扩展。这里我会分两部分进行讲解,先从无UI的扩展开始,所以选择了No User Interface,点解Finish完成创建。如图:

填写扩展相关属性

4、这时候会提示创建一个Scheme,点击“Activate”。如图:

创建Scheme

一个无UI的Action Extension Target到此已经创建完成了。下面先来看一下新建的扩展结构,如下图所示:

扩展的文件组织结构

扩展的文件组织结构描述如下:

文件 说明
ActionRequestHandler.h 扩展处理类的头文件,对处理类型的声明描述。
ActionRequestHandler.m 扩展处理类的实现文件,处理扩展实际的业务逻辑。
Action.js 与Web也进行交互的脚本,后续会详细介绍它的作用。
Info.plist 扩展的配置文件

先Command+R编译运行默认的扩展来看一下实际效果。

演示效果图1

演示效果图2

可以看到在弹出的分享菜单的底下一栏多了一个叫Action的小图标(演示图1),并且点击后网页的背景颜色变成红色(演示图2)。下面将对这个例子进行详细的讲解。

2. 分析扩展例子代码

先打开ActionRequestHandler.h头文件,可以看到扩展的处理类ActionRequestHandler的定义,代码如下:

@interface ActionRequestHandler : NSObject <NSExtensionRequestHandling>

@end

上面的类型实现了一个NSExtensionRequestHandling的协议。这也是无UI的扩展对象必须要实现的协议,否则无法向处理类返回正确的回调。我们可以看一下协议的声明:

@protocol NSExtensionRequestHandling <NSObject>

@required

- (void)beginRequestWithExtensionContext:(NSExtensionContext*)context;

@end

协议只有一个方法beginRequestWithExtensionContext:,就是点击扩展图标的时候就会触发这个方法,并将扩展的上下文作为参数进行回调(关于NSExtensionContext相关内容在《iOS扩展开发攻略:Share Extension》有讲述)。所以无UI的扩展相对来说比较简单,只要实现这个方法的处理即可。下面就来看一下例子中的.m文件是怎么处理的。

- (void)beginRequestWithExtensionContext:(NSExtensionContext *)context {
   
   
    // Do not call super in an Action extension with no user interface
    self.extensionContext = context;
    
    BOOL found = NO;
    
    // Find the item containing the results from the JavaScript preprocessing.
    for (NSExtensionItem *item in self.extensionContext.inputItems) {
   
   
        for (NSItemProvider *itemProvider in item.attachments) {
   
   
            if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypePropertyList]) {
   
   
                [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypePropertyList options:nil completionHandler:^(NSDictionary *dictionary, NSError *error) {
   
   
                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
   
   
                        [self itemLoadCompletedWithPreprocessingResults:dictionary[NSExtensionJavaScriptPreprocessingResultsKey]];
                    }];
                }];
                found = YES;
            }
            break;
        }
        if (found) {
   
   
            break;
        }
    }
    
    if (!found) {
   
   
        // We did not find anything
        [self doneWithResults:nil];
    }
}

从上面代码可知,扩展是通过匹配上下文(NSExtensionContext)的inputItem的附件(attachment)类型是否为PropertyList。然后再通过loadItemForTypeIdentifier方法加载附件后进行相应的处理(关于NSExtensionItem相关内容在《iOS扩展开发攻略:Share Extension》有讲述)。其中处理方法itemLoadCompletedWithPreprocessingResults代码如下:

- (void)itemLoadCompletedWithPreprocessingResults:(NSDictionary *)javaScriptPreprocessingResults {
   
   
    if ([javaScriptPreprocessingResults[@"currentBackgroundColor"] length] == 0) {
   
   
        // No specific background color? Request setting the background to red.
        [self doneWithResults:@<
扩展你的App:Xcode中App Extensions的深度指南 是iOS系统中的一种机制,允许App执行特定的任务,并与其他App共享功能。用户甚至可以在不打开你的App的情况下,直接通过系统界面或其它App来使用这些功能。App Extensions是iOS开发中一项强大的功能,它允许开发者扩展App的功能,与系统和其他App更紧密地集成。通过本文的介绍和示例代码,读者应该对如何在Xcode中使用App Extensions有了更深入的理解。掌握App Extensions的使用,将有助于提升你的App的用户体验和功能性。 阅读详情

相关推荐

iOS App Extensions之Action Extension

iOS App Extensions之Action Extension创建Action Extension扩展无界面`No User Interface `内容配置`info.plist`分析扩展例子代码与Safari中的网页进行交互文件的分享实现有界面`Presents User Interface`内容配置`info.plist`分析ActionViewController自定义UI配置数据共享跳转到容器App不显示界面直接跳转到容器App 创建Action Extension扩展 在原有的项目里,添

wahkim的博客 3442

iOS 8 Action扩展实战教程:文件解压功能开发

本文还有配套的精品资源,点击获取 简介:在iOS 8及更高版本中,Action扩展提供了一种在系统级别为用户提供额外操作的方法。本教程将深入介绍如何开发一个解压ZIP文件的Action扩展,包括创建扩展目标、实现解压逻辑、处理输入数据、UI设计、权限管理和测试发布等关键步骤。通过实战演练,开发者可以学习如何创建实用的Action扩展,增强应用的集成性和用户体验。 ...

weixin_35835018的博客 1194

SampleActionExtensionApp:一个简单的 iOS 8 动作扩展,可以读取任何文本

Tuts+ 教程:iOS 8:如何构建一个简单的动作扩展 指导教师:Lukáš Petr 您对 iOS 8 中的扩展感到兴奋吗? 想了解如何为您自己的 iOS 应用程序构建扩展程序? 然后加入我们这个简单的教程,让您快速了解 Action 扩展! 我们将从头开始构建一个简单的应用程序和扩展程序,并引导您完成整个过程,以便您可以开始尝试自己的想法。 即将在 Tuts+ 上提供

IOS如何在Host App 与 App Extension 之间发送通知

如何从你的一个App发送通知给另一个App? (例:搜狗输入法下载皮肤完成后使用皮肤) 注:搜狗输入法是App、而键盘是Extension 当你为你的App 添加 App Extension时,如果想在App 发送通知给 Extension或许这篇文章可以帮助你。 了解更多内容 // 发送通知 - (void)postNotificaiton { CFNotificationCenterRef notification = CFNotificationCenterGetDarwinNotifyCenter (); CFNotificationCenterPostNotification

开关电源PCB安规设计避坑指南:从光耦开槽到变压器挡墙,这些细节决定认证成败

本文深入解析开关电源PCB安规设计中的关键细节,包括光耦开槽、变压器挡墙工艺等12个致命要点。通过实际案例和工艺参数表,揭示如何避免认证失败,特别强调爬电距离和电气间隙的精确控制,助力工程师提升产品安全性和认证通过率。

weixin_42548893的博客 205

Python爬虫实战:5分钟搞定东方财富网股票数据抓取(附完整代码)

本文详细介绍了如何利用Python爬虫技术,快速抓取东方财富网的实时股票数据。通过逆向分析其JSONP数据接口,构建了包含请求处理、数据清洗、分页调度及多格式存储的完整自动化采集系统,并提供了应对反爬策略与生产部署的进阶优化思路,附有可直接运行的完整代码。

weixin_29084231的博客 875

从理论到实践:全面解析Cmk(设备能力指数)的应用与优化

本文全面解析了设备能力指数Cmk的核心概念、计算逻辑与关键应用场景。Cmk作为衡量设备本身固有加工能力的黄金标准,在设备验收、大修后验证及过程能力根因分析中至关重要。文章通过实战案例,详细阐述了执行Cmk测试的“五大固定”黄金法则、数据计算分析方法,并提供了Cmk不达标时的系统性排查与优化策略,帮助制造企业实现预防性质量管理。

jump7的博客 526

AI自瞄原理剖析(四)从Yolo推理坐标到屏幕坐标:基于FOV视角与焦距的坐标变换与精准瞄准

从Yolo推理框架得到的坐标到屏幕坐标的转换是一个涉及到FOV视角、焦距以及分辨率的复杂过程。通过数学公式,我们可以将推理框坐标反推为游戏内的实际坐标,并最终映射到屏幕坐标系中。利用这些信息,AI自瞄系统能够精确计算出准星从当前位置移动到敌人位置的距离,实现精准的自动瞄准。通过这种方法,AI自瞄系统能够在不同的游戏环境下灵活应对,提供高度精确的操作体验。在AI自瞄系统中,目标检测仅仅是第一步,获取到预测框的坐标后,我们还需要将这些坐标转换为实际屏幕上的精确位置。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1334

信捷PLC XD5系列运动控制(10轴)编程应用篇

项目PLC采用XD5-60T10-E,36DI 24DO 晶体管输出,支持10路脉冲输出功能。TMR指令定时器时基可以自己设定,这点比其他品牌PLC方便。ZRN指令我们需要上升沿指令触发。 5、变址寻址 该说不说这个变址寻址是真的强,比西门子指针、三菱的变址寄存器Z 、V都要更加灵活。 7、特殊寄存器:时钟 8、如何建立PLC通讯...............

RXXW_Dor的博客 1万+

2026.1.11:WSL2中Ubuntu发行版的完全卸载干净指南

摘要:本文详细介绍在WSL2中彻底卸载Ubuntu发行版的步骤。首先通过wsl -l -v确认安装的发行版,使用wsl --terminate终止运行后,推荐使用wsl --unregister命令完全删除发行版(包括所有数据)。还可手动检查残留文件位置(如%LOCALAPPDATA%目录),并提供了备份建议(使用wsl --export)。最后说明验证卸载的方法和可选的高级重置操作。整个过程确保彻底清理相关数据并释放磁盘空间。(

拥抱具身智能,昇腾Ascend C 2396

uniApp微信小程序:error: 60001 request:fail errcode:-101 cronet error code:-101error_msg:net::ERR CONNECTI

uni-app微信小程序域名访问报error 60001 request:fail errcode:-101,解决Uniapp微信小程序报600001错误,uni.request()接口请求报错,服务器更换SSL证书后,uniapp微信小程序出现`request:fail errcode:-101`问题分析与解决,服务器更换ssl证书后,手机访问微信小程序异常,微信小程序更换SSL证书后出现请求报错,服务器更换SSL证书,微信小程序报600001,小程序反应偶尔出现request:fail errcode:

✅ 精选推荐文章 4583

化工设备设计软件:PVELITE二次开发_(12).数据导入导出与兼容性

在数据导入之前,需要定义数据在PVELITE中的结构。可以通过编程接口定义字段名称和数据类型。# 导入必要的库 import pvelite # 创建PVELITE实例 pve = pvelite . PVELITE() # 定义CSV数据结构 csv_structure = {

kkchenjj的博客 1216

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

上一篇: 【iOS扩展开发攻略】Share Extension
下一篇: 【程序员觉醒】五大基础属性修行
杰嗒嗒的阿杰
博客等级 码龄15年 17粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值