44 votes

Ajout de l'option "Ouvrir dans..." à l'application iOS

Sur les appareils iOS, l'application Mail propose l'option "Ouvrir dans..." pour les pièces jointes. Les applications répertoriées ont enregistré leurs CFBundleDocumentTypes auprès du système d'exploitation. Je me demande comment mon application pourrait permettre aux utilisateurs d'ouvrir des fichiers générés par mon application dans d'autres applications. Mail est-elle la seule application qui offre cette fonctionnalité ?

37voto

Jay O'Conor Points 1911

Jetez un coup d'œil à la Interaction des documents Sujets de programmation pour iOS : Enregistrement des types de fichiers pris en charge par votre application .

Tant que vous fournissez vos types de documents dans votre Info.plist, les autres applications qui reconnaissent ce type de document listeront votre application dans leurs choix "Ouvrir dans". Bien entendu, cela suppose que votre application crée des documents que les autres applications peuvent ouvrir.

19voto

wzbozon Points 2851

Ce site est un excellent tutoriel, qui m'a aidé.

J'ai ajouté le support pour *.xdxf dans mon application. En bref, vous devez faire deux choses. Premièrement, ajoutez des entrées comme celle-ci dans le fichier Plist archivo:

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>XDXF Document</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>com.alwawee.xdxf</string>
        </array>
    </dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeDescription</key>
        <string>XDXF - XML Dictionary eXchange Format</string>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.text</string>
        </array>
        <key>UTTypeIdentifier</key>
        <string>com.alwawee.xdxf</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <string>xdxf</string>
            <key>public.mime-type</key>
            <string>text/xml</string>
        </dict>
    </dict>
</array>

Ici, vous devez ajouter UTExportedTypeDeclarations seulement si votre type de fichier est unique. Ou, en d'autres termes, n'est pas aquí .

Deuxièmement - gérer la méthode du délégué dans AppDelegate :

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{

    if (url != nil && [url isFileURL]) {

        //  xdxf file type handling

        if ([[url pathExtension] isEqualToString:@"xdxf"]) {

            NSLog(@"URL:%@", [url absoluteString]);

        }

    }

    return YES;
}

4voto

user2962499 Points 8

Afin d'être visible dans la liste des "ouvrir dans..." pour tous les fichiers, vous devez ajouter ceci à votre plist

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>Open All Files</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSItemContentTypes</key>
        <array>
           <string>public.content</string>
           <string>public.data</string>
        </array>
    </dict>
</array>

Une fois que votre application s'affiche dans "open in...", vous devez charger ce fichier. La plupart des sites web montrent à implémenter cette fonction :

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject?) -> Bool
{
   println("Open URL "+url.path!)
}

Mais cette fonction qui fonctionnait bien sous IOS 7 se bloque sous IOS 8. J'ai dû implémenter la fonction suivante à la place pour qu'elle fonctionne.

func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool 
{
   println("Open URL "+url.path!)
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X