partager données entre différentes applications

fingerupfingerup Membre
12:17 modifié dans API UIKit #1
Bonjour à  tous,

Je voudrais savoir si il est possible de partager des données entre différente application iPhone.
A la fermeture d'une appli je sauvegarde une NSMutableArray avec la classe NSKeyedArchiver.
<br />-(void) applicationWillTerminate:(UIApplication *)application{<br />	NSMutableData *keyedArchiveData = [NSMutableData data];<br />	NSKeyedArchiver *keyedArchiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:keyedArchiveData] autorelease];<br />	[keyedArchiver encodeObject:personne forKey:[@&quot;presonne&quot;];<br />	[keyedArchiver finishEncoding];<br /><br />	NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );<br />	NSString *documentDirectory = [documentDirectories objectAtIndex:0];<br />	NSString *keyedArchiveFilename =&nbsp; [documentDirectory stringByAppendingPathComponent:@&quot;personne.keyedArchive&quot;];<br /><br />	[keyedArchiveData writeToFile:keyedArchiveFilename atomically:YES];<br />}<br />

Est il possible de récupérer mon fichier "personne.keyedArchive" dans une autre application, pour pouvoir récupérer mon tableau de personnes.

Je penses que non chaque application à  son répertoire très fermé ou seule elle peut y accéder. C'est ça?

Comment je pourrais faire??? Avec SQLlite je peux partager donner entre plusieurs appli?

Est il possible de partager donné entre différente appli?? J'ai bien peur que non...

Merci a vous..

Réponses

  • LastikoLastiko Membre
    12:17 modifié #2
    je vais peut etre dire une conenrie mais tu dois surement y arriver avec les donnees push
  • zoczoc Membre
    12:17 modifié #3
    dans 1265659442:

    Est il possible de partager donné entre différente appli?? J'ai bien peur que non...

    Le seul moyen de partager des informations entre application, c'est le presse-papiers, ou alors passer par un serveur externe capable de les stocker.


    PS: Le push n'a rien à  voir avec tout ça  :D
  • LastikoLastiko Membre
    12:17 modifié #4
    dans 1265661413:

    dans 1265659442:

    Est il possible de partager donné entre différente appli?? J'ai bien peur que non...

    Le seul moyen de partager des informations entre application, c'est le presse-papiers, ou alors passer par un serveur externe capable de les stocker.


    PS: Le push n'a rien à  voir avec tout ça  :D


    c'est pour ca que je disais "je vais peut etre dire une conenrie" :D
  • AliGatorAliGator Membre, Modérateur
    12:17 modifié #5
    Avec NSURL tu peux à  la limite t'en sortir. Si c'est utilisé de façon privée (un URL scheme que toi seul connait et donc tu connais les limitations, à  la limite pourquoi pas faire passer tes données dessus ?

    Communicating with other applications.

    C'est plutôt conseillé de partager des URL ou des URIs (au sens propre : Universal Resource Locator/Identifier, donc identifieur/localisateur de ressource, donc que l'URL indique une action/un identifiant/un emplacement vers une ressource) plutôt que la ressource elle-même, mais bon selon la taille de tes données ça peut être acceptable.

    J'ai testé, ça marche très bien. Du moins pour des petites chaà®nes.
    Maintenant si ce ne sont pas des chaà®nes que tu veux envoyer, c'est moins simple : il faut sérialiser tes données et t'assurer que cette sérialisation ne contient que des données valides pour une NSURL. Le plus simple pour faire ça étant de sérialiser ça en NSData puis de récupérer la représentation base64 de ces dernières, mais selon tes données à  partager il y a peut-être plus optimal.
  • AliGatorAliGator Membre, Modérateur
    février 2010 modifié #6
    Un exemple pour envoyer un NSDictionary d'une appli à  l'autre via NSURL (j'ai choisi "pcom:" comme nom de URL scheme, c'est totalement arbitraire, tu mets ce que tu veux pour ton cas) :

    1) Dans l'appli qui veut envoyer le NSDict :
    <br />-(IBAction)sendToOtherApp<br />{<br />	NSDictionary* objectToSend = [NSDictionary dictionaryWithObjectsAndKeys:<br />							&nbsp; [NSNumber numberWithFloat:1.2f],@&quot;version&quot;,<br />							&nbsp; textView.text,@&quot;text&quot;,<br />							&nbsp; nil];<br />	<br />	// Serialize to NSData then encode to a base64 string<br />	NSData* serializedData = [NSPropertyListSerialization dataFromPropertyList:objectToSend<br />									format:NSPropertyListBinaryFormat_v1_0<br />							&nbsp; 	errorDescription:nil];<br />	NSString* b64data = [serializedData base64encode];<br />	<br />	// Send the data over a custom &quot;pcom:&quot; URL<br />	NSURL* sURL = [NSURL URLWithString:[NSString stringWithFormat:@&quot;pcom:%@&quot;,b64data]];<br />	[[UIApplication sharedApplication] openURL:sURL];<br />}
    


    2) dans le AppDelegate de l'application receveuse, implémenter le code :
    - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url<br />{<br />	NSString* b64String = [url resourceSpecifier]; // contient le texte après le &quot;:&quot; du scheme de l&#39;URL, donc après le &quot;pcom:&quot;<br />	// Decode base64-received string to an NSData<br />	NSData* serializedData = [b64String base64decode];<br />	// Unserialize data to an NSDictionary object<br />	NSDictionary* receivedObject = [NSPropertyListSerialization propertyListFromData:serializedData<br />									mutabilityOption:NSPropertyListImmutable<br />										&nbsp; format:NULL<br />									errorDescription:NULL];<br />	<br />	NSLog(@&quot;receivedObject: %@&quot;,receivedObject);<br />	<br />	return YES;<br />}
    

    3) Toujours dans l'appli receveuser, déclarer que cette appli sait gérer les URLs de type "pcom:". Pour cela, aller dans le Info.plist de l'appli, et rajouter une entrée pour "URL Types" (c'est une entrée prédéfinie, il va proposer de suite un tableau avec une entrée). Dans l'Item 0 de ce "URL Types", rentrer un identifiant pour ce URL scheme en face de "URL Identifier", par exemple "com.pommedev.datasharing.pcom", et rajouter une entrée "URL Schemes" avec comme scheme la valeur "pcom" (puisqu'on veut gérer les URLs de type "pcom:"



    Et voilà . Chez moi ça marche nickel. Petites notes tout de même :
    • Pour sérialiser mon NSDictionary en NSData, j'ai utilisé NSPropertyListSerialisation qui est fait pour ça. Il gère tous les objets pouvant être mis dans un plist, donc NSDict, NSArray, NSData, NSString, NSDate et NSNumber. Si tu as d'autres types à  encoder, tu peux utiliser autre chose, comme NSCoder. cf Archives & Serialization Programming Guide si besoin.
    • pour encoder le NSData en une chaà®ne en base64, j'ai utilisé du code que j'avais récupéré d'un site et refactorisé un peu pour avoir des catégories de NSString et NSData, jointes à  ce message. Cet encodage est nécessaire car les NSURLs ne peuvent prendre que des chaà®nes composés de caractères imprimables. Pour l'utiliser, il suffit de l'inclure au projet et de #importer "Base64Additions.h" pour en utiliser les méthodes.



    Bien sûr, si ce sont des NSData directement à  envoyer, pas besoin de les sérialiser, juste besoin de l'encoder en base64 pour en avoir une chaà®ne. Si c'est une NSString directement, c'est encore plus simple. Si c'est un NSArray d'entiers, autant utiliser [array componentsSeparatedByString:@|] par exemple pour avoir une chaà®ne de ces entiers séparés par "|", ... bref, autant adapter pour que ça colle au mieux à  ton cas sans rendre le code complexe inutilement. Là  le code mis est le plus générique possible, mais selon ton cas il peut y avoir plus simple.
  • fingerupfingerup Membre
    12:17 modifié #7
    Un grand merci pour ces réponses précises.
    Tout ça es bien intéressant.

    Si je comprend bien en ouvrant l'url "pcom:" ça va fermer ma 1er appli ouvrir la 2eme appli en lui passant mon objet serialisé dans le reste de l'URL.
    Une fois ouverte ma 2eme appli lit l'url et désérialise mon objet.

    Mais il n'est donc pas possible de partager une même ressource. Ou alors via le réseau comme le dit zoc.

    Merci à  vous, je garde cette histoire d'url scheme de coté ça servira.

    MERCI
  • AliGatorAliGator Membre, Modérateur
    février 2010 modifié #8
    Oui, c'est tout à  fait comme ça que ça marche.

    Après ça dépend ce que tu appelles "partager une même ressource".
    Par exemple là  j'ai passé un NSDictionary. Quand j'ai testé le code chez moi avant de poster, j'ai même testé en rajoutant dans ce NSDictionary une UIImage (enfin les NSData récupérées par la UIImageJPEGRepresentation de cette UIImage), et ça marche bien aussi : j'ai ainsi pu avoir une image dans une appli et l'envoyer dans une autre.

    Maintenant, partager effectivement une ressource commune, c'est à  dire que, quelle que soit l'appli que tu lances (app1 ou app2), ces dernières auront accès à  la même ressource (tu lances app1, tu modifies ta ressource, tu quittes va autre part, etc... puis plus tard lances manuellement app2 et espère avoir accès à  la version modifiée de ta ressource), alors en effet ma solution ne marche pas.

    A voir si y'a pas d'autres astuces pour avoir une ressource commune entre 2 apps, mais j'en doute fort, puisque c'est le propre du principe de la Sandbox sur iPhone.

    Je viens d'avoir une petite idée je vais tester un truc pour voir si ça marche... mais je sais pas si c'est le genre accepté par Apple en même temps.
    [EDIT]Bon j'ai rien dit l'astuce à  laquelle je pensais ne marche pas (et ça m'étonne pas vraiment en fait)
Connectez-vous ou Inscrivez-vous pour répondre.