Teilen Sie Daten zwischen zwei oder mehr iPhone-Anwendungen

79

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

Oder kann ich einer anderen Anwendung erlauben, die Informationen / Daten meiner Anwendung oder auf andere Weise zu verwenden?

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

Dies ist nur ein einfaches Beispiel, kein reales Szenario.

Kamleshwar
quelle

Antworten:

38

In der Vergangenheit hat das iPhone versucht, den Datenaustausch zwischen Apps zu verhindern. Die Idee war, dass man dieser App nichts Böses antun könnte, wenn man nicht auf die Daten einer anderen App zugreifen könnte.

In den letzten Versionen von IOS haben sie das etwas gelockert. Im iOS-Programmierhandbuch finden Sie jetzt beispielsweise einen Abschnitt zum Übergeben von Daten zwischen Apps, indem eine App ein bestimmtes URL-Präfix beansprucht und andere Apps auf diese URL verweisen. Vielleicht stellen Sie Ihre Ereignis-App so ein, dass "Ereignis: //" - URLs genauso beantwortet werden, wie ein Webserver auf "http: //" - URLs antwortet.

Apples Dokumentation dieses Ansatzes finden Sie hier .

Werfen Sie einen Blick unter "Implementieren von benutzerdefinierten URL-Schemata".

Baudot
quelle
Danke, das war genau das, wonach ich suche.
Kamleshwar
Können große Datenmengen auf diese Weise gemeinsam genutzt werden, z. B. Dateien?
AlikElzin-Kilaka
2
Wenn Sie so weit lesen, überprüfen Sie die Antwort von @siejkowski unten, da sie aktueller ist.
Mahboudz
1
Bemerkenswert ist auch die Antwort von @ chintan-maddy-ramani.
Mahboudz
2
Ja, seit ich diese Antwort geschrieben habe, wurden viele bessere Möglichkeiten hinzugefügt. Alte Frage hat alte Antwort!
Baudot
102

In der Sandbox- Welt der iOS-Entwicklung kann es schwierig sein, Daten zwischen Anwendungen auszutauschen. Da iOS-Entwickler Daten nicht direkt über das Dateisystem austauschen können , müssen sie alternative Lösungen für ihre Anwendungen finden. Einige gängige Lösungen sind:

  • UIDocumentInteractionController

  • UIActivityViewController

  • Gemeinsamer Schlüsselbundzugriff

  • Benutzerdefiniertes URL-Schema

  • Internetservice

  • iCloud API


UIDocumentInteractionController:

Ermöglicht dem Benutzer das Öffnen eines Dokuments in einer anderen Anwendung, die sich als in der Lage registriert, ein bestimmtes Dokument zu verarbeiten. Uniform Type Identifier (UTI) .

Der UIDocumentInteractionController wurde in der Vergangenheit verwendet, um ein Dokument in anderen Anwendungen auf dem Gerät zu öffnen, z. B. um E-Mail-Anhänge über die Mail-App zu öffnen.

UIDocumentInteractionController

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

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

Verfügbarkeit: iOS 3.2+

Vorteile:

  • 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, jedoch nicht 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 Datenarray auszuführen.

Beispielsweise können sie 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+

Vorteile:

  • Hervorragend geeignet, um gängige Datentypen mit einer Vielzahl von Anwendungen und sozialen Medien zu teilen.

  • Kann eine Reihe von Elementen zur 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 die Ziele "Öffnen in ..." gängiger Datentypen einzuschränken.

  • Erfordert zusätzliche Benutzerinteraktion.


Gemeinsamer Schlüsselbundzugriff:

Ermöglicht das sichere Speichern von Daten in einem gemeinsam genutzten 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 Zugriff auf einen gemeinsam genutzten Schlüsselbund in Aktion. Siehe den GenericKeychain-Beispielcode von Apple .

Geteilte Schlüsselkette

Verfügbarkeit: iOS 3.0+

Vorteile:

  • Sicherer Zugriff auf Daten.

Nachteile:

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

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


Benutzerdefiniertes URL-Schema:

Ermöglicht den Datenaustausch zwischen Anwendungen mithilfe einfacher URLs.

Benutzerdefiniertes URL-Schema

Verfügbarkeit: iOS 3.0+

Vorteile:

  • Keine Netzwerkverbindung erforderlich.
  • Ideal für kleine Datenmengen, die Sie problemlos in eine maskierte URL mit Escapezeichen codieren können.

Nachteile:

  • Sie müssen Daten in eine maskierte legale URL codieren.

    Hinweis: Bei der Base64-Codierung werden häufig serialisierbare Daten in Zeichenfolgenwerte umgewandelt. Base64-Zeichenfolgen können jedoch Zeichen enthalten, die für die Verwendung in URLs ungültig sind. Sie könnten die Verwendung von base64url in Betracht ziehen. Weitere Informationen finden Sie unter Base 64-Codierung mit URL und Dateiname Safe Alphabet .


iCloud API:

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

Man könnte sich jedoch 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, weil sich die für iCloud verwendete Kennung von der Bundle-Kennung unterscheidet, sodass Bilder, Videos und andere Dokumente freigegeben werden können.

Weitere Informationen finden Sie in der Diskussion zu diesem Thema


Internetservice:

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

Internetservice

Verfügbarkeit: iOS 2.0+

Vorteile:

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

Nachteile:

  • Benötigt eine Netzwerkverbindung.
  • Aufwand für die Implementierung von Webdiensten.

Referenz

Durai Amuthan.H
quelle
3
wie die ausführliche Antwort und Verwendung von Grafiken
coolharsh55
1
Sie sollten auch UIPasteboardAPI erwähnen .
Evgeny Karkan
@ EvgenyKarkan - Bitte zögern Sie nicht, den Beitrag zu bearbeiten :)
Durai Amuthan.H
54

Ab iOS 8 habe ich 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-Gruppen" in Ihrem Entwicklerkonto.
  2. Bereitstellungsprofil erstellen. und benutze es.

Jetzt müssen Sie zwei Apps erstellen. Beispielname

  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 über Demo_Share_Two auf alle diese Bilder zu .

Sie müssen den Gruppennamen übernehmen, der auf Ihr Entwicklerkonto festgelegt wurde group.filesharingdemo.

Fügen Sie in beiden Apps die folgende Methode hinzu, um den relativen Pfad für die Freigabe der Ordner-URL zu erhalten.

- (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 erhalten Sie alle Bilder, die Sie schreiben, von Demo_Share_One .

Also von nun an, wenn Sie diesen Ordner zwei Ihrer dritten App freigeben möchten. Fügen Sie diese App einfach Ihrer Gruppe hinzu. Daher ist es zu einfach, auf dieselben Elemente in Ihren mehreren Apps zuzugreifen.

Wenn Sie App-Gruppen in Ihrer AppID nicht aktivieren, erhalten Sie [self getSharedLocationPath: @ "group.filesharingdemo"] ist null.

Dank Apple für Share Elements aus Ihrer eigenen Apps-Funktionalität . Viel Spaß beim Codieren. :) :)

ChintaN -Maddy- Ramani
quelle
s / getSharedLocationPath: / sharedLocationPathForAppGroup: / :-)
Ivan Vučica
1
@ChintaN -Maddy- Ramani Kann der gemeinsam genutzte Standortpfad eine SQLLite- oder Realm-Datenbank enthalten? Würden dafür Erweiterungen benötigt?
user2363025
@ user2363025 Vielleicht ja. Du kannst es versuchen. Ich habe es gerade mit Bildern versucht. Vielleicht können Sie dort die Datenbank kopieren.
ChintaN -Maddy- Ramani
@ ChintaN-Maddy-Ramani. Der folgende Fehler wird angezeigt: Domain = NSCocoaErrorDomain Code = 512 "Die Datei" 1FAA9B86-E775-4A2D-A2D6-A442C8A9A8FA "konnte nicht im Ordner" AppGroup "gespeichert werden." Userinfo = {NSFilePath = / private / var / mobile / Container / Shared / AppGroup / 1FAA9B86-E775-4A2D-A2D6-A442C8A9A8FA, NSUnderlyingError = 0x282202250 {Fehler Domain = NSPOSIXErrorDomain - Code = 21 "ist ein Verzeichnis"}}
Anand Prakash
check stackoverflow.com/questions/32778691/…
ChintaN -Maddy- Ramani
18

Seit iOS 8 können Sie problemlos Daten zwischen Apps austauschen, solange sie sich in der gemeinsamen App-Gruppe befinden.

Die Apple-Dokumentation erklärt dies am besten im Kontext von 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 (im Abschnitt Zertifikate, Kennungen und Profile des Member Centers für Ihr Apple Developer Program.
  2. Aktivieren Sie die Funktion "App-Gruppen", indem Sie die oben genannte App-Gruppen-ID für jede App angeben, die kommunizieren muss (dies kann entweder in Xcode: Ziel -> Funktionen oder im Member Center erfolgen ).
  3. Verwenden Sie eine von zwei APIs für den Zugriff auf gemeinsam genutzte Container.

Die 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 myDefaultsden Ordner oder den Ordner legen, auf den Sie zeigen, ist sharedFolderURLfü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.

siejkowski
quelle
Ich habe Ihre Schritte durchlaufen und eine gemeinsame URL erhalten. aber wie man Image auf diesen Weg bringt. Ich füge meinen Bildnamen hinzu und schreibe Daten. dann versuche ich abzurufen, konnte aber kein Bild zurückbekommen.
ChintaN -Maddy- Ramani
Ich habe es erfolgreich gemacht, alle Bilder von App1 zu schreiben und alle Bilder von App2 mit App-Gruppe abzurufen. Vielen Dank . +1 :).
ChintaN -Maddy- Ramani
Kann ich eine Drittanbieter-App (nach Wahl) meiner Gruppe beitreten lassen oder müssen alle Apps von demselben Entwicklerkonto stammen?
DwarDoh
@DwarDoh muss von demselben Entwicklerkonto stammen.
ChintaN -Maddy- Ramani
14

Daten zwischen Apps teilen möglich? Ja ist es!

Verwenden Sie UIPasteBoard ab iOS 3.0. Die Dokumentation finden Sie hier . Apple-Dokumente sagen:

Mit der UIPasteboard-Klasse kann eine Anwendung Daten innerhalb der Anwendung oder mit einer anderen Anwendung mithilfe systemweiter oder anwendungsspezifischer Pasteboards gemeinsam nutzen.

Es ist auch möglich, Daten zwischen Apps im Schlüsselbund auszutauschen, obwohl die Daten in erster Linie als Kennwörter gedacht sind und alles, was serialisierbar ist, gespeichert werden kann. Hier ist eine Frage zum Stapelüberlauf.

JugsteR
quelle
Toll! Dies scheint eine praktikable Möglichkeit zu sein, Daten zwischen Apps auszutauschen.
trusktr
1
Das UIPasteboard klingt nach einer guten Lösung für die gemeinsame Nutzung kleiner Daten, wie das Kopieren und Einfügen von Zeichenfolgen. Gibt es eine Option zum Teilen von Dateien zwischen Apps?
AlikElzin-Kilaka
1
@ AlikElzin-kilaka ja, es unterstützt NSDataauch.
Evgeny Karkan
4

Sie können das benutzerdefinierte URL-Schema verwenden, um auf Daten von einer App zur anderen zuzugreifen. Folgen Sie dem unten angegebenen Link für weitere Informationen -

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

PawanShakya
quelle
2
"Zugriff auf Daten" ist hier irreführend. Der Link verweist auf einen Artikel, in dem einige Parameter in der URL selbst an eine App übergeben werden.
DonSteep
3

Erwähnen Sie, dass der Datenaustausch 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 eindeutig 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, der nicht Teil derselben App-Suite ist, erhält er ein eigenes, einzigartiges und privates Pasteboard. Beachten Sie, dass dies keine Auswirkungen auf die vom System bereitgestellten Pasteboards, allgemein und find hat.

MasterBeta
quelle
Was bedeutet Apple unter "derselben Anwendungsgruppe"?
Magic Bullet Dave
2
@MagicBulletDave Apps mit derselben Bundle Seed ID.
MasterBeta
Mit der UIPasteboard- Klasse kann eine App Daten innerhalb der App und mit einer anderen App teilen. Um Daten mit anderen Apps zu teilen, können Sie systemweite Pasteboards verwenden. Um Daten mit einer anderen App zu teilen, die dieselbe Team-ID wie Ihre App hat, können Sie app-spezifische Pasteboards verwenden.
Testen
2

Wenn es Ihnen nichts ausmacht, auf das Netzwerk zuzugreifen, können Sie einen benutzerdefinierten Webdienst implementieren oder einen Cloud-Dienst 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 die " schnelle App-Umschaltung " nutzen, um eine begrenzte Datenmenge zwischen Apps über die URL-Codierung zu übertragen. Die tatsächliche Menge der übertragbaren Daten weiß ich nicht, aber ich bin mir sicher, dass sie sehr begrenzt wäre.

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

QED
quelle
Hallo Psoft, können Sie mehr über iCloud Sharing erzählen, das Sie hier in zwei Zeilen erklärt haben
Vinayaka Karjigi
Ich habe gelesen, dass die iCloud-ID nicht mit der Bundle-ID der App übereinstimmen muss und daher eine iCloud-Freigabe eine Option wäre.
Testen
Es ist möglich, 64 KB Daten innerhalb einer Standard-URL zu übertragen. Es funktioniert tatsächlich gut. Wenn Sie nicht zu viele Daten haben, können Sie / base64 für eine bessere Sicherheit verschlüsseln.
igraczech
-3

Nein, Sie müssten eine Cloud-Lösung verwenden.

dbrajkovic
quelle
Soweit ich weiß, ist iCloud zum Synchronisieren von Daten auf einem Gerät mit anderen Geräten gedacht. Wenn Sie Möglichkeiten kennen, die Daten zwischen Apps auf einem Gerät zu teilen, teilen Sie sie bitte mit.
Durai Amuthan.H
2
dbarjkovic Sie haben Recht, wir könnten eine Cloud-Lösung verwenden, um Daten zwischen Apps zu synchronisieren, da sich die für iCloud verwendete Kennung von der Bundle-Kennung unterscheidet und durchaus möglich ist. Hier ist ein Link, um zu überprüfen, ob stackoverflow.com/a/8882763/730807 . stimme für deine Antwort.
Durai Amuthan.H
Warum wird diese Antwort abgelehnt? Dies ist die richtige Antwort, aber es muss mehr Details aus der Dokumentation enthalten und einige Beispiele geben
Basheer_CAD