objective c - Elaboración de archivos.webloc
objective-c cocoa (7)
Un archivo .webloc
no tiene nada en su bifurcación de datos; en su lugar, almacena la URL a la que se refiere como recurso en su bifurcación de recursos. Puede ver esto en la línea de comando usando la herramienta DeRez (1)
Aquí lo he ejecutado en un archivo .webloc
que saqué de mi barra de direcciones de Safari para esta pregunta:
% 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 */
};
Los únicos recursos que probablemente necesiten estar ahí son los recursos ''url ''
y ''TEXT''
de ID 256, y probablemente tampoco necesiten nombres de recursos. El ''urln''
puede ser útil si desea incluir también el título del documento al que apunta la URL. El recurso ''drag''
le dice al sistema que este es un archivo de recorte, pero no estoy seguro de si debe estar presente en este momento.
Para trabajar con los recursos y la bifurcación de recursos de un archivo, usa Resource Manager, una de las piezas subyacentes de Carbon que se remonta a la Mac original. Sin embargo, hay un par de contenedores de Cocoa para Resource Manager, como NDResourceFork de Nathan Day .
Estoy escribiendo un programa (para Mac OS X, usando Objective-C) y necesito crear un grupo de archivos .webloc mediante programación.
El archivo .webloc es simplemente un archivo que se crea después de arrastrar y soltar una URL desde la barra de ubicación de Safari a alguna carpeta.
En general, necesito un enfoque para crear elementos en un sistema de archivos que señalen una ubicación en la Web. Según tengo entendido, los archivos .webloc deberían usarse para esto en Mac OS X.
Entonces, ¿es posible crear un archivo .webloc que tenga una URL válida y un título para ella?
Utiliza un formato binario basado en fork de recursos.
Soluciones válidas:
- Haga que el usuario arrastre una URL desde su aplicación (NSURLPboardType) al Finder. The Finder creará un webloc para ti.
- Crear un acceso directo web de Windows (archivo .URL). Éstos tienen un formato basado en datos de tipo INI y se deben documentar en algún lugar de Internet; el sistema operativo los admite ya que admite weblocs.
Es poco conocido, pero también hay un formato de archivo simple basado en plist para weblocs.
Al crear archivos webloc NO NECESITA guardarlos utilizando el método de recursos que describen los otros tres carteles. También puedes escribir un simple 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>
El formato de recurso binario todavía está en uso activo y si quiere leer un archivo plist, entonces seguro que necesita leer ambos formatos de archivo. Pero al escribir el archivo, use el formato basado en plist, es mucho más fácil.
Otra forma de hacer un "atajo web" es el archivo .url
mencionado aquí.
El contenido parece (mucho más simple que plist xml):
[InternetShortcut]
URL=http://www.apple.com/
Tenga en cuenta que el archivo tiene 3 líneas, la última línea está vacía.
.webloc
archivos .webloc
(más genéricamente, archivos de ubicación de Internet) están escritos en un formato cuya definición se remonta a Mac OS 8.x. Se basa en recursos, derivado del formato de recorte que obtiene cuando crea un archivo a partir de objetos arrastrados, como texto o imágenes.
Los recursos escritos son ''url ''
256 y ''TEXT''
256, que almacenan la URL, y opcionalmente ''urln'' 256, que contienen el texto asociado con la URL. ''drag''
128 puntos a los otros dos (o tres) recursos.
NTWeblocFile, que forma parte del marco de Cocoatech Open Source CocoaTechFoundation (licencia BSD), admite escribir estos archivos desde Objective-C. Si desea especificar un título por separado a la URL, deberá modificar la clase para que escriba algo que no sea la URL en el ''urln''
.
En Mac OS X 10.3 y posterior, la URL también se escribe (también se puede escribir) en una lista de propiedades en la bifurcación de datos del archivo. Vea la otra respuesta para saber cómo funciona esto ...
Así es como lo hace Google Chrome: WriteURLToNewWebLocFileResourceFork
Esto hace la tarea básica, sin necesidad de bibliotecas de terceros. (Tenga cuidado: comprobación mínima de errores).
// data for ''drag'' resource (it''s always the same)
#define DRAG_DATA_LENGTH 64
static const unsigned char _dragData[DRAG_DATA_LENGTH]={
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
0x54, 0x45, 0x58, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x75, 0x72, 0x6C, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x75, 0x72, 0x6C, 0x6E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
static void _addData(NSData *data, ResType type, short resId, ResFileRefNum refNum)
{
Handle handle;
if (PtrToHand([data bytes], &handle, [data length])==noErr) {
ResFileRefNum previousRefNum=CurResFile();
UseResFile(refNum);
HLock(handle);
AddResource(handle, type, resId, "/p");
HUnlock(handle);
UseResFile(previousRefNum);
}
}
void WeblocCreateFile(NSString *location, NSString *name, NSURL *fileUrl)
{
NSString *contents=[NSString stringWithFormat:
@"<?xml version=/"1.0/" encoding=/"UTF-8/"?>/n"
@"<!DOCTYPE plist PUBLIC /"-//Apple//DTD PLIST 1.0//EN/" /"http://www.apple.com/DTDs/PropertyList-1.0.dtd/">/n"
@"<plist version=/"1.0/">/n"
@"<dict>/n"
@"<key>URL</key>/n"
@"<string>%@</string>/n"
@"</dict>/n"
@"</plist>/n", location];
if ([[contents dataUsingEncoding:NSUTF8StringEncoding] writeToURL:fileUrl options:NSDataWritingAtomic error:nil])
{
// split into parent and filename parts
NSString *parentPath=[[fileUrl URLByDeletingLastPathComponent] path];
NSString *fileName=[fileUrl lastPathComponent];
FSRef parentRef;
if(FSPathMakeRef((const UInt8 *)[parentPath fileSystemRepresentation], &parentRef, NULL)==noErr)
{
unichar fileNameBuffer[[fileName length]];
[fileName getCharacters:fileNameBuffer];
FSCreateResFile(&parentRef, [fileName length], fileNameBuffer, 0, NULL, NULL, NULL);
if (ResError()==noErr)
{
FSRef fileRef;
if(FSPathMakeRef((const UInt8 *)[[fileUrl path] fileSystemRepresentation], &fileRef, NULL)==noErr)
{
ResFileRefNum resFileReference = FSOpenResFile(&fileRef, fsWrPerm);
if (resFileReference>0 && ResError()==noErr)
{
_addData([NSData dataWithBytes:_dragData length:DRAG_DATA_LENGTH], ''drag'', 128, resFileReference);
_addData([location dataUsingEncoding:NSUTF8StringEncoding], ''url '', 256, resFileReference);
_addData([location dataUsingEncoding:NSUTF8StringEncoding], ''TEXT'', 256, resFileReference);
_addData([name dataUsingEncoding:NSUTF8StringEncoding], ''urln'', 256, resFileReference);
CloseResFile(resFileReference);
}
}
}
}
}
}