web-dev-qa-db-fra.com

Comment associer des types de fichiers à une application iPhone?

Sur le sujet d'associer votre application iPhone avec des types de fichiers.

Dans this question informative, j'ai appris que des applications pouvaient être associées à des protocoles d'URL personnalisés.

C'était il y a presque un an et depuis lors, Apple a introduit le 'Support aux documents' qui va encore plus loin et permet aux applications de s'associer à des types de fichiers. La documentation explique beaucoup de choses sur la façon de configurer votre application pour qu'elle lance d'autres applications appropriées lorsqu'elle rencontre un type de fichier inconnu. Cela signifie que l'association ne fonctionne pas avec toutes les applications, comme ce fut le cas pour l'enregistrement du protocole d'URL.

Cela m'amène à la question: les applications système telles que Safari ou Mail ont-elles implémenté ce système pour choisir les applications associées, ou ne feront-elles rien comme auparavant?

317
Mihai Damian

La gestion des types de fichiers est nouvelle avec iPhone OS 3.2 et diffère des schémas d'URL personnalisés existants. Vous pouvez enregistrer votre application pour gérer des types de documents particuliers. Toute application utilisant un contrôleur de document peut transférer le traitement de ces documents à votre propre application.

Par exemple, mon application Molecules (pour laquelle le code source est disponible) gère les types de fichiers .pdb et .pdb.gz, si elles sont reçues par courrier électronique ou dans une autre application prise en charge.

Pour enregistrer un support, vous devez avoir quelque chose comme ceci dans votre Info.plist:

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeIconFiles</key>
        <array>
            <string>Document-molecules-320.png</string>
            <string>Document-molecules-64.png</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>Molecules Structure File</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>com.sunsetlakesoftware.molecules.pdb</string>
            <string>org.gnu.gnu-Zip-archive</string>
        </array>
    </dict>
</array>

Deux images sont fournies. Elles serviront d’icônes aux types pris en charge dans Mail et aux autres applications capables d’afficher des documents. La touche LSItemContentTypes vous permet de fournir un tableau d'identificateurs de type uniforme (UTI) que votre application peut ouvrir. Pour obtenir une liste des UTI définies par le système, voir Apple Uniform Type Identifiers Reference . On trouvera encore plus de détails sur les UTI dans la présentation des identificateurs de type uniforme d'Apple . Ces guides résident dans le centre des développeurs Mac, car cette fonctionnalité a été transférée depuis le Mac.

L'une des UTI utilisées dans l'exemple ci-dessus était définie par le système, mais l'autre était une UTI spécifique à l'application. L’UTI spécifique à l’application devra être exportée pour que les autres applications du système puissent en prendre connaissance. Pour ce faire, vous ajouteriez une section à votre Info.plist comme suit:

<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.plain-text</string>
            <string>public.text</string>
        </array>
        <key>UTTypeDescription</key>
        <string>Molecules Structure File</string>
        <key>UTTypeIdentifier</key>
        <string>com.sunsetlakesoftware.molecules.pdb</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <string>pdb</string>
            <key>public.mime-type</key>
            <string>chemical/x-pdb</string>
        </dict>
    </dict>
</array>

Cet exemple particulier exporte le com.sunsetlakesoftware.molecules.pdb UTI avec l'extension de fichier .pdb, correspondant au type MIME chemical/x-pdb.

Une fois cela mis en place, votre application sera capable de gérer les documents joints à des courriels ou à partir d'autres applications du système. Dans Mail, vous pouvez appuyer longuement pour afficher une liste d'applications pouvant ouvrir une pièce jointe particulière.

Lorsque la pièce jointe est ouverte, votre application sera lancée et vous devrez gérer le traitement de ce fichier dans votre méthode de délégué -application:didFinishLaunchingWithOptions:. Il semble que les fichiers chargés de cette manière à partir de Mail soient copiés dans le répertoire Documents de votre application, dans un sous-répertoire correspondant à la boîte aux lettres dans laquelle ils sont arrivés. Vous pouvez obtenir l'URL de ce fichier dans la méthode de délégation de l'application à l'aide du code suivant:

NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];

Notez que c’est la même approche que nous avons utilisée pour gérer les modèles d’URL personnalisés. Vous pouvez séparer les URL de fichiers des autres en utilisant un code similaire à celui-ci:

if ([url isFileURL])
{
    // Handle file being passed in
}
else
{
    // Handle custom URL scheme
}
402
Brad Larson

En plus de l'excellente réponse de Brad, j'ai découvert que (sous iOS 4.2.1 au moins) lors de l'ouverture de fichiers personnalisés à partir de l'application Mail, votre application n'est pas déclenchée ni notifiée si la pièce jointe a déjà été ouverte. La fenêtre "Ouvrir avec ..." apparaît, mais ne fait rien.

Cela semble être corrigé en déplaçant (à nouveau) le fichier du répertoire de la boîte de réception. Une approche sûre semble être à la fois de (re) déplacer le fichier lorsqu’il est ouvert (dans -(BOOL)application:openURL:sourceApplication:annotation:) et de parcourir le répertoire Documents/Inbox en supprimant tous les éléments, par exemple. dans applicationDidBecomeActive:. Cette dernière fourre-tout peut être nécessaire pour que l'application soit à nouveau en état de nettoyage, au cas où une importation précédente provoquerait un blocage ou serait interrompue.

24
mvds

GRAND AVERTISSEMENT: Assurez-vous que votre pourcentage n'est pas déjà lié à un type MIME.

Nous avons utilisé l'extension ".icz" pour nos fichiers personnalisés pour, fondamentalement, jamais, et Safari ne vous laisserait jamais les ouvrir en disant "Safari ne peut pas ouvrir ce fichier". peu importe ce que nous avons fait ou essayé avec le UT ci-dessus.

Finalement, j'ai réalisé qu'il y avait quelques fonctions UT * C que vous pouvez utiliser pour explorer diverses choses, et bien que .icz donne la bonne réponse (notre application):

Dans l'application ne se charge en haut, il suffit de faire ceci ...

NSString * UTI = (NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, 
                                                                   (CFStringRef)@"icz", 
                                                                   NULL);
CFURLRef ur =UTTypeCopyDeclaringBundleURL(UTI);

et mettez pause après cette ligne et voyez ce que sont UTI et ur - dans notre cas, c’était notre identifiant comme nous le souhaitions), et l’URL du paquet (ur) pointait vers le dossier de notre application.

Mais le type MIME que Dropbox nous renvoie pour notre lien, que vous pouvez vérifier en effectuant, par exemple,.

$ curl -D headers THEURLGOESHERE > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 27393  100 27393    0     0  24983      0  0:00:01  0:00:01 --:--:-- 28926
$ cat headers
HTTP/1.1 200 OK
accept-ranges: bytes
cache-control: max-age=0
content-disposition: attachment; filename="123.icz"
Content-Type: text/calendar
Date: Fri, 24 May 2013 17:41:28 GMT
etag: 872926d
pragma: public
Server: nginx
x-dropbox-request-id: 13bd327248d90fde
X-RequestId: bf9adc56934eff0bfb68a01d526eba1f
x-server-response-time: 379
Content-Length: 27393
Connection: keep-alive

Le type de contenu est ce que nous voulons. Dropbox affirme qu'il s'agit d'une entrée de texte/calendrier. Génial. Mais dans mon cas, j'ai déjà essayé de placer du texte/calendrier dans les types MIME de mon application, et cela ne fonctionne toujours pas. Au lieu de cela, lorsque j'essaie d'obtenir l'UTI et l'URL de l'offre groupée pour le type MIME texte/calendrier,

NSString * UTI = (NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType,
                                                                   (CFStringRef)@"text/calendar", 
                                                                   NULL);

CFURLRef ur =UTTypeCopyDeclaringBundleURL(UTI);

Je vois "com.Apple.ical.ics" en tant que UTI et ".../MobileCoreTypes.bundle /" en tant qu'URL d'ensemble. Pas notre application, mais Apple. J'essaie donc de mettre com.Apple.ical.ics dans les LSItemContentTypes à côté du mien, et dans UTConformsTo dans l'exportation, mais rien ne va.

Donc, fondamentalement, si Apple pense qu’ils veulent un jour gérer un type de fichier (qui pourrait être créé 10 ans après la mise en ligne de votre application, n’oubliez pas), vous devrez changer d’extension, car ils ' ll ne vous laissera tout simplement pas gérer le type de fichier.

18
Kalle