如何通过终端命令解码NSCoder编码的Pages最近文件记录?
解码Pages最近文档sfl2文件的方案
终端命令方案(Python)
利用Python的pyobjc库调用Cocoa框架的NSKeyedUnarchiver解码NSCoder编码内容:
- 安装依赖:
pip install pyobjc-framework-Cocoa
- 创建解码脚本
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])
- 终端执行:
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开发:
- 安装依赖:
npm install objc
- 编写解码函数(可直接集成到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
相关产品推荐
相关产品推荐

