Scriptable 是一款强大的 iOS 应用
用户可以用 JavaScript 编写脚本来实现各种功能和自动化任务。JavaScript 是一种广泛使用的编程语言。通过 JavaScript,用户可以访问 Scriptable 提供的丰富 API,与 iOS 系统和设备功能进行交互。
常用的配合工具有Data Jar、Jayson、快捷指令
Data Jar 的主要特点和用途:
- 数据存储:Data Jar 提供了一个集中式的存储库,用户可以在其中存储各种类型的数据,如文本、数字、数组和字典。这些数据可以在不同的脚本和自动化任务中共享和重复使用。
- 集成自动化:Data Jar 与 Scriptable 和 Shortcuts 等自动化应用无缝集成,允许用户在这些应用中轻松读取和写入数据。例如,用户可以在 Scriptable 中获取 Data Jar 中存储的数据,或者使用 Shortcuts 来更新 Data Jar 中的数据。
- 键值对存储:Data Jar 以键值对的形式存储数据,用户可以根据需要定义和管理多个键,每个键下可以存储不同类型和结构的数据。
- 数据持久化:Data Jar 中存储的数据是持久化的,这意味着即使应用被关闭或设备重启,数据也会被保留,不会丢失。
- 用户界面:Data Jar 提供了一个简单直观的用户界面,用户可以方便地查看和管理存储的数据。用户可以直接在应用内添加、编辑和删除数据。
- 安全和隐私:Data Jar 支持使用 iCloud 同步数据,确保数据在不同设备之间的一致性。应用还注重用户隐私,确保数据在本地和云端的安全。
Jayson 的主要特点和用途:
- JSON 查看和编辑:Jayson 提供了一个直观的界面,让用户可以方便地查看和编辑 JSON 数据。用户可以通过层级视图浏览嵌套的 JSON 结构。
- 文件导入和导出:用户可以从各种来源导入 JSON 文件,包括 iCloud、Dropbox 和其他文件应用。编辑完成后,可以将修改后的 JSON 数据导出或分享。
- URL Schemes:Jayson 支持 URL Schemes,使得用户可以从其他应用(如 Safari 或 Shortcuts)直接将 JSON 数据传递给 Jayson 进行查看和编辑。
- 快捷操作:Jayson 提供了快捷操作,可以快速对 JSON 数据进行常见操作,如排序、添加或删除节点。这些快捷操作提高了数据处理的效率。
- 格式化和验证:应用可以自动格式化 JSON 数据,使其更易于阅读和理解。此外,Jayson 还可以验证 JSON 数据的结构,确保其有效性和正确性。
- 复制和粘贴:用户可以方便地复制和粘贴 JSON 数据,支持跨应用操作,这对于快速编辑和处理数据非常有用。
- 可扩展性:通过与其他应用的集成,Jayson 可以用来查看 API 返回的 JSON 数据,调试 Web 应用,或分析从不同来源获取的 JSON 数据。
快捷指令的主要特点和用途:
- 任务自动化:快捷指令可以自动化一系列任务。例如,用户可以创建一个快捷指令来同时调节家庭的智能灯光、播放音乐和设定闹钟。
- 可视化编辑器:快捷指令应用提供了一个直观的拖放界面,用户可以通过简单的拖放操作来创建和编辑快捷指令,而不需要编写代码。
- 与应用集成:快捷指令可以与众多内置和第三方应用集成,使用户能够通过一个快捷指令操作多个应用。例如,用户可以创建一个快捷指令来在社交媒体上发布照片,同时在照片应用中添加标签。
- 触发条件:快捷指令可以通过多种方式触发,包括Siri语音命令、主屏幕小组件、自动化(基于时间、位置、设备状态等)、快捷方式菜单和共享表单。
- 操作步骤:每个快捷指令由一系列操作步骤组成,这些步骤可以包括发送消息、获取天气信息、播放音乐、执行网络请求、处理文件等。
- 变量和条件:快捷指令支持使用变量和条件逻辑,使得任务序列能够根据不同的情况做出决策。例如,根据当前时间的不同,快捷指令可以执行不同的操作。
- 共享和社区:用户可以分享他们创建的快捷指令,并且可以从网上的快捷指令社区下载其他用户创建的快捷指令,从而拓展应用的功能。
- 脚本和扩展:高级用户可以通过与其他工具(如Scriptable和Data Jar)的集成,实现更复杂和高级的自动化功能。例如,使用JavaScript在Scriptable中创建复杂的逻辑,再通过快捷指令触发执行。
使用Scriptable实现爬取、解析、存储、读取、渲染
let url = "目标网址";
let req = new Request(url);
// 发送请求并获取响应
let html = await req.loadString(); // console.log(html);
// 使用 WebView 进行 DOM 解析
let webView = new WebView();
await webView.loadHTML(html)
// console.log(html);
let economyData = await webView.evaluateJavaScript(`
Array.from(document.querySelectorAll('tbody tr')).map(tr => {
// 获取包含在 tr 下的所有 td
let tds = Array.from(tr.querySelectorAll('td'));
// 过滤掉 class 为 "d-none" 的 td
let filteredTds = tds.filter(td => !td.classList.contains('d-none'));
// 返回包含文本内容的数组
return filteredTds.map(td => td.textContent.trim());
});
`);
// 将经济数据转换为 JSON 格式,字段改为英文
let jsonEconomyData = economyData.map(data => {
return data;
});
console.log(jsonEconomyData);
// 创建本地文件管理器
const fileManager = FileManager.iCloud()
if(jsonEconomyData.length>1){
// 指定本地文件路径
const filePath = fileManager.joinPath(fileManager.documentsDirectory(), "/GetJson/房价/Whfj.json")
// 写入数据到文件
const contentToWrite = JSON.stringify(jsonEconomyData, null, 2);
fileManager.writeString(filePath, contentToWrite)
}
Script.complete()
== 注意解析时可能要根据内容调整解析代码==
这样就把解析后的数据保存到了手机文件中了
因为在渲染时控件默认根据焦点进行更新、
为了文明爬取则需要自己配置定时任务、
在自带的API可以做、也可以配合快捷指令使用
这里使用了快捷指令
现在已经实现了每天10:30收集一次新的数据
下面是读取文件再进行渲染、先做一个类专门用于调取文件数据
获取io数据类
exports.data = (url) => {
// 创建本地文件管理器
const fileManager = FileManager.iCloud();
let fileAll;
// 指定本地文件路径
const filePath2 = fileManager.joinPath(fileManager.documentsDirectory(),url);
// 读取文件内容
const contentFromFile = fileManager.readString(filePath2);
if (contentFromFile) {
fileAll = contentFromFile;
// console.log("文件内容:" + fileAll);
return JSON.parse(fileAll);
} else {
return "无法读取文件内容。";
}
};
调用文件进行渲染
// io.js 模块
let circle = importModule('获取io数据');
let area = circle.data("/GetJson/房价/Whfj.json");
// console.log(area);
// 准备数据
const productData = [];
for(let i=0;i<area.length;i++){
productData.push({ name: area[i][1], recentData: area[i][2], previousData: area[i][3] })
}
// 创建小组件
let widget = new ListWidget();
let logo = widget.addText("🏖️")
logo.centerAlignText()
logo.font = Font.systemFont(40)
let title = widget.addText("House prices in Wuhan")
title.font = Font.semiboldSystemFont(20);
title.centerAlignText()
console.log(widget)
// 定义表格头部
let headerRow = widget.addStack();
let hr1=headerRow.addText("行政区");
headerRow.addSpacer();
let hr2=headerRow.addText("均价(元/㎡)");
// let hr2=headerRow.addText("均价");
headerRow.addSpacer();
let hr3=headerRow.addText("环比上月");
hr1.font= Font.boldSystemFont(11);
hr2.font= Font.boldSystemFont(11);
hr3.font= Font.boldSystemFont(11);
hr1.textColor=new Color("#4682B4");
hr2.textColor=new Color("#4682B4");
hr3.textColor=new Color("#4682B4");
// 添加数据到表格
for (const entry of productData) {
let row = widget.addStack();
let xzqst=row.addText(entry.name);
row.addSpacer();
let jjst=
row.addText(entry.recentData.toString());
row.addSpacer();
let hbst=
row.addText(entry.previousData.toString());
xzqst.font = Font.lightMonospacedSystemFont(15);
jjst.font = Font.ultraLightRoundedSystemFont(15);
hbst.font = Font.semiboldRoundedSystemFont(15);
if(entry.previousData.toString()[0]=="+"){
hbst.textColor=new Color("#DC143C");
}else if(entry.previousData.toString()[0]=="-"){
hbst.textColor=new Color("#3cb371");
}else{
hbst.textColor=new Color("#778899");
}
// 添加横向网格线
row.borderColor = new Color("#2F4F4F");
row.borderWidth = 1;
}
// 设置背景渐变
const gradient = new LinearGradient();
gradient.colors = [new Color("#ffffff"), new Color("#ffffff")];
gradient.locations = [0, 1];
widget.backgroundGradient = gradient;
// 在小组件中显示
if (config.runsInWidget) {
Script.setWidget(widget);
Script.complete();
} else {
widget.presentSmall();
}
最后实现效果
文件流处理示例
// 创建本地文件管理器
const fileManager = FileManager.iCloud()
// 指定本地文件路径
const filePath = fileManager.joinPath(fileManager.documentsDirectory(), "/GetText/LogData.txt")
// 写入数据到文件
const contentToWrite = "Hello, Scriptable FileManager"
fileManager.writeString(filePath, contentToWrite)
// 追加数据到文件
const contentToAppend = "\nAppending additional content."
fileManager.appendString(filePath, contentToAppend)
// 读取文件内容
const contentFromFile = fileManager.readString(filePath)
if (contentFromFile) {
console.log("文件内容:" + contentFromFile)
} else {
console.log("无法读取文件内容。")
}
// 删除文件
if (fileManager.fileExists(filePath)) {
fileManager.remove(filePath)
console.log("文件删除成功。")
}
Script.complete()
折线图表示例
// 准备日期和销量的示例数据
const salesData = [
{ date: "1月", sales: 100 },
{ date: "2月", sales: 150 },
{ date: "3月", sales: 80 },
{ date: "4月", sales: 200 },
{ date: "5月", sales: 120 }
];
// 生成 QuickChart 请求的 URL
const chartUrl = generateChartUrl(salesData);
// 创建小组件
let widget = new ListWidget();
widget.addText("折线图");
widget.addSpacer(10);
// 定义背景渐变
const gradient = new LinearGradient();
gradient.colors = [new Color("#000000"), new Color("#190033")];
gradient.locations = [0, 1];
widget.backgroundGradient = gradient;
// 添加图表的在线图片到小组件
widget.addImage(await getImageFromUrl(chartUrl));
// 在小组件中显示
if (config.runsInWidget) {
Script.setWidget(widget);
Script.complete();
} else {
widget.presentSmall();
}
// 生成 QuickChart 请求的 URL
function generateChartUrl(salesData) {
const data = {
type: "line",
data: {
labels: salesData.map(item => item.date),
datasets: [
{
data: salesData.map(item => item.sales),
borderColor: "rgb(75, 192, 192)",
tension: 0.1,
fill: false // Set fill to false to hide the area under the line
}
]
},
options: {
legend: { display: false } // Hide the legend
}
};
const chartUrl = `https://quickchart.io/chart?w=200&h=100&c=${encodeURIComponent(
JSON.stringify(data)
)}`;
return chartUrl;
}
// 通过 URL 获取图像
async function getImageFromUrl(url) {
const req = new Request(url);
return await req.loadImage();
}
多折线图示例
// 准备日期和销量的示例数据
const salesData = [
{ date: "1月", salesLine1: 100, salesLine2: 80 },
{ date: "2月", salesLine1: 150, salesLine2: 120 },
{ date: "3月", salesLine1: 80, salesLine2: 100 },
{ date: "4月", salesLine1: 200, salesLine2: 150 },
{ date: "5月", salesLine1: 120, salesLine2: 180 }
];
// 生成 QuickChart 请求的 URL
const chartUrl = generateChartUrl(salesData);
// 创建小组件
let widget = new ListWidget();
let title = widget.addText("🟥 🟩 ");
title.font = Font.boldSystemFont(10); // Adjust the font size to 14 (default is 16)
widget.addSpacer(10);
// 定义背景渐变
const gradient = new LinearGradient();
gradient.colors = [new Color("#000000"), new Color("#190033")];
gradient.locations = [0, 1];
widget.backgroundGradient = gradient;
// 添加图表的在线图片到小组件
widget.addImage(await getImageFromUrl(chartUrl));
// 在小组件中显示
if (config.runsInWidget) {
Script.setWidget(widget);
Script.complete();
} else {
widget.presentSmall();
}
// 生成 QuickChart 请求的 URL
function generateChartUrl(salesData) {
const data = {
type: "line",
data: {
labels: salesData.map(item => item.date),
datasets: [
{
label: "销量线1",
data: salesData.map(item => item.salesLine1),
borderColor: "rgb(51, 255, 51)",
tension: 0.1,
fill: false // Set fill to false to hide the area under the line
},
{
label: "销量线2",
data: salesData.map(item => item.salesLine2),
borderColor: "rgb(255, 99, 132)",
tension: 0.1,
fill: false // Set fill to false to hide the area under the line
}
]
},
options: {
legend: { display: false } // Hide the legend
}
};
const chartUrl = `https://quickchart.io/chart?w=500&h=100&c=${encodeURIComponent(
JSON.stringify(data)
)}`;
return chartUrl;
}
// 通过 URL 获取图像
async function getImageFromUrl(url) {
const req = new Request(url);
return await req.loadImage();
}
表格组件版示例
// 准备示例数据
const productData = [
{ name: "产品A", recentData: 100, previousData: 80, unit: "件" },
{ name: "产品B", recentData: 150, previousData: 120, unit: "件" },
{ name: "产品C", recentData: 80, previousData: 60, unit: "件" },
{ name: "产品D", recentData: 200, previousData: 180, unit: "件" },
{ name: "产品E", recentData: 120, previousData: 100, unit: "件" }
];
// 创建小组件
let widget = new ListWidget();
widget.addText("销售数据表格");
widget.addSpacer(10);
// 定义表格头部
let headerRow = widget.addStack();
headerRow.addText("名称");
headerRow.addSpacer();
headerRow.addText("近期数据");
headerRow.addSpacer();
headerRow.addText("前次数据");
headerRow.addSpacer();
headerRow.addText("单位");
// 添加数据到表格
for (const entry of productData) {
let row = widget.addStack();
row.addText(entry.name);
row.addSpacer();
row.addText(entry.recentData.toString());
row.addSpacer();
row.addText(entry.previousData.toString());
row.addSpacer();
row.addText(entry.unit);
// 添加横向网格线
row.borderColor = new Color("#555555");
row.borderWidth = 1;
}
// 设置背景渐变
const gradient = new LinearGradient();
gradient.colors = [new Color("#000000"), new Color("#190033")];
gradient.locations = [0, 1];
widget.backgroundGradient = gradient;
// 在小组件中显示
if (config.runsInWidget) {
Script.setWidget(widget);
Script.complete();
} else {
widget.presentSmall();
}
官方表格示例
// 创建新的UITable
let table = new UITable();
// 添加表头
let headerRow = new UITableRow();
headerRow.addText("Name").centerAligned();
headerRow.addText("Age").centerAligned();
table.addRow(headerRow);
// 添加示例数据行
addDataRow("John Doe", 25);
addDataRow("Jane Smith", 30);
addDataRow("Bob Johnson", 28);
// 显示分隔线
table.showSeparators = true;
// 刷新并呈现表格
table.present();
// 添加数据行的函数
function addDataRow(name, age) {
let dataRow = new UITableRow();
dataRow.addText(name);
dataRow.addText(String(age)).centerAligned();
table.addRow(dataRow);
}
获取当前时间
// 获取当前时间和日期
let currentDate = new Date()
let hours = currentDate.getHours()
let minutes = currentDate.getMinutes()
let day = currentDate.getDate()
let month = currentDate.getMonth() + 1
let year = currentDate.getFullYear()
// 格式化时间和日期
let formattedTime = `${hours}:${String(minutes).padStart(2, '0')}`
let formattedDate = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`
console.log(formattedTime);
console.log(formattedDate);
对话框示例
// 创建一个新的警报
let alert = new Alert()
// 添加标题和消息
alert.title = "示例警报"
alert.message = "这是一个用Scriptable创建的示例警报。"
// 添加操作按钮
alert.addAction("确定")
// 添加破坏性动作
alert.addDestructiveAction("删除")
// 添加取消操作
alert.addCancelAction("取消")
// 显示警报并获取所选操作的索引
let selectedIndex = await alert.present()
// 根据所选操作执行相应的逻辑
switch (selectedIndex) {
case 0:
console.log("用户点击了确定按钮。");
break;
case 1:
console.log("用户点击了删除按钮。");
break;
case -1:
console.log("用户点击了取消按钮。");
break;
default:
break;
}
日志示例
// 记录普通日志
console.log("This is a regular log message.");
// 记录警告
console.warn("This is a warning message.");
// 记录错误
console.error("This is an error message.");
选项卡示例
// 示例:选择日期
// async function pickDateExample() {
// const datePicker = new DatePicker();
// const selectedDate = await datePicker.pickDate();
// console.log('Selected Date:', selectedDate);
// }
//
// 示例:选择时间
// async function pickTimeExample() {
// const datePicker = new DatePicker();
// const selectedTime = await datePicker.pickTime();
// console.log('Selected Time:', selectedTime);
// }
//
// 示例:选择日期和时间
async function pickDateAndTimeExample() {
const datePicker = new DatePicker();
const selectedDateTime = await datePicker.pickDateAndTime();
console.log('Selected Date and Time:', selectedDateTime);
}
//
// 示例:选择倒计时持续时间
// async function pickCountdownDurationExample() {
// const datePicker = new DatePicker();
// const selectedDuration = await datePicker.pickCountdownDuration();
// console.log('Selected Countdown Duration:', selectedDuration);
// }
//
// 示例:使用配置项
// async function datePickerWithConfigExample() {
// const config = {
// minuteInterval: 15,
// initialDate: new Date(),
// 其他配置项...
// };
//
// const datePicker = new DatePicker(config);
// const selectedDate = await datePicker.pickDate();
// console.log('Selected Date:', selectedDate);
// }
// 运行示例
// pickDateExample();
// pickTimeExample();
pickDateAndTimeExample();
// pickCountdownDurationExample();
// datePickerWithConfigExample();
画布示例
// 创建一个新的绘图上下文
let ctx = new DrawContext()
// 设置画布的大小
ctx.size = new Size(300, 200)
// 设置填充颜色
ctx.setFillColor(new Color("#3498db")) // 例如颜色:蓝色
// 在画布上填充一个矩形
ctx.fill(new Rect(50, 50, 200, 100)) // 例如矩形:x=50, y=50, 宽度=200, 高度=100
// 检索绘制的图像
let image = ctx.getImage()
// 在小部件中显示图像(例如)
if (config.runsInWidget) {
let widget = new ListWidget()
widget.backgroundImage = image
if (config.runsInWidget) {
if (config.widgetFamily === "medium") {
widget.addText("中等尺寸小部件")
} else {
widget.addText("大尺寸小部件")
}
}
Script.setWidget(widget)
Script.complete()
} else {
// 在应用程序中显示图像或根据需要处理它
}
发送短信示例
// 创建新消息
const newMessage = new Message();
// 设置收件人
const recipients = ['+1234567890']; // 请替换为实际的电话号码
newMessage.recipients = recipients;
// 设置消息正文
const messageBody = 'Hello, this is a sample message.';
newMessage.body = messageBody;
// 添加图像附件
const imageFilePath = '/path/to/your/image.jpg'; // 请替换为实际的图像文件路径
const image = Image.fromFile(imageFilePath);
newMessage.addImageAttachment(image);
// 添加文件附件
const fileFilePath = '/path/to/your/file.txt'; // 请替换为实际的文件路径
newMessage.addFileAttachment(fileFilePath);
// 添加数据附件
const data = new Data('Your attachment data'); // 请替换为实际的数据
const uti = 'public.text'; // 请根据实际需要替换为适当的UTI
const filename = 'attachment.txt'; // 请替换为实际的文件名
newMessage.addDataAttachment(data, uti, filename);
// 发送消息
const sendPromise = newMessage.send();
// 处理发送结果
sendPromise.then(() => {
console.log('消息已发送成功!');
}).catch((error) => {
console.error('消息发送失败:', error);
});
捕获异常
// 创建通知
const myNotification = new Notification();
myNotification.title = "示例通知";
myNotification.subtitle = "这是一个副标题";
myNotification.body = "通知的正文内容";
// 设置触发日期为当前时间后的10秒
const triggerDate = new Date();
triggerDate.setSeconds(triggerDate.getSeconds() + 10);
myNotification.setTriggerDate(triggerDate);
// 添加操作按钮
myNotification.addAction("打开链接", "https://example.com", false);
try {
// 安排通知
await myNotification.schedule();
console.log("通知已安排成功!");
} catch (error) {
console.error("安排通知时出错:", error);
}
链接示例
class WebsiteOpener {
// 在应用程序内打开,带有可选的全屏参数
static openInApp(url, fullscreen = true) {
return new Promise((resolve, reject) => {
// 模拟应用程序内打开的逻辑
console.log(`在应用程序内打开 ${url} ${fullscreen ? '全屏' : '窗口'}`);
// 解析 Promise 以表示成功
resolve('成功在应用程序内打开');
});
}
// 在 Safari 中打开,离开当前应用程序
static openInSafari(url) {
// 模拟在 Safari 中打开的逻辑
console.log(`在 Safari 中打开 ${url}`);
}
}
// 示例用法
WebsiteOpener.openInApp("https://example.com", true)
.then(result => {
console.log(result);
})
.catch(error => {
console.error("在应用程序内打开时出错:", error);
});
WebsiteOpener.openInSafari("https://example.com");
显示网页
// 调用openInApp函数在应用内以全屏模式打开网页
async function openWebsiteInApp() {
const url = "https://oss-class.weimiaocaishang.com/Site/calculator.html"; // 替换为您想要打开的网址
const fullscreen = true; // 设置为false以在应用内显示非全屏网页
// 使用Scriptable的openInApp函数打开网页
await Safari.openInApp(url, fullscreen);
}
// 运行函数
await openWebsiteInApp();
创建html文件示例
// 创建本地文件管理器
// const fileManager = FileManager.iCloud();
// let fileAll;用时解开,这是html表格
// 指定本地文件路径
const filePath2 = fileManager.joinPath(fileManager.documentsDirectory(), "/GetJson/jsonEconomyDataFile.json");
// 读取文件内容
const contentFromFile = fileManager.readString(filePath2);
if (contentFromFile) {
fileAll = JSON.parse(contentFromFile);
console.log("文件内容:" + contentFromFile);
} else {
console.log("无法读取文件内容。");
}
// 创建HTML表格字符串
let htmlTable = `
<html>
<head>
<meta charset="UTF-8">
<style>
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
</style>
</head>
<body>
<table>
<tr>
<th>项目</th>
<th>近期</th>
<th>前次</th>
<th>单位</th>
</tr>
`;
// 添加数据行
for (let i = 152; i <= 157; i++) {
htmlTable += `<tr>
<td>${fileAll[i].name}</td>
<td>${fileAll[i].recentData}</td>
<td>${fileAll[i].previousData}</td>
<td>${fileAll[i].unit}</td>
</tr>`;
}
// 结束HTML表格
htmlTable += `
</table>
</body>
</html>
`;
// 将HTML保存到本地文件(使用UTF-8编码)
const htmlFilePath = fileManager.joinPath(fileManager.documentsDirectory(), "table.html");
fileManager.writeString(htmlFilePath, htmlTable, true);
// 使用Safari.open打开本地HTML文件
Safari.open(htmlFilePath);
获取手机主题
// 获取当前设备的外观模式
let deviceAppearance = Device.isUsingDarkAppearance() ? "Dark" : "Light";
if (deviceAppearance === "Dark") {
console.log("当前主题为暗黑模式。");
} else {
console.log("当前主题为白色模式。");
}
UUID示例
class UUID {
static string() {
// Generate a random UUID
let uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
let r = Math.random() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
return uuid;
}
}
// Example usage
let stringValue = UUID.string();
console.log(stringValue);
外联调用示例
// circle.js
// 导出计算圆的面积的函数
exports.area = (r) => {
return Math.PI * Math.pow(r, 2);
};
// 导出计算圆的周长的函数
exports.circumference = (r) => {
return 2 * Math.PI * r;
};
在此引入
// main.js
// 导入 circle.js 模块
let circle = importModule('circle');
// 定义半径
let r = 2;
// 使用导入的模块计算圆的面积
let area = circle.area(r);
console.log('圆的面积:' + area);
// 使用导入的模块计算圆的周长
let circumference = circle.circumference(r);
console.log('圆的周长:' + circumference);
获取当前位置
// 获取当前位置信息
async function getCurrentLocation() {
try {
// 设置最佳精度
Location.setAccuracyToBest();
// 获取当前位置
let location = await Location.current();
// 打印位置信息
console.log("当前位置信息:", location);
// 获取经度和纬度
let latitude = location.latitude;
let longitude = location.longitude;
// 执行反向地理编码
let addressInfo = await Location.reverseGeocode(latitude, longitude, null);
// 打印反向地理编码信息
console.log("反向地理编码信息:", addressInfo);
} catch (error) {
console.error("获取位置信息失败:", error);
}
}
// 调用函数获取当前位置信息
getCurrentLocation();
调用快捷指令获取返回值
let shortcut = new CallbackURL('shortcuts://run-shortcut');
shortcut.addParameter('name', '快捷指令');
let result = await shortcut.open();
console.log(result);