Question

J'écris un programme (pour Mac OS X, à l'aide d'Objective-C) et je dois créer un ensemble de fichiers .webloc par programme.

Le fichier .webloc est simplement un fichier créé après le glisser-déposer d'une URL de la barre d'emplacement de Safari vers un dossier.

De manière générale, j'ai besoin d'une approche pour créer des éléments dans un système de fichiers qui pointent vers un emplacement du Web. Si je comprends bien, les fichiers .webloc doivent être utilisés à cette fin sous Mac OS X.

Alors, est-il possible de créer un fichier .webloc ayant une URL valide et un titre pour celui-ci?

Était-ce utile?

La solution

Il est peu connu - mais il existe également un format de fichier basé sur plist simple pour les weblocs.

Lors de la création de fichiers Web, vous NE PAS BESOIN de les enregistrer à l'aide de la méthode de ressource décrite par les trois autres afficheurs. Vous pouvez également écrire un plist simple:

?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>

Le format de la ressource binaire est toujours utilisé et si vous voulez lire un fichier plist, assurez-vous de lire les deux formats de fichier. Mais lors de l’écriture du fichier - utilisez le format basé sur plist - c’est beaucoup plus facile.

Autres conseils

Les fichiers

.webloc (plus généralement, les fichiers de localisation Internet) sont écrits dans un format dont la définition revient à Mac OS 8.x. Il est basé sur les ressources, dérivé du format de découpage que vous obtenez lorsque vous créez un fichier à partir d'objets glissés tels que du texte ou des images.

Les ressources écrites sont 'url' 256 et 'TEXT' , qui stockent l'URL, et éventuellement 'urln' 256, contenant le texte associé à l'URL. . 'glisser' 128 points vers les deux (ou trois) autres ressources.

NTWeblocFile, composant du framework Open Source de Cocoatech CocoaTechFoundation (licencié sous licence BSD), prend en charge leur rédaction. les fichiers d'Objective-C. Si vous souhaitez spécifier un titre séparément pour l'URL, vous devez modifier la classe afin qu'elle écrive autre chose que l'URL dans la ressource 'urln' .

Sous Mac OS X 10.3 et ultérieur, l'URL est également écrite (peut également être écrite) dans une liste de propriétés dans la fourchette de données du fichier. Voir l’autre réponse pour savoir comment cela fonctionne ...

Un fichier .webloc ne contient rien dans son fork de données; au lieu de cela, il stocke l'URL à laquelle il se réfère en tant que ressource dans sa fourchette de ressources. Vous pouvez le voir sur la ligne de commande à l'aide de outil DeRez (1)

Ici, je l'ai exécuté sur un fichier .webloc que j'ai fait glisser hors de la barre d'adresse Safari pour cette question:

% 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 */
};

Les seules ressources qui doivent probablement figurer dans cette zone sont les ressources 'url' et 'TEXT' de l'ID 256, et celles-ci n'ont probablement pas besoin de noms de ressources. non plus. La ressource 'urln' peut s'avérer utile si vous souhaitez inclure le titre du document sur lequel l'URL pointe également. La ressource 'drag' indique au système qu'il s'agit d'un fichier de découpage, mais je ne sais pas s'il doit être présent à cette époque.

Pour utiliser les ressources et la fourchette de ressources d'un fichier, utilisez le Gestionnaire de ressources & # 8212; l'un des morceaux de carbone sous-jacents qui remonte au Mac d'origine. Il existe cependant quelques wrappers Cocoa pour le gestionnaire de ressources, tels que NDResourceFork de Nathan Day .

Autre moyen de créer un " raccourci Web " Le fichier .url est-il déjà mentionné ici.
Le contenu ressemble à (beaucoup plus simple que plist xml):

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

Notez que le fichier a 3 lignes, la dernière ligne est vide.

Plus d'informations sur le format de fichier .url

Il utilise un format binaire basé sur une fourchette de ressources.

Solutions de contournement valides:

  • Demandez à l'utilisateur de faire glisser une URL de votre application (NSURLPboardType) vers le Finder. Le Finder créera un webloc pour vous.
  • Créez un raccourci Web Windows (fichier .URL). Celles-ci ont un format de type fourchette de données de type INI et devraient être documentées quelque part sur Internet; le système d'exploitation les supporte comme il supporte les weblocs.

Voici comment Google Chrome le fait:

Ceci effectue la tâche de base, sans avoir besoin de bibliothèques tierces. (Attention, vérification d'erreur minimale.)

// 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);
                    }
                }
            }
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top