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 &gt;= $extensionItem.attachments.@count
).@count &gt;= 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脚本相关推荐

  1. Kettle的使用分享~动态参数~JS脚本~多文本文件输入

    Kettle设置参数 通过js脚本设置参数变量并进行赋值,让参数变得可动态变化,便于后期定时任务的执行 生成记录 添加一个"输入->生成记录"对象,用于变量的声明 javas ...

  2. js 条件语句控制html,如何避免在JS脚本上过多使用 if 语句?(技巧分享)

    如何避免在JS脚本上过多使用 if 语句?本篇文章给大家分享一些方法来我们在 JS 中过多的使用 if 语句.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 最近在重构代码时,我发现 ...

  3. JS脚本调起小狐狸MetaMask浏览器扩展插件解锁

    JS脚本调起小狐狸MetaMask浏览器扩展插件解锁 直接F12在控制台运行js脚本,适用比如Selenium.Playwright.Puppeteer等自动化框架解锁钱包 好用的话,记得点个赞夸夸我 ...

  4. 分享一个简单的抢购华为商城手机的js脚本,仅供学习交流

    function rewrite(current) {fr4me = '<frameset cols=\'*\'>\n<frame src=\'' + current + '\'/& ...

  5. Alook搭配JS脚本完美食用

    点击蓝字关注我们 一起玩耍 「Alook」一款iOS端优良的阅读器, 货真价实的"三无产品" 软件咱们也引荐过很屡次啦- emm- 你认为我明天要把从前的推文翻出来水一期? 不,明 ...

  6. JS脚本与服务器交互完成业务处理

    最近一直在做关于调用客户端本地的DLL与服务器进行进行协作交互的工作,这里的难点在于与客户端DLL的交互并不是一次性的完成,通常情况下需要实现"在客户端开始事务,在服务器开始事务,在客户端提 ...

  7. 通过自制js脚本屏蔽网页元素

    现如今各类网站已经成为我们日常生活获取信息的一个重要渠道,与此同时,网站上往往也充斥着很多我们不需要的信息,这里通过这篇文章分享下如何通过自制js脚本来屏蔽平时咱们不想看到的网站元素: 这里就以咱们c ...

  8. 运行js_最新双十一喵币自动领取方法,安卓手机通过js脚本完美运行

    哈喽大家好小编呢,昨天分享了一些喵币的自动脚本,不过很多人今天反应会出现红字错误,例如提示你系统繁忙,请稍后再试了.至于什么原因呢,小编也没有找到,不过那我们可以给他pass掉了,因为今天早上又找到了 ...

  9. node redis集群_如何使用集群扩展Node.js服务器

    node redis集群 by Michele Riva 由Michele Riva 如何使用集群扩展Node.js服务器 (How to scale your Node.js server usin ...

最新文章

  1. javascrip python_Python之Javascript
  2. DPDK uio驱动实现(二十)
  3. 【Windows 逆向】OD 调试器工具 ( OD 工具简介 | OD 工具与 CE 工具对比 )
  4. hadoop综述_Hadoop书籍赠品–综述
  5. Python中的for in if 用法
  6. 编译fdk-aac for ios
  7. 【刷题】LOJ 6007 「网络流 24 题」方格取数
  8. win7装xp双系统_9102年还用XP是怎样的体验?告诉你XP凉得有多透
  9. 华为ensp静态路由配置
  10. UnionID与OpenID的区别【转自微信官方文档】
  11. Excel VBA 操作 Word(入门篇)
  12. 如何给计算机c盘加内存,电脑C盘内存太小_这个方法教你扩大C盘空间 - 驱动管家...
  13. 生命力最强的新闻,放到二十年后依旧是新闻
  14. android dlna uri,android DLNA投屏
  15. C# WPF新版开源控件库:Newbeecoder.UI
  16. 【FATE】==在Docker中部署FATE——单机版==
  17. 基于 MySQL Binlog 的 Elasticsearch 数据同步实践 原
  18. 51单片机直流电机PID速度控制正反转控制(红外光电测速)LCD1602 L298N
  19. 微信最近点赞拿东西服务器,微信朋友圈点赞说明什么?点赞的行为背后隐藏着什么含义呢?...
  20. ioncube 加密项目本地搭建

热门文章

  1. DoubleViewPager
  2. Android类库打包方法探究
  3. php 派生类 数据库连接 单例模式 xhprof实测 高效连接
  4. oracle数据库同步交换的方法
  5. 大型网站架构演变和知识体系
  6. iOS APP提交上架最新流程
  7. Ubantu安装maven
  8. 阿里云服务器ECS配置LNMP
  9. 怎样合理的将多个字符串拼接为一个字符串
  10. [CTO札记]从技术走向商业的3级转变