制作.webloc文件

时间:2020-03-06 14:51:04  来源:igfitidea点击:

我正在编写一个程序(对于Mac OS X,使用Objective-C),并且需要以编程方式创建一堆.webloc文件。

.webloc文件只是在我们将URL从Safari的位置栏中拖放到某个文件夹后创建的文件。

一般来说,我需要一种方法来在文件系统中创建指向Web中某个位置的项目。据我了解,在Mac OS X上应使用.webloc文件。

因此,是否可以制作一个具有有效URL和某些标题的.webloc文件?

解决方案

它使用基于资源派生的二进制格式。

有效的解决方法:

  • 让用户将URL从应用程序(NSURLPboardType)拖到Finder。 Finder将为我们创建一个webloc。
  • 创建一个Windows Web快捷方式(.URL文件)。它们具有类似INI的基于数据叉的格式,应在Internet上的某个位置进行记录;操作系统支持它们,因为它支持weblocs。

.webloc文件的数据分支中没有任何内容。而是将其引用为资源的URL存储在其资源派生中。我们可以使用DeRez(1)工具在命令行上看到它

在这里,我在一个.webloc文件上运行了该文件,然后将其拖出了Safari地址栏,以解决此问题:

% DeRez "Desktop/Crafting .webloc file - Stack Overflow.webloc"
data 'drag' (128, "Crafting .webloc file -#1701953") {
    $"0000 0001 0000 0000 0000 0000 0000 0003"            /* ................ */
    $"5445 5854 0000 0100 0000 0000 0000 0000"            /* TEXT............ */
    $"7572 6C20 0000 0100 0000 0000 0000 0000"            /* url ............ */
    $"7572 6C6E 0000 0100 0000 0000 0000 0000"            /* urln............ */
};

data 'url ' (256, "Crafting .webloc file -#1701953") {
    $"6874 7470 3A2F 2F73 7461 636B 6F76 6572"            /* http://stackover */
    $"666C 6F77 2E63 6F6D 2F71 7565 7374 696F"            /* flow.com/questio */
    $"6E73 2F31 3436 3537 352F 6372 6166 7469"            /* ns/146575/crafti */
    $"6E67 2D77 6562 6C6F 632D 6669 6C65"                 /* ng-webloc-file */
};

data 'TEXT' (256, "Crafting .webloc file -#1701953") {
    $"6874 7470 3A2F 2F73 7461 636B 6F76 6572"            /* http://stackover */
    $"666C 6F77 2E63 6F6D 2F71 7565 7374 696F"            /* flow.com/questio */
    $"6E73 2F31 3436 3537 352F 6372 6166 7469"            /* ns/146575/crafti */
    $"6E67 2D77 6562 6C6F 632D 6669 6C65"                 /* ng-webloc-file */
};

data 'urln' (256, "Crafting .webloc file -#1701953") {
    $"4372 6166 7469 6E67 202E 7765 626C 6F63"            /* Crafting .webloc */
    $"2066 696C 6520 2D20 5374 6163 6B20 4F76"            /*  file - Stack Ov */
    $"6572 666C 6F77"                                     /* erflow */
};

可能唯一需要的资源是ID 256的" url"和" TEXT"资源,而这些资源也可能不需要资源名称。如果我们还想包括URL指向的文档标题,则'urln'资源可能很方便。 " drag"资源告诉系统这是一个剪切文件,但是我不确定在这个时代是否需要它。

要使用文件的资源和资源分支,可以使用Resource Manager的Carbon底层组件之一,它可以追溯到原始Mac。但是,资源管理器有几个可可包装器,例如Nathan Day的NDResourceFork。

.webloc文件(通常是Internet位置文件)以其定义可以追溯到Mac OS 8.x的格式编写。它是基于资源的,源于在从诸如文本或者图像之类的拖动对象创建文件时获得的剪辑格式。

写入的资源是存储URL的" url" 256和" TEXT" 256,以及可选的包含与URL关联的文本的" urln" 256. 'drag'128指向其他两个(或者三个)资源。

NTWeblocFile是Cocoatech开源框架CocoaTechFoundation(已获得BSD许可)的一部分,支持从Objective-C编写这些文件。如果要单独为URL指定标题,则需要修改该类,以便它在URL中将URL以外的内容写到'urln'资源中。

在Mac OS X 10.3和更高版本中,URL也被写入(也可能被写入)文件数据叉中的属性列表。查看其他答案以了解其工作原理...

鲜为人知,但是对于Weblocs也有一种基于plist的简单文件格式。

创建Webloc文件时,不需要使用其他三个张贴者描述的资源方法来保存它们。我们还可以编写一个简单的plist:

?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>URL</key>
    <string>http://apple.com</string>
</dict>
</plist>

二进制资源格式仍在使用中,如果我们想读取plist文件,请确保同时读取两种文件格式。但是,当使用基于plist的格式编写文件时,它要容易得多。

制作" Web快捷方式"的另一种方法是此处已经提到的.url文件。
内容看起来像(比基于XML的plist简单得多):

[InternetShortcut]
URL=http://www.apple.com/

注意文件有3行,最后一行是空的。

有关.url文件格式的更多信息