Pregunta

Estoy escribiendo un programa (para Mac OS X, usando Objective-C) y necesito crear un montón 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 términos generales, necesito un método para crear elementos en un sistema de archivos que apunten a alguna 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 con una URL válida y algún título para él?

¿Fue útil?

Solución

Es poco conocido, pero también hay un formato de archivo simple basado en plist para weblocs.

Al crear archivos webloc, NO NECESITA para 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 desea leer un archivo plist, asegúrese de leer ambos formatos de archivo. Pero al escribir el archivo, use el formato basado en plist, es mucho más fácil.

Otros consejos

Los archivos

.webloc (más genéricamente, los 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, se deriva 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 contiene el texto asociado con la URL . 'arrastrar' 128 puntos a los otros dos (o tres) recursos.

NTWeblocFile, parte del Marco de trabajo de código abierto de Cocoatech CocoaTechFoundation (BSD con licencia), permite escribir estos archivos de Objective-C. Si desea especificar un título por separado a la URL, deberá modificar la clase para que escriba algo distinto a la URL en el recurso 'urln' .

En Mac OS X 10.3 y versiones posteriores, 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 ...

Un archivo .webloc no tiene nada en su bifurcación de datos; en cambio, almacena la URL a la que hace referencia como un recurso en su bifurcación de recursos. Puede ver esto en la línea de comandos utilizando DeRez (1) herramienta

Aquí lo he ejecutado en un archivo .webloc que arrastré fuera 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") {
    <*>quot;0000 0001 0000 0000 0000 0000 0000 0003"            /* ................ */
    <*>quot;5445 5854 0000 0100 0000 0000 0000 0000"            /* TEXT............ */
    <*>quot;7572 6C20 0000 0100 0000 0000 0000 0000"            /* url ............ */
    <*>quot;7572 6C6E 0000 0100 0000 0000 0000 0000"            /* urln............ */
};

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

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

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

Los únicos recursos que probablemente deben estar allí son los recursos 'url' y 'TEXT' del ID 256, y probablemente no necesiten nombres de recursos ya sea. El recurso 'urln' puede ser útil si desea incluir el título del documento al que también apunta la URL. El recurso 'arrastrar' le dice al sistema que este es un archivo de recorte, pero no estoy seguro de si debe estar allí en este día y en esta época.

Para trabajar con recursos y la bifurcación de recursos de un archivo, use el Administrador de recursos & # 8212; Una de las piezas subyacentes de Carbon que se remonta a la Mac original. Sin embargo, hay un par de envoltorios de cacao para el administrador de recursos, como NDResourceFork de Nathan Day.

Otra forma de hacer " acceso directo a la web " Es el archivo .url mencionado aquí ya.
Los contenidos parecen (mucho más simples que los basados ??en xml plist):

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

Note que el archivo tiene 3 líneas, la última línea está vacía.

Más información sobre el formato de archivo .url

Utiliza un formato binario basado en bifurcación de recursos.

Soluciones válidas:

  • Haga que el usuario arrastre una URL desde su aplicación (NSURLPboardType) al Finder. El Finder creará un webloc para ti.
  • Cree un acceso directo web de Windows (archivo .URL). Estos tienen un formato basado en bifurcación de datos similar a INI y deben documentarse en algún lugar de Internet; el SO los admite como soporta weblocs.

Aquí es cómo lo hace el nombre del juego en el que se encuentra.

Esto hace la tarea básica, sin necesidad de bibliotecas de terceros. (Tenga cuidado: comprobación de errores mínimos).

// 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);
                    }
                }
            }
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top