IOS分享扩展使用JS脚本
2019独角兽企业重金招聘Python工程师标准>>>
实现一个分享扩展插件,功能是从Safari网页中截取当前网页的图片内容
基本的步骤总结在下面:
1.创建一个JS文件,命名为MyJavascriptFile.js,文件的功能是解析safari网页内容,获取到网页中的所有图片节点,解析从图片的URL,返回所有图片URL拼接而成的字符串。
JS中主要用到run: function(arguments){}这个方法来处理抓取数据的逻辑,处理抓取到的数据调用 arguments.completionFunction({ "webImages": imageArrStr }); 这个方法把数据返回,"webImages"这个key可以自定义,在第三步的原生层OC代码中需要用到这个key把JS层抓取到的数据取出来,然后可以对这些图片数据进行保存、上传等需要的操作了。
MyJavascriptFile.js文件内容
var BuscapeClass = function() {};BuscapeClass.prototype = {run: function(arguments) {var imageArray = new Array();var objs = document.getElementsByTagName("img");for(var i=0;i<objs.length;i++){if(imageArray.indexOf(objs[i].src) == -1){imageArray.push(objs[i].src);}}var imageArrStr = imageArray.join('+');// Pass the baseURI of the webpage to the extension.arguments.completionFunction({ "webImages": imageArrStr });},// Note that the finalize function is only available in iOS.finalize: function(arguments) {// arguments contains the value the extension provides in [NSExtensionContext completeRequestReturningItems:completion:].// In this example, the extension provides a color as a returning item.// document.body.style.backgroundColor = arguments["bgColor"];var bestOffer = arguments["bestOffer"];alert("A melhor oferta é da loja\n" + bestOffer["sellername"] + " por " + bestOffer["price"]);}
};// The JavaScript file must contain a global object named "ExtensionPreprocessingJS".
var ExtensionPreprocessingJS = new BuscapeClass;
2.在info.plis文件中把创建的JS文件进行配置,配置如下:
配置的源码
<key>NSExtension</key><dict><key>NSExtensionAttributes</key><dict><key>NSExtensionActivationRule</key><string>SUBQUERY (extensionItems,$extensionItem,SUBQUERY ($extensionItem.attachments,$attachment,(ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url"|| ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image"|| ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.plain-text")).@count >= $extensionItem.attachments.@count
).@count >= 1</string><key>NSExtensionJavaScriptPreprocessingFile</key><string>MyJavascriptFile</string></dict><key>NSExtensionMainStoryboard</key><string>MainInterface</string><key>NSExtensionPointIdentifier</key><string>com.apple.share-services</string></dict>
3.原生层OC代码中处理JS抓取的数据,主要用到这两句,把数据取出来"webImages"这个key要和JS中定义的KEY一致
NSDictionary *results = jsDict[NSExtensionJavaScriptPreprocessingResultsKey];
NSString* result = [results objectForKey:@"webImages"];
完整的处理代码
- (void)fetchDataFromWebContent {__weak typeof(self) weakSelf = self;//获取inputItems,在这里itemProvider是你要分享的图片NSArray* extensionItems = self.extensionContext.inputItems;for (NSExtensionItem *extensionItem in extensionItems) {NSMutableArray* tmpTypeImageArr = [NSMutableArray array];NSMutableArray* tmpTypePropertyListArr = [NSMutableArray array];NSArray* attachments = extensionItem.attachments;// 处理attachmentsfor (NSItemProvider *itemProvider in attachments) {// 注入JS获取图片数据数据if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypePropertyList]) {[itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypePropertyList options:nil completionHandler:^(NSDictionary *jsDict, NSError *error) {NSLog(@"jsDict: %@", jsDict);dispatch_async(dispatch_get_main_queue(), ^{// Get javascript resultNSDictionary *results = jsDict[NSExtensionJavaScriptPreprocessingResultsKey];NSString* result = [results objectForKey:@"webImages"];BMLog(@"=== webImages ===%@", result);NSArray* tmpArr = [weakSelf handleImages:result];if (tmpArr.count > 0) {[tmpTypePropertyListArr addObjectsFromArray:tmpArr];}[weakSelf handleResult:tmpTypePropertyListArr];});}];}}}
}- (NSArray*)handleImages:(NSString*)imagesStr {NSMutableArray* mUrlArray = [NSMutableArray arrayWithArray:[imagesStr componentsSeparatedByString:@"+"]];NSMutableArray* tmpUrls = [NSMutableArray array];for (int i = mUrlArray.count-1; i>=0; i--) {NSString* url = mUrlArray[i];// 过滤空的和jpg的图像if (![url isEmptyOrWhitespace]) {// 在这里处理图片的URL}}NSLog(@"mUrlArray = %@ tmpUrls = %@", mUrlArray, tmpUrls);return tmpUrls;
}
参考资料:
App Extension Programming Guide
转载于:https://my.oschina.net/FEEDFACF/blog/831717
IOS分享扩展使用JS脚本相关推荐
- Kettle的使用分享~动态参数~JS脚本~多文本文件输入
Kettle设置参数 通过js脚本设置参数变量并进行赋值,让参数变得可动态变化,便于后期定时任务的执行 生成记录 添加一个"输入->生成记录"对象,用于变量的声明 javas ...
- js 条件语句控制html,如何避免在JS脚本上过多使用 if 语句?(技巧分享)
如何避免在JS脚本上过多使用 if 语句?本篇文章给大家分享一些方法来我们在 JS 中过多的使用 if 语句.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 最近在重构代码时,我发现 ...
- JS脚本调起小狐狸MetaMask浏览器扩展插件解锁
JS脚本调起小狐狸MetaMask浏览器扩展插件解锁 直接F12在控制台运行js脚本,适用比如Selenium.Playwright.Puppeteer等自动化框架解锁钱包 好用的话,记得点个赞夸夸我 ...
- 分享一个简单的抢购华为商城手机的js脚本,仅供学习交流
function rewrite(current) {fr4me = '<frameset cols=\'*\'>\n<frame src=\'' + current + '\'/& ...
- Alook搭配JS脚本完美食用
点击蓝字关注我们 一起玩耍 「Alook」一款iOS端优良的阅读器, 货真价实的"三无产品" 软件咱们也引荐过很屡次啦- emm- 你认为我明天要把从前的推文翻出来水一期? 不,明 ...
- JS脚本与服务器交互完成业务处理
最近一直在做关于调用客户端本地的DLL与服务器进行进行协作交互的工作,这里的难点在于与客户端DLL的交互并不是一次性的完成,通常情况下需要实现"在客户端开始事务,在服务器开始事务,在客户端提 ...
- 通过自制js脚本屏蔽网页元素
现如今各类网站已经成为我们日常生活获取信息的一个重要渠道,与此同时,网站上往往也充斥着很多我们不需要的信息,这里通过这篇文章分享下如何通过自制js脚本来屏蔽平时咱们不想看到的网站元素: 这里就以咱们c ...
- 运行js_最新双十一喵币自动领取方法,安卓手机通过js脚本完美运行
哈喽大家好小编呢,昨天分享了一些喵币的自动脚本,不过很多人今天反应会出现红字错误,例如提示你系统繁忙,请稍后再试了.至于什么原因呢,小编也没有找到,不过那我们可以给他pass掉了,因为今天早上又找到了 ...
- node redis集群_如何使用集群扩展Node.js服务器
node redis集群 by Michele Riva 由Michele Riva 如何使用集群扩展Node.js服务器 (How to scale your Node.js server usin ...
最新文章
- javascrip python_Python之Javascript
- DPDK uio驱动实现(二十)
- 【Windows 逆向】OD 调试器工具 ( OD 工具简介 | OD 工具与 CE 工具对比 )
- hadoop综述_Hadoop书籍赠品–综述
- Python中的for in if 用法
- 编译fdk-aac for ios
- 【刷题】LOJ 6007 「网络流 24 题」方格取数
- win7装xp双系统_9102年还用XP是怎样的体验?告诉你XP凉得有多透
- 华为ensp静态路由配置
- UnionID与OpenID的区别【转自微信官方文档】
- Excel VBA 操作 Word(入门篇)
- 如何给计算机c盘加内存,电脑C盘内存太小_这个方法教你扩大C盘空间 - 驱动管家...
- 生命力最强的新闻,放到二十年后依旧是新闻
- android dlna uri,android DLNA投屏
- C# WPF新版开源控件库:Newbeecoder.UI
- 【FATE】==在Docker中部署FATE——单机版==
- 基于 MySQL Binlog 的 Elasticsearch 数据同步实践 原
- 51单片机直流电机PID速度控制正反转控制(红外光电测速)LCD1602 L298N
- 微信最近点赞拿东西服务器,微信朋友圈点赞说明什么?点赞的行为背后隐藏着什么含义呢?...
- ioncube 加密项目本地搭建