web-dev-qa-db-fra.com

Partager des données entre deux applications iPhone ou plus

Est-il possible de partager des données entre deux applications sur le même appareil?

Ou puis-je autoriser une autre application à utiliser les informations/données de mon application ou de toute autre manière?

Par exemple, la première application concerne la gestion d'événements et je l'utilise pour enregistrer un événement. La deuxième application est destinée aux rappels, qui obtiendront des données de l’autre application afin de me rappeler de l’événement.

Ceci est juste un exemple simple, pas un scénario réel.

75
Kamleshwar

Historiquement, l'iPhone a essayé d'empêcher le partage de données entre les applications. L'idée était que si vous ne pouviez pas obtenir les données d'une autre application, vous ne pouviez rien faire de mal à cette application.

Dans les dernières versions d'IOS, ils ont un peu assoupli cette tâche. Par exemple, le guide de programmation iOS contient maintenant une section sur la transmission de données entre applications en demandant à une application de spécifier un préfixe d'URL, puis à faire référence à cette URL par d'autres applications. Vous pouvez donc peut-être paramétrer votre application d'événements pour qu'elle réponde aux URL "événement: //" de la même manière qu'un serveur Web répond pour les URL "http: //".

La documentation d'Apple sur cette approche est ici .

Jetez un coup d’œil sous "Implémentation de modèles d’URL personnalisés".

33
baudot

Dans le monde en mode bac à sable du développement iOS, le partage de données entre applications peut s'avérer difficile. En effet, les développeurs iOS ne peuvent pas partager de données directement via le système de fichiers , ils doivent trouver d'autres solutions pour leurs applications. Certaines solutions communes incluent:

  • UIDocumentInteractionController

  • UIActivityViewController

  • Accès au trousseau partagé

  • Schéma d'URL personnalisé

  • Service Web

  • aPI iCloud


UIDocumentInteractionController:

Permet à l'utilisateur d'ouvrir un document dans n'importe quelle autre application permettant de gérer un document particulier Identificateur de type uniforme (UTI).

UIDocumentInteractionController a déjà été utilisé pour ouvrir un document dans d'autres applications du périphérique, par exemple pour ouvrir des pièces jointes à des courriers électroniques à partir de l'application Mail.

UIDocumentInteractionController

Malheureusement, l’interface utilisateur de UIDocumentInteractionController ’n’affiche que six applications.

Vous ne pouvez pas garantir que votre candidature apparaîtra dans la liste. Bien que UIDocumentInteractionController n’ait pas été déconseillé, le UIActivityViewController propose un remplacement plus souple à partir d’iOS 6.0.

Disponibilité: iOS 3.2+

Avantages:

  • Permet le partage de types de données communs avec un large éventail d'applications.

Inconvénients:

  • Permet de contrôler le type de données envoyées à UIDocumentInteractionController, mais pas les destinations.

  • Requiert une interaction utilisateur supplémentaire.

  • Le nombre limité de destinations de données peut empêcher votre application de s'afficher dans la liste.


UIActivityViewController:

Permet à l'utilisateur d'effectuer un certain nombre d'actions avec un tableau de données.

Par exemple, ils peuvent imprimer, envoyer par courrier électronique, copier, publier sur des médias sociaux ou s'ouvrir dans une autre application.

Vous pouvez créer vos propres sous-classes UIActivity pour fournir des services personnalisés à l'utilisateur.

UIActivityController

Disponibilité: iOS 6.0+

Avantages:

  • Idéal pour partager des types de données communs avec un large éventail d'applications et de médias sociaux.

  • Peut fournir un tableau d'éléments à appliquer à une activité. Les objets doivent être conformes au protocole UIActivityItemSource.

  • A la capacité de définir les types d'activité exclus.

  • L'interface utilisateur de pagination autorise davantage de destinations de données que UIDocumentInteractionController.

Inconvénients:

  • Vous devez définir un type d'activité personnalisé pour limiter les destinations "Ouvrir dans…" des types de données courants.

  • Nécessite une interaction utilisateur supplémentaire.


Accès au trousseau partagé:

Vous permet de stocker en toute sécurité des données sur un trousseau partagé auquel d'autres applications faisant partie d'une suite d'applications peuvent accéder.

Toutes les applications partageant un accès au trousseau doivent utiliser le même préfixe d'identifiant d'application.

Pour un exemple d’accès au trousseau partagé en action. Voir exemple de code Apple GenericKeychain .

Shared Key Chain

Disponibilité: iOS 3.0+

Avantages:

  • Accès sécurisé aux données.

Inconvénients:

  • Vous ne pouvez partager des données qu'entre des applications partageant un préfixe d'identifiant d'application commun.

  • L'API du trousseau sur le simulateur iOS provient d'OS X, qui possède une API différente de celle du périphérique iOS.


Schéma d'URL personnalisé:

Permet aux données de passer entre les applications à l'aide d'URL simples.

Custom URL Scheme

Disponibilité: iOS 3.0+

Avantages:

  • Aucune connexion réseau requise.
  • Idéal pour les petites quantités de données que vous pouvez facilement encoder dans une URL légale échappée.

Inconvénients:

  • Vous devez encoder des données dans une URL légale échappée.

    Note: Le codage base64 a été utilisé couramment pour transformer des données sérialisables en une valeur de chaîne. Toutefois, les chaînes base64 peuvent inclure des caractères non utilisables dans les URL. Vous pourriez envisager d'utiliser base64url. Voir Encodage en base 64 avec URL et nom de fichier Safe Alphabet pour plus d'informations.


aPI iCloud:

Tout le monde sait ce qu'est iCloud, le pour et le contre, donc plus d'explications à cela.

Mais on peut se demander comment il est possible de partager des données entre des applications d’un même appareil. Il existe des solutions pour y parvenir.

iCloud

Cela est possible car l'identifiant utilisé pour iCloud est différent de l'identifiant de l'ensemble, il est donc possible de partager des images, des vidéos et d'autres documents.

Pour en savoir plus voir la discussion à ce sujet


Service Web:

Synchronisez les données via un tiers (par exemple Dropbox) ou un service Web personnalisé.

web service

Disponibilité: iOS 2.0+

Avantages:

  • Utile pour partager et distribuer de grandes quantités de données.

Inconvénients:

  • Nécessite une connexion réseau.
  • Surcharge de mise en œuvre du service Web.

Référence

95
Durai Amuthan.H

De iOS 8 J'ai réussi à accéder au même dossier en utilisant "fonctionnalité du groupe d'applications." J'étends la réponse de @siejkowski.

Note: Cela fonctionnera à partir du même compte développeur.

Pour cela, vous devez suivre les étapes ci-dessous.

  1. activez d'abord "Groupes d'applications" à partir de votre compte développeur.
  2. Générer un profil de provisioning. et l'utiliser.

Maintenant, vous devez créer deux applications. Nom de l'échantillon

  1. Demo_Share_One
  2. Demo_Share_Two

Nous copions maintenant les images de Demo_Share_One dans le dossier de partage créé par défaut lorsque vous activez App Groups et exécutez app. et accédera à toutes ces images de Demo_Share_Two.

Vous devez prendre le nom du groupe qui a été défini sur votre compte de développeur.lets disent group.filesharingdemo.

Ajoutez la méthode ci-dessous dans les deux applications pour obtenir le chemin relatif de l'URL du dossier de partage.

- (NSString *) getSharedLocationPath:(NSString *)appGroupName {
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSURL *groupContainerURL = [fileManager containerURLForSecurityApplicationGroupIdentifier:appGroupName];
    return [groupContainerURL relativePath];
}

Maintenant, nous copions les images du lot de Demo_Share_One

-(IBAction)writeImage:(id)sender
{
    for (int i = 0; i<15; i++) 
    {
        NSString *strSourcePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"hd%d",i+1] ofType:@"jpg"];
        NSString *strDestinationPath = [[self getSharedLocationPath:@"group.filesharingdemo"] stringByAppendingPathComponent:[NSString stringWithFormat:@"hd%d",i+1]] ;

        BOOL filewrite = [[NSFileManager defaultManager]copyItemAtPath:strSourcePath toPath:strDestinationPath error:nil];
        if (filewrite)
            NSLog(@"File write");
        else
            NSLog(@"can not write file");
    }
}

Maintenant dans Demo_Share_Two pour accéder à ces images

NSString *pathShared = [[self getSharedLocationPath:@"group.filesharingdemo"] stringByAppendingPathComponent:[NSString stringWithFormat:@"hd%d.jpg",number]];
NSLog(@"%@",pathShared);
//BOOL fileExist = [[NSFileManager defaultManager] fileExistsAtPath:pathShared];
imgView.image = [UIImage imageWithContentsOfFile:pathShared];

Et maintenant, vous obtiendrez toutes les images sur lesquelles vous écrivez Demo_Share_One.

Donc, à partir de maintenant, si vous voulez partager ce dossier avec votre troisième application. Ajoutez simplement cette application dans votre groupe. Il est donc trop facile d'accéder aux mêmes éléments dans Vos applications multiples.

si vous n'activez pas les groupes d'applications dans votre AppID, vous obtiendrez alors [self getSharedLocationPath: @ "group.filesharingdemo"] est null.

Merci à Apple pour la fonctionnalité de partage d'éléments depuis vos propres applications . Happy Coding. :)

50

Depuis iOS 8, vous pouvez facilement partager des données entre des applications tant qu'elles sont dans le groupe d'applications commun.

La documentation Apple l'explique le mieux dans le contexte Extensions: https://developer.Apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

En gros, vous devez:

  1. Définir l'ID du groupe d'applications (dans Certificats, identifiants et profils de Centre des membres pour votre Apple.
  2. Activer la fonctionnalité Groupes d’applications en spécifiant l’ID de groupe d’applications ci-dessus pour chaque application devant communiquer (cen se fait soit en Xcode: Cible -> Capacités ou à Member Center ).
  3. Utilisez l'une des deux API pour l'accès au conteneur partagé.

La première API est basée sur NSUserDefaults:

NSString *appGroupId = @"group.my.group.id";

NSUserDefaults *myDefaults = [[NSUserDefaults alloc] 
                    initWithSuiteName:appGroupId];

[myDefaults setObject:@"foo" forKey:@"bar"];

La deuxième API est basée sur NSFileManager. C'est simplement un dossier partagé auquel vous pouvez accéder après avoir obtenu son URL:

NSString *appGroupId = @"group.my.group.id";

NSURL *sharedFolderURL = [[NSFileManager defaultManager] 
                           containerURLForSecurityApplicationGroupIdentifier:appGroupId];

Tout ce que vous mettez à l'intérieur de myDefaults ou du dossier désigné par sharedFolderURL sera visible et accessible pour toutes vos applications.

En cas de dossier, écrivez/lisez de manière atomique pour vous assurer que rien ne sera bloqué.

16
siejkowski

Partager des données entre applications possible? Oui, ça l'est!

Utilisez UIPasteBoard disponible depuis iOS 3.0, la documentation est disponible ici . Apple disent:

La classe UIPasteboard permet à une application de partager des données au sein de l'application ou avec une autre application à l'aide de tableaux de montage spécifiques au système ou à l'ensemble du système.

Il est également possible de partager des données entre des applications dans le trousseau, bien que les données soient avant tout des mots de passe et que tout ce qui peut être sérialisé puisse être stocké. Ici est une question de débordement de pile à ce sujet.

14
JugsteR

Vous pouvez utiliser un schéma d'URL personnalisé pour accéder aux données d'une application à une autre. Suivez le lien mentionné ci-dessous pour plus d'informations -

http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html

4
PawanShakya

Indiquez que le partage de données entre des applications via UIPasteBoard ne fonctionne que pour les applications du même groupe d'applications dans iOS7. Comme les pommes dit:

+ [UIPasteboard pasteboardWithName: create:] et + [UIPasteboard pasteboardWithUniqueName] attribuent désormais un nom unique au nom donné pour autoriser uniquement les applications du même groupe d'applications à accéder au pasteboard. Si le développeur tente de créer un presse-papiers avec un nom existant et qu'il ne fait pas partie de la même suite d'applications, il obtiendra son propre presse-papiers unique et privé. Notez que cela n’affecte pas les tableaux de classement fournis par le système, général et find.

3
MasterBeta

Vous pouvez utiliser https://github.com/burczyk/Camouflage pour lire et écrire NSData sur un appareil photo iOS en tant que fichier .bmp et le partager entre les applications :)

Nouvelle solution!

3
Kamil

Si cela ne vous dérange pas de toucher le réseau, vous pouvez implémenter un service Web personnalisé ou utiliser un service cloud. iCloud lui-même ne sera pas d'une grande utilité ici; il vous permet uniquement de partager des données entre la même application sur différents appareils. Vous pouvez lire sur iCloud ici .

Sans utiliser le réseau, vous pouvez exploiter " changement rapide d'application " pour transférer un nombre limité de données entre des applications via le codage d'URL. Je ne connais pas la quantité réelle de données transférables, mais je suis sûre que ce serait très limité.

Les réponses de JugsteR et de baudot sont meilleures dans ce cas.

2
QED