ios scriptable 桌面小组件开发

ios 桌面小组件开发

最近抖音上看到很人在秀自己水果手机上华丽的小组件,但可恶的是并没有分享该如何实现.经过我一番探查,原来是ios14以后水果出了一个叫做scriptable的app,可以通过javascript来自己定制化开发小组件.

scriptable

描述

Automate iOS using JavaScript .官网地址

特性

  1. 纯js编程,支持es6
  2. 通过js直接调用ios本机api,这样可以同一些本机程序进行交互来获取数据
  3. Siri快捷方式:从Siri快捷方式运行脚本。在Siri中展示表格、网站、HTML等。
  4. 完善的api文档
  5. 共享菜单集成:将 Scriptable 集成到 iOS 的共享菜单中。当在其他应用程序中选择共享选项时,可以选择 Scriptable,并将所选内容作为输入传递给脚本。
  6. 文件操作:Scriptable 提供了对文件系统的访问能力。您可以读取和写入文件,创建文件夹,管理文件和目录等。
  7. 用户界面:Scriptable 允许您创建简单的用户界面,以便与用户进行交互。您可以显示警报、菜单、文本输入框等,以便用户提供输入或进行选择。
  8. 支持回调函数,使用回调函数与其他app通信

使用

  1. scriptable的使用并不复杂,在appstore中可以直接下载
  2. 打开Scriptable,点击右上角 + 号,粘贴刚刚自动复制的代码,点击右下角 ▶ 运行 可以预览效果
  3. 长按桌面,添加组件,选择 Scriptable,然后点击组件配置,选择刚刚保存的脚本即可

Demo

// 判断是否是运行在桌面的组件中
if (config.runsInWidget) {
  // 创建一个显示元素列表的小部件
  // 显示元素列表的小部件。将小部件传递给 Script.setWidget() 将其显示在您的主屏幕上。
  // 请注意,小部件会定期刷新,小部件刷新的速率很大程度上取决于操作系统。
  // 另请注意,在小部件中运行脚本时存在内存限制。当使用太多内存时,小部件将崩溃并且无法正确呈现。
  const widget = new ListWidget();
  // 添加文本物件
  const text = widget.addText("Hello, World!");
  // 设置字体颜色
  text.textColor = new Color("#000000");
  // 设置字体大小
  text.font = Font.boldSystemFont(36);
  // 设置文字对齐方式
  text.centerAlignText();
  // 新建线性渐变物件
  const gradient = new LinearGradient();
  // 每种颜色的位置,每个位置应该是 0 到 1 范围内的值,并指示渐变colors数组中每种颜色的位置
  gradient.locations = [0, 1];
  // 渐变的颜色。locations颜色数组应包含与渐变属性相同数量的元素。
  gradient.colors = [new Color("#F5DB1A"), new Color("#F3B626")];
  // 把设置好的渐变色配置给显示元素列表的小部件背景
  widget.backgroundGradient = gradient;
  // 设置部件
  Script.setWidget(widget);
}

效果是这样的:

在这里插入图片描述

开发辅助

小件件开发框架

scriptable需要在手机上敲代码,像上面demo那种简单的例子还好,要是复杂点的,还是要借助框架在电脑上开发比较好(js大神当我没说)

小件件开发框架是一个便于开发者在电脑上开发、测试、预览 iOS 小组件(Scriptable)的开发框架

通过简单安装,就可以获得一个舒适的Scriptable脚本开发环境,支持语法高亮、自动补全、实时同步测试预览。不用再在手机上敲代码了!并且该开发框架封装了很多常用的操作接口,让开发者专注数据解析+小组件UI设计,大大节省开发时间!

小件件git地址

此框架搭建很简单,稍有前端开发经验的人都可以几分钟内搞定,之后按照readme.md中的提示一步一步操作就好了.每次在pc端写好代码ctrl+s保存后,代码就会同步到手机端.

stream抓包工具

如果想开发基于某个app的小组件,可能会使用到抓包工具,stream在app store中就可以下载而且使用简单.

成品

基于以上内容,同时模仿大神开发的已有小组件,做了一个bmw app的小组件,以后看车辆实时信息就不用点进去了,效果也是非常的炸裂

在这里插入图片描述

参考

  1. MangoGoing 用js玩转Scriptable,超简单教程
<think>好的,用户现在想了解如何在Scriptable中创建股票组件,特别是获取股票数据的示例代码。首先,我需要回忆一下Scriptable的基本功能和相关引用内容。根据引用[3],Scriptable是一个允许在iOS上运行JavaScript脚本的开源项目,支持自动化任务和创建桌面小组件,比如天气、股票信息等。用户提到的引用[2]也提到了定时抓取股票信息是典型应用场景之一。 接下来,我需要考虑用户的需求。用户可能对JavaScript和Scriptable有一定的基础,但需要具体的步骤和代码示例。需要确保提供的代码正确,并符合Scriptable的API使用方法。比如,使用http模块获取数据,然后解析并显示在小组件中。 首先,获取股票数据通常需要调用外部API。常见的免费API有Alpha Vantage或者Yahoo Finance,但需要注意API的可用性和是否需要API密钥。例如,Alpha Vantage需要注册获取API密钥,而Yahoo Finance可能有不同的接口。考虑到用户可能希望快速实现,可能需要选择一个无需API密钥的简单接口,比如Yahoo Finance的公开接口。 然后,构建小组件的UI部分。Scriptable的UI模块允许创建各种视图元素,比如列表、文本、图片等。需要设计一个简洁的界面来显示股票名称、当前价格、涨跌幅等信息。同时,要考虑小组件的不同尺寸(小、中、大),可能需要调整布局。 另外,缓存数据也是一个重要的点,因为频繁调用API可能导致速率限制或延迟。使用FileManager本地存储上一次的数据,可以在无法获取最新数据时显示缓存内容,提升用户体验。 还需要处理可能的错误,比如网络请求失败、数据解析错误等,添加try-catch块来捕获异常,避免小组件崩溃。 现在,整合这些步骤,编写示例代码。代码需要包括以下几个部分: 1. 配置股票代码和API URL。 2. 创建请求并获取数据。 3. 解析返回的数据(假设使用Yahoo Finance的API,可能需要解析JSON)。 4. 构建UI组件显示数据。 5. 处理缓存和错误情况。 6. 设置小组件参数,如背景颜色、刷新间隔等。 需要检查代码是否符合Scriptable的语法,比如正确使用async/await处理异步请求,使用正确的UI组件方法。此外,确保股票代码的输入格式正确,比如腾讯股票在港股是0700.HK,需要用户根据实际情况调整。 最后,生成相关问题,帮助用户进一步探索,比如如何优化数据更新频率、添加更多股票信息或更换API源。这些问题应该基于用户可能遇到的下一步挑战,或者常见的进阶需求。</think>### 使用Scriptable创建股票组件的分步教程 #### 1. 基本实现原理 Scriptable通过调用股票API获取实时数据,利用其内置的`ListWidget`或自定义UI组件展示信息。核心步骤包括: - **数据获取**:使用`http.get`方法调用股票API - **数据处理**:解析JSON格式的返回数据 - **界面构建**:通过`WidgetStack`、`WidgetText`等组件布局 - **定时刷新**:设置`refreshAfterDate`实现自动更新[^3] #### 2. 完整示例代码(支持沪深/港股/美股) ```javascript // 创建小组件实例 const widget = new ListWidget() widget.backgroundColor = new Color("#1C1C1E") try { // 配置参数 const stockCode = "0700.HK" // 示例:腾讯港股 const apiUrl = `https://finance.yahoo.com/quote/${stockCode}` // 发起网络请求 const request = new Request(apiUrl) const response = await request.loadString() // 使用正则表达式提取关键数据 const priceMatch = response.match(/regularMarketPrice":{"raw":([\d.]+)/) const changeMatch = response.match(/regularMarketChangePercent":{"raw":([\d.-]+)/) // 构建UI组件 const titleStack = widget.addStack() titleStack.addText("📈 腾讯控股") titleStack.addSpacer() const priceText = widget.addText(`当前价格:¥ ${priceMatch[1]}`) priceText.textColor = Color.yellow() priceText.font = Font.boldSystemFont(18) const changeValue = parseFloat(changeMatch[1]).toFixed(2) const changeText = widget.addText(`涨跌幅:${changeValue}%`) changeText.textColor = changeValue >= 0 ? Color.green() : Color.red() // 缓存数据 const cacheFile = FileManager.local().joinPath(FileManager.local().documentsDirectory(), "stock_cache.json") FileManager.local().writeString(cacheFile, JSON.stringify({ lastUpdate: new Date(), price: priceMatch[1], change: changeValue })) } catch (error) { // 异常处理 const fallbackText = widget.addText("⚠️ 数据获取失败\n尝试显示缓存...") fallbackText.textColor = Color.orange() // 显示缓存数据 try { const cache = FileManager.local().readString(cacheFile) const cachedData = JSON.parse(cache) widget.addText(`最后报价:${cachedData.price}`) widget.addText(`更新时间:${cachedData.lastUpdate.toLocaleTimeString()}`) } catch {} } // 配置小组件参数 widget.refreshAfterDate = new Date(Date.now() + 10*60*1000) // 10分钟刷新 Script.setWidget(widget) Script.complete() ``` #### 3. 关键配置说明 1. **股票代码格式**: - A股:`600519.SS`(上证) / `000001.SZ`(深证) - 港股:`0700.HK` - 美股:`AAPL` 2. **界面优化技巧**: - 使用`addStack()`创建横向/纵向布局容器 - 通过`spacer()`实现元素间距控制 - 采用`Font.mediumRoundedSystemFont()`等iOS原生字体 3. **数据刷新策略**: - 推荐10-15分钟更新频率(受iOS系统限制) - 使用`FileManager`本地缓存确保离线可见性 - 通过`Siri捷径`实现手动刷新[^2] #### 4. 效果优化建议 - 添加**分时走势图**:使用`DrawContext`绘制简易折线图 - 集成**多股同列**:通过数组循环处理多个股票代码 - 设置**价格预警**:结合`Device.sound()`实现波动提醒 - 支持**暗色模式**:通过`Device.isUsingDarkAppearance`自动切换配色
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值