You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过终端命令解码NSCoder编码的Pages最近文件记录?

解码Pages最近文档sfl2文件的方案

终端命令方案(Python)

利用Python的pyobjc库调用Cocoa框架的NSKeyedUnarchiver解码NSCoder编码内容:

  1. 安装依赖:
pip install pyobjc-framework-Cocoa
  1. 创建解码脚本decode_sfl2.py:
import Cocoa
import sys

def decode_sfl2(file_path):
    data = Cocoa.NSData.dataWithContentsOfFile_(file_path)
    if not data:
        print("无法读取文件")
        return
    unarchiver = Cocoa.NSKeyedUnarchiver.unarchiverWithData_(data)
    try:
        items = unarchiver.decodeObjectForKey_("items")
        for item in items:
            url = item.valueForKey_("URL")
            if url:
                print(url.path())
    except Exception as e:
        print(f"解码错误: {e}")
    finally:
        unarchiver.finishDecoding()

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("使用方式: python decode_sfl2.py <sfl2文件路径>")
        sys.exit(1)
    decode_sfl2(sys.argv[1])
  1. 终端执行:
python decode_sfl2.py ~/Library/Application\ Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.iwork.pages.sfl2

执行后会直接输出所有最近打开的Pages文档的本地路径。

JavaScript方案(适用于Raycast扩展)

在Node.js环境下,使用objc库调用Cocoa API完成解码,适配Raycast的JS/TS开发:

  1. 安装依赖:
npm install objc
  1. 编写解码函数(可直接集成到Raycast扩展中):
const objc = require('objc');

// 导入Cocoa框架
objc.import('Cocoa');

/**
 * 解码sfl2文件,返回Pages最近文档路径数组
 * @param {string} filePath sfl2文件路径
 * @returns {string[]} 最近文档路径列表
 */
function getPagesRecentDocs(filePath) {
    const NSData = objc.NSData;
    const NSKeyedUnarchiver = objc.NSKeyedUnarchiver;

    const data = NSData.dataWithContentsOfFile_(filePath);
    if (!data) {
        console.error('读取sfl2文件失败');
        return [];
    }

    const unarchiver = NSKeyedUnarchiver.unarchiverWithData_(data);
    try {
        const items = unarchiver.decodeObjectForKey_('items');
        const recentPaths = [];

        for (let i = 0; i < items.count(); i++) {
            const item = items.objectAtIndex_(i);
            const url = item.valueForKey_('URL');
            if (url) {
                recentPaths.push(url.path().js);
            }
        }

        return recentPaths;
    } catch (err) {
        console.error('解码出错:', err);
        return [];
    } finally {
        unarchiver.finishDecoding();
    }
}

// 调用示例
const sfl2Path = `${process.env.HOME}/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.apple.iwork.pages.sfl2`;
const recentDocuments = getPagesRecentDocs(sfl2Path);
console.log('Pages最近打开的文档:', recentDocuments);

将这段代码集成到Raycast扩展后,即可获取到最近文档的路径列表,用于后续的扩展功能开发。

内容的提问来源于stack exchange,提问作者Justiniscoding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:53:37