wake-up-neo.com

Teilen Sie Daten zwischen zwei oder mehr iPhone-Anwendungen

Ist es möglich, Daten zwischen zwei Anwendungen auf demselben Gerät auszutauschen?

Oder kann ich zulassen, dass eine andere Anwendung die Informationen/Daten meiner Anwendung oder auf andere Weise verwendet?

Zum Beispiel ist die erste Anwendung für die Ereignisverwaltung und ich verwende sie, um ein Ereignis zu speichern. Die zweite Anwendung ist für Erinnerungen gedacht, die Daten von der anderen Anwendung abrufen, um mich an das Ereignis zu erinnern.

Dies ist nur ein einfaches Beispiel, kein reales Szenario.

75
Kamleshwar

In der Vergangenheit hat das iPhone versucht, den Datenaustausch zwischen Apps zu verhindern. Die Idee war, dass man nichts Schlechtes mit der App anstellen kann, wenn man nicht auf die Daten einer anderen App zugreifen kann.

In den letzten Versionen von IOS haben sie das etwas gelockert. Beispielsweise enthält das iOS-Programmierhandbuch jetzt einen Abschnitt zum Übertragen von Daten zwischen Apps, in dem eine App ein bestimmtes URL-Präfix beansprucht und dann andere Apps auf diese URL verweisen. Vielleicht stellen Sie Ihre Event-App so ein, dass sie auf URLs mit dem Namen "event: //" antwortet, wie ein Webserver auf URLs mit dem Namen "http: //" antwortet.

Apples Dokumentation dieses Ansatzes ist hier .

Werfen Sie einen Blick unter "Implementieren benutzerdefinierter URL-Schemata".

33
baudot

In der Sandbox-Welt der iOS-Entwicklung kann sich das Teilen von Daten zwischen Anwendungen als schwierig erweisen, da iOS-Entwickler Daten nicht direkt über das Dateisystem teilen können. ) müssen sie alternative Lösungen für ihre Anwendungen finden. Einige gängige Lösungen umfassen:

  • UIDocumentInteractionController

  • UIActivityViewController

  • Gemeinsamer Schlüsselbundzugriff

  • Benutzerdefiniertes URL-Schema

  • Internetservice

  • iCloud API


UIDocumentInteractionController:

Ermöglicht dem Benutzer das Öffnen eines Dokuments in einer anderen Anwendung, in der registriert wird, dass ein bestimmtes Dokument verarbeitet werden kann Uniform Type Identifier (UTI).

Der UIDocumentInteractionController wurde in der Vergangenheit zum Öffnen eines Dokuments in anderen Anwendungen auf dem Gerät verwendet, z. B. zum Öffnen von E-Mail-Anhängen über die Mail-App.

UIDocumentInteractionController

Leider zeigt die Benutzeroberfläche von UIDocumentInteractionController nur sechs Anwendungen an.

Sie können nicht garantieren, dass Ihre Bewerbung in der Liste erscheint. Während der UIDocumentInteractionController nicht veraltet ist, bietet der UIActivityViewController ab iOS 6.0 einen flexibleren Ersatz.

Verfügbarkeit: iOS 3.2+

Profis:

  • Ermöglicht die gemeinsame Nutzung gängiger Datentypen mit einer Vielzahl von Anwendungen.

Nachteile:

  • Ermöglicht die Steuerung des Datentyps, der an den UIDocumentInteractionController gesendet wird, nicht jedoch der Ziele.

  • Erfordert zusätzliche Benutzerinteraktion.

  • Eine begrenzte Anzahl von Datenzielen kann dazu führen, dass Ihre Anwendung nicht in der Liste angezeigt wird.


UIActivityViewController:

Ermöglicht dem Benutzer, eine Reihe von Aktionen mit einem Array von Daten auszuführen.

Sie können beispielsweise drucken, per E-Mail versenden, kopieren, in sozialen Medien veröffentlichen oder in einer anderen Anwendung öffnen.

Sie können Ihre eigenen UIActivity-Unterklassen erstellen, um dem Benutzer benutzerdefinierte Dienste bereitzustellen.

UIActivityController

Verfügbarkeit: iOS 6.0+

Profis:

  • Hervorragend für die gemeinsame Nutzung gängiger Datentypen mit einer Vielzahl von Anwendungen und sozialen Medien.

  • Kann eine Reihe von Elementen für die Anwendung auf eine Aktivität bereitstellen. Objekte sollten dem UIActivityItemSource-Protokoll entsprechen.

  • Kann ausgeschlossene Aktivitätstypen festlegen.

  • Die Paging-Benutzeroberfläche ermöglicht mehr Datenziele als UIDocumentInteractionController.

Nachteile:

  • Sie müssen einen benutzerdefinierten Aktivitätstyp definieren, um "Öffnen in ..." - Ziele mit allgemeinen Datentypen einzuschränken.

  • Erfordert zusätzliche Benutzerinteraktion.


Gemeinsamer Schlüsselbundzugriff:

Ermöglicht das sichere Speichern von Daten in einem freigegebenen Schlüsselbund, auf den andere Anwendungen, die Teil einer Anwendungssuite sind, zugreifen können.

Alle Anwendungen, die den Schlüsselbundzugriff gemeinsam nutzen, müssen dasselbe App-ID-Präfix verwenden.

Ein Beispiel für den gemeinsamen Schlüsselbundzugriff in Aktion. Siehe Apple's GenericKeychain-Beispielcode .

Shared Key Chain

Verfügbarkeit: iOS 3.0+

Profis:

  • Sicherer Zugriff auf Daten.

Nachteile:

  • Sie können Daten nur für Anwendungen freigeben, die ein gemeinsames App-ID-Präfix verwenden.

  • Die Schlüsselbund-API im iOS-Simulator stammt aus OS X, das eine andere API als das iOS-Gerät hat.


Benutzerdefiniertes URL-Schema:

Ermöglicht die Übertragung von Daten zwischen Anwendungen mithilfe einfacher URLs.

Custom URL Scheme

Verfügbarkeit: iOS 3.0+

Profis:

  • Keine Netzwerkverbindung erforderlich.
  • Hervorragend geeignet für kleine Datenmengen, die Sie problemlos in eine zulässige URL mit Escapezeichen codieren können.

Nachteile:


iCloud API:

Jeder weiß, was iCloud ist, Vor-und Nachteile, also keine Erklärung mehr dafür.

Aber man könnte fragen, wie es möglich ist, Daten zwischen Anwendungen innerhalb eines einzelnen Geräts auszutauschen. Es gibt einige Problemumgehungen, um dies zu erreichen.

iCloud

Dies ist möglich, da sich die für iCloud verwendete ID von der Bundle-ID unterscheidet, sodass Bilder, Videos und andere Dokumente gemeinsam genutzt werden können.

Um mehr zu erfahren siehe die Diskussion zu diesem Thema


Internetservice:

Synchronisieren Sie Daten über einen Drittanbieter (z. B. Dropbox) oder einen benutzerdefinierten Webdienst.

web service

Verfügbarkeit: iOS 2.0+

Profis:

  • Nützlich zum Teilen und anderweitigen Verteilen großer Datenmengen.

Nachteile:

  • Benötigt eine Netzwerkverbindung.
  • Overhead bei der Implementierung von Web-Services.

Referenz

95
Durai Amuthan.H

Von iOS 8 Ich habe mit "App Group Functionality." erfolgreich auf denselben Ordner zugegriffen. Ich erweitere die Antwort von @siejkowski.

Hinweis: Es funktioniert nur mit demselben Entwicklerkonto.

Dazu müssen Sie die folgenden Schritte ausführen.

  1. aktivieren Sie zuerst "App Groups" in Ihrem Entwicklerkonto.
  2. Bereitstellungsprofil generieren. und benutze es.

Jetzt müssen Sie zwei Apps erstellen. Probenname

  1. Demo_Share_One
  2. Demo_Share_Two

Jetzt kopieren wir Bilder von Demo_Share_One in den Freigabeordner, der standardmäßig erstellt wird, wenn Sie App-Gruppen aktivieren und die App ausführen. und greift auf alle diese Bilder von Demo_Share_Two zu.

Sie müssen den Gruppennamen verwenden, der für Ihr Entwicklerkonto festgelegt wurde. Die Kleinigkeiten lauten group.filesharingdemo.

Fügen Sie die Methode Below in Beide Apps hinzu, um den relativen Pfad der Freigabeordner-URL abzurufen.

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

Jetzt kopieren wir Bilder aus dem Bundle von 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");
    }
}

Jetzt in Demo_Share_Two, um auf diese Bilder zuzugreifen

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];

Und jetzt bekommst du alle Bilder, von denen du schreibst Demo_Share_One.

Also ab sofort, wenn Sie diesen Ordner zwei Ihre dritte App teilen möchten. Füge diese App einfach deiner Gruppe hinzu. Daher ist es zu einfach, in Your Multiple Apps auf dieselben Elemente zuzugreifen.

wenn Sie in Ihrer AppID keine App-Gruppen aktivieren, erhalten Sie [self getSharedLocationPath: @ "group.filesharingdemo"] mit dem Wert null.

Vielen Dank an Apple für Teile Elemente aus deiner eigenen App-Funktionalität . Happy Coding. :)

Seit iOS 8 können Sie problemlos Daten zwischen Apps austauschen, sofern diese in der gemeinsamen App-Gruppe enthalten sind.

Die Apple-Dokumentation erklärt dies am besten im Kontext der Erweiterungen: https://developer.Apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

Grundsätzlich müssen Sie:

  1. Definieren Sie die App-Gruppen-ID (in Zertifikate, Kennungen und Profile Abschnitt Mitgliedercenter für Ihr Apple Entwicklerprogramm).
  2. Aktivieren Sie die App-Gruppen-Funktion, indem Sie die oben angegebene App-Gruppen-ID für jede App angeben, die kommuniziert werden soll (dies kann entweder in Xcode erfolgen: Ziel -> Funktionen oder unter Mitgliedercenter =).
  3. Verwenden Sie eine von zwei APIs für den gemeinsamen Containerzugriff.

Erste API basiert auf NSUserDefaults:

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

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

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

Die zweite API basiert auf NSFileManager. Es ist einfach ein freigegebener Ordner, auf den Sie zugreifen können, nachdem Sie die URL erhalten haben:

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

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

Alles, was Sie in myDefaults oder den Ordner, auf den sharedFolderURL verweist, einfügen, ist für alle Ihre Apps sichtbar und zugänglich.

Im Falle eines Ordners schreiben/lesen Sie bitte atomar, um sicherzustellen, dass keine Deadlocks möglich sind.

16
siejkowski

Datenaustausch zwischen Apps möglich? Ja ist es!

Verwenden Sie UIPasteBoard ab iOS 3.0, die Dokumentation ist verfügbar hier . Apple docs sagen:

Die UIPasteboard-Klasse ermöglicht es einer Anwendung, Daten innerhalb der Anwendung oder mit einer anderen Anwendung unter Verwendung systemweiter oder anwendungsspezifischer Pasteboards gemeinsam zu nutzen.

Es ist auch möglich, Daten zwischen Apps im Schlüsselbund auszutauschen, obwohl die Daten in erster Linie Passwörter sind und alles, was serialisierbar ist, gespeichert werden könnte. Hier ist eine Stapelüberlauf-Frage dazu.

14
JugsteR

Mithilfe des benutzerdefinierten URL-Schemas können Sie auf Daten von einer App zu einer anderen zugreifen. Folgen Sie dem unten angegebenen Link für weitere Informationen -

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

4
PawanShakya

Erwähnen Sie, dass das Teilen von Daten zwischen Apps über UIPasteBoard nur für Apps in derselben Anwendungsgruppe in iOS7 funktioniert. Wie Äpfel sagen:

+ [UIPasteboard pasteboardWithName: create:] und + [UIPasteboard pasteboardWithUniqueName] geben jetzt den angegebenen Namen an, damit nur die Apps in derselben Anwendungsgruppe auf das Pasteboard zugreifen können. Wenn der Entwickler versucht, ein Pasteboard mit einem bereits vorhandenen Namen zu erstellen, das nicht Teil derselben App-Suite ist, erhält er ein eigenes, eindeutiges und privates Pasteboard. Beachten Sie, dass dies keine Auswirkungen auf die vom System bereitgestellten Pasteboards general und find hat.

3
MasterBeta

Sie können https://github.com/burczyk/Camouflage verwenden, um NSData in iOS Camera Roll als BMP-Datei zu lesen und zu schreiben und zwischen Apps zu teilen :)

Nagelneue Lösung!

3
Kamil

Wenn es Ihnen nichts ausmacht, auf das Netzwerk zuzugreifen, können Sie einen benutzerdefinierten Webdienst implementieren oder einen Clouddienst verwenden. iCloud selbst wird hier nicht viel nützen; Sie können nur Daten zwischen derselben App auf verschiedenen Geräten austauschen. Sie können über iCloud lesen hier .

Ohne das Netzwerk zu verwenden, können Sie " schnelle App-Umschaltung " ausnutzen, um eine begrenzte Datenmenge zwischen Apps per URL-Codierung zu übertragen. Die tatsächliche Menge an Daten, die übertragen werden können, weiß ich nicht, aber ich bin mir sicher, dass sie sehr begrenzt ist.

Die Antworten von JugsteR und Baudot sind in diesem Fall am besten.

2
QED