IOS Scriptable

Scriptable 是一款强大的 iOS 应用
用户可以用 JavaScript 编写脚本来实现各种功能和自动化任务。JavaScript 是一种广泛使用的编程语言。通过 JavaScript,用户可以访问 Scriptable 提供的丰富 API,与 iOS 系统和设备功能进行交互。
常用的配合工具有Data Jar、Jayson、快捷指令

Data Jar 的主要特点和用途:

在这里插入图片描述

  1. 数据存储:Data Jar 提供了一个集中式的存储库,用户可以在其中存储各种类型的数据,如文本、数字、数组和字典。这些数据可以在不同的脚本和自动化任务中共享和重复使用。
  2. 集成自动化:Data Jar 与 Scriptable 和 Shortcuts 等自动化应用无缝集成,允许用户在这些应用中轻松读取和写入数据。例如,用户可以在 Scriptable 中获取 Data Jar 中存储的数据,或者使用 Shortcuts 来更新 Data Jar 中的数据。
  3. 键值对存储:Data Jar 以键值对的形式存储数据,用户可以根据需要定义和管理多个键,每个键下可以存储不同类型和结构的数据。
  4. 数据持久化:Data Jar 中存储的数据是持久化的,这意味着即使应用被关闭或设备重启,数据也会被保留,不会丢失。
  5. 用户界面:Data Jar 提供了一个简单直观的用户界面,用户可以方便地查看和管理存储的数据。用户可以直接在应用内添加、编辑和删除数据。
  6. 安全和隐私:Data Jar 支持使用 iCloud 同步数据,确保数据在不同设备之间的一致性。应用还注重用户隐私,确保数据在本地和云端的安全。

Jayson 的主要特点和用途:

在这里插入图片描述

  1. JSON 查看和编辑:Jayson 提供了一个直观的界面,让用户可以方便地查看和编辑 JSON 数据。用户可以通过层级视图浏览嵌套的 JSON 结构。
  2. 文件导入和导出:用户可以从各种来源导入 JSON 文件,包括 iCloud、Dropbox 和其他文件应用。编辑完成后,可以将修改后的 JSON 数据导出或分享。
  3. URL Schemes:Jayson 支持 URL Schemes,使得用户可以从其他应用(如 Safari 或 Shortcuts)直接将 JSON 数据传递给 Jayson 进行查看和编辑。
  4. 快捷操作:Jayson 提供了快捷操作,可以快速对 JSON 数据进行常见操作,如排序、添加或删除节点。这些快捷操作提高了数据处理的效率。
  5. 格式化和验证:应用可以自动格式化 JSON 数据,使其更易于阅读和理解。此外,Jayson 还可以验证 JSON 数据的结构,确保其有效性和正确性。
  6. 复制和粘贴:用户可以方便地复制和粘贴 JSON 数据,支持跨应用操作,这对于快速编辑和处理数据非常有用。
  7. 可扩展性:通过与其他应用的集成,Jayson 可以用来查看 API 返回的 JSON 数据,调试 Web 应用,或分析从不同来源获取的 JSON 数据。

快捷指令的主要特点和用途:

在这里插入图片描述

  1. 任务自动化:快捷指令可以自动化一系列任务。例如,用户可以创建一个快捷指令来同时调节家庭的智能灯光、播放音乐和设定闹钟。
  2. 可视化编辑器:快捷指令应用提供了一个直观的拖放界面,用户可以通过简单的拖放操作来创建和编辑快捷指令,而不需要编写代码。
  3. 与应用集成:快捷指令可以与众多内置和第三方应用集成,使用户能够通过一个快捷指令操作多个应用。例如,用户可以创建一个快捷指令来在社交媒体上发布照片,同时在照片应用中添加标签。
  4. 触发条件:快捷指令可以通过多种方式触发,包括Siri语音命令、主屏幕小组件、自动化(基于时间、位置、设备状态等)、快捷方式菜单和共享表单。
  5. 操作步骤:每个快捷指令由一系列操作步骤组成,这些步骤可以包括发送消息、获取天气信息、播放音乐、执行网络请求、处理文件等。
  6. 变量和条件:快捷指令支持使用变量和条件逻辑,使得任务序列能够根据不同的情况做出决策。例如,根据当前时间的不同,快捷指令可以执行不同的操作。
  7. 共享和社区:用户可以分享他们创建的快捷指令,并且可以从网上的快捷指令社区下载其他用户创建的快捷指令,从而拓展应用的功能。
  8. 脚本和扩展:高级用户可以通过与其他工具(如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();
  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值