Sketch插件如何架构

Sketch插件跟我们平时用得比较多的Chrome插件类似,都是可以调用容器提供的API来实现各种个样的能力。

Sketch的强大之处在于,它可以调用OSX系统级别的API。这个也就是我之前的文字提到过(《用CMake打包一个Sketch插件FrameWork》),为什么需要开发Sketch插件的时候需要研发一套动态库来支持能力拓展。

本文不是针对新手Sketch插件开发者的入门,需要了解架构原理,需要一些Sketch插件开发的基础。

技术选型

native or webview

native有优势主要体现在交互体验好,webview则是学习曲线平滑,开发迭代效率快。

对比nativewebview体验好✔快速迭代✔学习曲线低✔热更新✔

作为一个产品的架构师,我们需要从3个方面去分析产品的架构生命周期:体验: 良好的产品体验可以帮我们提升用户的粘性。

开发效率:快速迭代抢先占领市场才能抢得先机。

维护成本:产品上线,人员流动也是市场规律,需要保证新成员能快速上项目。

UiwebView or WkWebView

webview的好处前面我们已经分析过了。具体是选项 UiwebView 还是 WkWebView,我们也需要斟酌下。 UiwebView带给我们的好处主要是开发模式简单,同步的开发流程让架构设计更简单。

const webViewClass = {

'webView:didCreateJavaScriptContext:forFrame:': (view) => {

view.windowScriptObject().setValue_forKey(wrap({

getName() {

return 'zobor'

},

}), 'Demo');

},

}

JSAPI的用户则是这样:

window.Demo.getName();

WkWebView才是未来,苹果推出它就是为了接替UiwebView的:更安全

支持更多新功能,比如PWA

性能更好

WkWebView推出Delegate模式:

const WebScriptHandlerClass = {

'userContentController:didReceiveScriptMessage:': (_, msg) => {

const jsonData = NSJSONSerialization.dataWithJSONObject_options_error(

msg.body(), 0, null,

);

const nsstring = NSString.alloc().initWithData_encoding(jsonData, NSUTF8StringEncoding);

const webParams = JSON.parse(`${nsstring}`);

console.log(webParams);

},

};

const wkwebviewConfig = WKWebViewConfiguration.alloc().init();

const messageDelegate = ObjCClass(WebScriptHandlerClass).new();

const webView = WKWebView

.alloc()

.initWithFrame_configuration(

CGRectMake(0, 0, 300, 600),

wkwebviewConfig,

);

webView.configuration()

.userContentController()

.addScriptMessageHandler_name(messageDelegate, 'DemoMessage');

然后我们的JSAPI就是这样的:

window.webkit.messageHandlers.DemoMessage.postMessage({

name: 'zobor',

});

postMessage就有个问题了,WkWebView内核该怎么回调webview呢? 我们是通过webView.evaluateJavaScript_completionHandler(script, nil);来实现的,有点像jQuery的Ajax方法回调函数的写法。

JSAPI的设计

内核和UI交互搭建好了,接下来需要提供接口能力。 例如如先实现一下获取Sketch的文档ID的接口: api-document.js

const Sketch = require('sketch');

const DocumentAPI = {

getDocuments() {

const docs = Sketch.getDocuments();

const ret = [];

docs.forEach((doc) => {

if (doc.sketchObject) {

ret.push(doc.sketchObject);

}

});

return ret;

},

getDocument() {

return this.getDocuments()[0];

},

getDocumentID() {

return `${this.getDocument().documentData().objectID()}`;

},

};

API定义好了,接下来需要跟WKWebView的ScriptMessage提供映射.

const DocumentAPI = require('./api-document');

const WebScriptHandlerClass = {

'userContentController:didReceiveScriptMessage:': (_, msg) => {

const jsonData = NSJSONSerialization.dataWithJSONObject_options_error(

msg.body(), 0, null,

);

const nsstring = NSString.alloc().initWithData_encoding(jsonData, NSUTF8StringEncoding);

const webParams = JSON.parse(`${nsstring}`);

console.log(webParams);

const { apiName, apiParams, callbackFn } = webParams;

const rs = DocumentAPI[apiName](apiParams);

const script = NSString.stringWithFormat('window.%@(%@)', callbackFn, rs);

webView.evaluateJavaScript_completionHandler(script, nil);

},

};

能力拓展

JS API的问题也是比较明显的,Sketch官方的JS API能力比较有限,比如我们经常会用到的curl,需要我们自己去实现。 从WKWebView到Sketch JSAPI,再到MacOs系统接口,我们的架构能力是完善了。 怎么写Sketch的插件拓展? 首先思路是通过Objective-C or Swift去编译一个FrameWork库,然后Sketch Plugin可以去Load这个库。

const loadFramework = _mocha.loadFrameworkWithName_inDirectory_('Demo', frameworkPath);

// 加载成功,会在Sketch的context上注册一个对象,对象名称是OC 定义的Class// 例如:DMOHttp,有一个get 方法const data = DMOHttp.get(url);

console.log(data);

总结

WKWebview+JSAPI的架构带来的好处是快速迭代 + 高效的开发效率,对此架构模式感兴趣的朋友可以联系我一起探讨.

jsapi设计_Sketch插件如何架构相关推荐

  1. 插件式架构设计实践:插件式系统架构设计简介

    本系列博文将使用微软RIA技术解决方案Silverlight以及扩展性管理框架Managed Extensibility Framework(MEF),以插件式架构设计为导线,分享本人在从事基于微软S ...

  2. 插件式架构设计实践一:插件式系统架构设计简介

    本系列博文将使用微软RIA技术解决方案Silverlight以及扩展性管理框架Managed Extensibility Framework(MEF),以插件式架构设计为导线,分享本人在从事基于微软S ...

  3. 【设计】1359- Umi3 如何实现插件化架构

    插件化架构 插件化架构(Plug-in Architecture),也被称为微内核架构(Microkernel Architecture),是一种面向功能进行拆分的可扩展性架构,在如今的许多前端主流框 ...

  4. 技术期刊 · 路尘终见泰山平 | 微前端及插件化架构在 Wix 的实践;编辑器架构的第二路径;业务中的前端组件化体系……

    蒲公英 · JELLY技术期刊 Vol.47 不想当架构师的程序员不是"合格"的程序员?这一类的言论在很多文章中应该很常见吧,我们需要架构思维,要有抽象能力,要学会分层--需要的太 ...

  5. 记录梦幻手游PC端辅助开发及设计思路之整体架构

    设计思路和整体架构 设计初衷: 梦幻西游手游是一个回合制游戏,手动做任务重复性太多,每天做相同的日常任务毫无乐趣,且消耗时间.目前网络上大部分辅助都要收费,收费也不是很贵,如果是为了玩游戏建议尊重作者 ...

  6. CAD插件-幕墙设计常用插件sama整理

    CAD插件-幕墙设计常用插件sama整理 SWF画弧形焊缝.LSP 标注多段线-(边长A1.对角线A2.角度A3)LSP 尺寸整理(修正)LSP 对齐afLSP 多段线顶点布块-(xxp)LSP 计算 ...

  7. 前端进阶:跟着开源项目学习插件化架构

    一.微内核架构简介 1. 1 微内核的概念 微内核架构(Microkernel Architecture),有时也被称为插件化架构(Plug-in Architecture),是一种面向功能进行拆分的 ...

  8. 大型 Web 应用插件化架构探索

    简介:随着 Web 技术的逐渐成熟,越来越多的应用架构趋向于复杂,例如阿里云等巨型控制台项目,每个产品下都有各自的团队来负责维护和迭代.不论是维护还是发布以及管控成本都随着业务体量的增长而逐渐不可控. ...

  9. [短彩信]C#短彩信模块开发设计(1)——架构

    准备从以下几个方面简单的谈谈短彩信模块的实现: [短彩信]C#短彩信模块开发设计(1)--架构(http://www.cnblogs.com/CopyPaster/archive/2012/12/07 ...

最新文章

  1. Orecle基本概述(2)
  2. java poi生成excel文件_java poi 导出Excel文件
  3. 远程服务器,你不得不知道的命令行操作(一)
  4. Consecutive Sum LightOJ - 1269(区间异或和)
  5. python实现一对一聊天_vue+django实现一对一聊天功能
  6. 初识php的笔记(基础知识)
  7. 标准h5的定位_不但亲民还安全 红旗H5车门/防撞梁拆解
  8. 周期(KMP算法之Next数组的性质)
  9. 销售订单获取不到即时库存
  10. 整人代码大集合/不要乱使用!
  11. java javac 以及 javaw
  12. android 问题-----Please execute 'adb uninstall com.newland.securityclient' in a shell.
  13. PHP中的日期相减函数,在php中有没有日期相减的函数
  14. docker安装,阿里云镜像配置
  15. 微信小程序有哪些优点和价值
  16. SQL笔试:Student学生表,Course 课程表,Sc选课表
  17. Studing Day3 - python基础3
  18. faiss(2):理解product quantization算法
  19. web入门 命令执行 web29-web41
  20. esp8266之Arduino的mqtt客户端远程继电器控制,断电重连、断网重连,断mqtt服务器重连

热门文章

  1. (4.6.14)android 插桩基本概念plugging or Swap
  2. 多个pdf如何快速合并成一个?
  3. 2018年的第一篇文章(福利篇)
  4. web 中怎么实现斜线表头效果?
  5. web前端培训班有哪些
  6. PS油画特效插件AKVIS Artwork for mac
  7. 强哥说Java--Java接口,java高级软件工程师试卷
  8. ViPR和DJ领跑软件定义存储
  9. HTML教程(8)-播放音乐
  10. hotnets2018 Networking in Heaven as on Earth 阅读报告