Udostępniaj dane między dwoma lub więcej aplikacjami na iPhone'a

79

Czy można udostępniać dane między dwiema aplikacjami na tym samym urządzeniu?

Czy mogę pozwolić innej aplikacji na wykorzystanie informacji / danych mojej aplikacji lub w jakikolwiek inny sposób?

Na przykład pierwsza aplikacja służy do zarządzania zdarzeniami i używam jej do zapisywania niektórych wydarzeń. Druga aplikacja służy do przypomnień, które będą pobierać dane z drugiej aplikacji, aby przypomnieć mi o wydarzeniu.

To tylko prosty przykład, a nie prawdziwy scenariusz.

Kamleshwar
źródło

Odpowiedzi:

38

W przeszłości iPhone próbował zapobiegać udostępnianiu danych między aplikacjami. Pomysł polegał na tym, że jeśli nie możesz uzyskać dostępu do danych innej aplikacji, nie możesz zrobić nic złego w tej aplikacji.

W ostatnich wersjach IOS trochę to poluzowali. Na przykład przewodnik programowania na iOS zawiera teraz sekcję dotyczącą przekazywania danych między aplikacjami, w której jedna aplikacja zajmuje określony prefiks adresu URL, a inne aplikacje odwołują się do tego adresu URL. Być może więc ustawisz swoją aplikację eventową tak, aby odpowiadała na adresy URL „event: //” w taki sam sposób, w jaki serwer WWW odpowiada na adresy URL „http: //”.

Dokumentacja firmy Apple dotycząca tego podejścia znajduje się tutaj .

Zajrzyj do sekcji „Implementowanie niestandardowych schematów adresów URL”.

baudot
źródło
Dzięki temu właśnie tego szukam.
Kamleshwar,
Czy można w ten sposób udostępniać duże dane, na przykład pliki?
AlikElzin-kilaka
2
Jeśli czytasz tak daleko, sprawdź poniżej odpowiedź @siejkowski, ponieważ jest bardziej aktualna.
mahboudz
1
Na uwagę zasługuje również odpowiedź @ chintan-maddy-ramani.
mahboudz
2
Tak, od czasu napisania tej odpowiedzi dodano wiele lepszych sposobów. Stare pytanie ma starą odpowiedź!
baudot
103

W świecie programowania iOS w piaskownicy udostępnianie danych między aplikacjami może być trudne. Ponieważ programiści iOS nie mogą udostępniać danych bezpośrednio przez system plików , muszą znaleźć alternatywne rozwiązania dla swoich aplikacji. Niektóre typowe rozwiązania obejmują:

  • UIDocumentInteractionController

  • UIActivityViewController

  • Dostęp do udostępnionego pęku kluczy

  • Schemat niestandardowego adresu URL

  • Serwis internetowy

  • iCloud API


UIDocumentInteractionController:

Umożliwia użytkownikowi otwarcie dokumentu w dowolnej innej aplikacji, która rejestruje się jako zdolna do obsługi określonego dokumentu Uniform Type Identifier (UTI) .

UIDocumentInteractionController był używany w przeszłości jako środek do otwierania dokumentu w innych aplikacjach na urządzeniu, na przykład do otwierania załączników do wiadomości e-mail z aplikacji Mail.

UIDocumentInteractionController

Niestety interfejs użytkownika UIDocumentInteractionController wyświetla tylko sześć aplikacji .

Nie możesz zagwarantować, że Twoja aplikacja pojawi się na liście. Chociaż UIDocumentInteractionController nie został uznany za przestarzały, UIActivityViewController zapewnia bardziej elastyczny zamiennik od iOS 6,0.

Dostępność: iOS 3.2+

Plusy:

  • Umożliwia udostępnianie typowych typów danych szerokiej gamie aplikacji.

Cons:

  • Umożliwia kontrolę typu danych wysyłanych do UIDocumentInteractionController, ale nie do miejsc docelowych.

  • Wymaga dodatkowej interakcji użytkownika.

  • Ograniczona liczba miejsc docelowych danych może spowodować, że aplikacja nie będzie wyświetlana na liście.


UIActivityViewController:

Umożliwia użytkownikowi wykonywanie szeregu działań na tablicy danych.

Na przykład mogą drukować, wysyłać e-mailem, kopiować, publikować w mediach społecznościowych lub otwierać w innej aplikacji.

Możesz tworzyć własne podklasy UIActivity, aby świadczyć niestandardowe usługi dla użytkownika.

UIActivityController

Dostępność: iOS 6.0+

Plusy:

  • Doskonały do ​​udostępniania typowych typów danych w szerokiej gamie aplikacji i mediów społecznościowych.

  • Może dostarczyć szereg elementów do zastosowania w działaniu. Obiekty powinny być zgodne z protokołem UIActivityItemSource.

  • Ma możliwość ustawiania wykluczonych typów działań.

  • Interfejs użytkownika stronicowania pozwala na więcej miejsc docelowych danych niż UIDocumentInteractionController.

Cons:

  • Musisz zdefiniować niestandardowy typ działania, aby ograniczyć miejsca docelowe „Otwórz w…” do typowych typów danych.

  • Wymaga dodatkowej interakcji użytkownika.


Dostęp do udostępnionego pęku kluczy:

Umożliwia bezpieczne przechowywanie danych we współużytkowanym pęku kluczy, do którego mają dostęp inne aplikacje należące do pakietu aplikacji.

Wszystkie aplikacje, które współużytkują dostęp do pęku kluczy, muszą używać tego samego prefiksu identyfikatora aplikacji.

Na przykład dostęp do udostępnionego pęku kluczy w akcji. Zobacz przykładowy kod Apple GenericKeychain .

Wspólny łańcuch kluczy

Dostępność: iOS 3.0+

Plusy:

  • Bezpieczny dostęp do danych.

Cons:

  • Dane można udostępniać tylko między aplikacjami, które mają wspólny prefiks identyfikatora aplikacji.

  • Interfejs API pęku kluczy w symulatorze iOS pochodzi z systemu OS X, który ma inny interfejs API niż urządzenie z systemem iOS.


Schemat niestandardowego adresu URL:

Zezwala na przesyłanie danych między aplikacjami przy użyciu prostych adresów URL.

Schemat niestandardowego adresu URL

Dostępność: iOS 3.0+

Plusy:

  • Nie jest wymagane połączenie sieciowe.
  • Doskonały do ​​małych ilości danych, które można łatwo zakodować w legalnym adresie URL ze znakami ucieczki.

Cons:

  • Musisz zakodować dane w legalnym adresie URL ze zmianą znaczenia.

    Uwaga: kodowanie base64 było powszechnie używane do przekształcania danych możliwych do serializacji w wartość ciągu. Jednak ciągi base64 mogą zawierać znaki, których nie można używać w adresach URL. Możesz rozważyć użycie base64url. Aby uzyskać więcej informacji, zobacz kodowanie Base 64 z bezpiecznym alfabetem adresu URL i nazwy pliku .


iCloud API:

Wszyscy wiedzą, czym jest iCloud, plusy i minusy, więc nie ma więcej wyjaśnień.

Można jednak zapytać, w jaki sposób można udostępniać dane między aplikacjami w jednym urządzeniu, istnieją pewne obejścia, aby to osiągnąć.

iCloud

Jest to możliwe, ponieważ identyfikator używany w iCloud różni się od identyfikatora pakietu, więc można udostępniać obrazy, filmy i inne dokumenty.

Aby dowiedzieć się więcej, zobacz dyskusję na ten temat


Serwis internetowy:

Synchronizuj dane za pośrednictwem strony trzeciej (np. Dropbox) lub niestandardowej usługi internetowej.

Serwis internetowy

Dostępność: iOS 2.0+

Plusy:

  • Przydatne do udostępniania i dystrybucji dużych ilości danych w inny sposób.

Cons:

  • Wymaga połączenia sieciowego.
  • Narzut związany z wdrażaniem usługi sieci Web

Odniesienie

Durai Amuthan.H
źródło
3
jak obszerna odpowiedź i użycie grafiki
coolharsh55
1
Powinieneś także wspomnieć o UIPasteboardAPI.
Evgeny Karkan
@EvgenyKarkan - Zapraszam do edycji postu :)
Durai Amuthan.H
54

Z iOS 8 udało mi się uzyskać dostęp do tego samego folderu za pomocą „ Funkcjonalności grup aplikacji. Rozszerzam odpowiedź @siejkowski.

Uwaga: będzie działać tylko z tego samego konta programisty.

W tym celu wykonaj poniższe czynności.

  1. Najpierw włącz „Grupy aplikacji” na koncie programisty.
  2. Wygeneruj profil aprowizacji. i użyj go.

Teraz musisz stworzyć dwie aplikacje. Nazwa próbki

  1. Demo_Share_One
  2. Demo_Share_Two

Teraz kopiujemy obrazy z Demo_Share_One do folderu udostępniania, który jest tworzony domyślnie po włączeniu grup aplikacji i uruchomieniu aplikacji. i będzie mieć dostęp do wszystkich tych obrazów z Demo_Share_Two .

Musisz wziąć nazwę grupy, która została ustawiona na twoim koncie programisty group.filesharingdemo. Powiedz .

Dodaj metodę poniżej w obu aplikacjach, aby uzyskać względną ścieżkę adresu URL folderu udostępniania.

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

Teraz kopiujemy obrazy z pakietu z 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");
    }
}

Teraz w Demo_Share_Two, aby uzyskać dostęp do tych obrazów

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

A teraz otrzymasz wszystkie zdjęcia, które piszesz z Demo_Share_One .

Więc od teraz, jeśli chcesz udostępnić ten folder w swojej trzeciej aplikacji. po prostu dodaj tę aplikację do swojej grupy. Dlatego dostęp do tych samych elementów w wielu aplikacjach jest zbyt łatwy.

jeśli nie włączysz grup aplikacji w swoim AppID, otrzymasz [self getSharedLocationPath: @ "group.filesharingdemo"] jest puste.

Podziękowania dla Apple za udostępnianie elementów z własnych aplikacji . Miłego kodowania. :)

ChintaN -Maddy- Ramani
źródło
s / getSharedLocationPath: / sharedLocationPathForAppGroup: / :-)
Ivan Vučica
1
@ChintaN -Maddy- Ramani czy wspólna ścieżka lokalizacji może zawierać bazę danych sqlLite lub realm? Czy potrzebne byłyby do tego rozszerzenia?
user2363025
@ user2363025 Może tak. Możesz spróbować. Po prostu próbowałem z obrazami. może możesz tam skopiować bazę danych.
ChintaN -Maddy- Ramani
@ ChintaN-Maddy-Ramani. Otrzymuję poniższy błąd: Domain = NSCocoaErrorDomain Code = 512 „Nie można zapisać pliku„ 1FAA9B86-E775-4A2D-A2D6-A442C8A9A8FA ”w folderze„ AppGroup ”." UserInfo = {NSFilePath = / private / var / mobile / Pojemniki / Shared / AppGroup / 1FAA9B86-E775-4A2D-A2D6-A442C8A9A8FA, NSUnderlyingError = 0x282202250 {Błąd Domain = NSPOSIXErrorDomain Code = 21 "jest katalogiem"}}
Anand Prakash
check stackoverflow.com/questions/32778691/…
ChintaN -Maddy- Ramani
18

Od iOS 8 możesz łatwo udostępniać dane między aplikacjami, o ile znajdują się one we wspólnej grupie aplikacji.

Dokumentacja Apple najlepiej wyjaśnia to w kontekście rozszerzeń: https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

Zasadniczo musisz:

  1. Zdefiniuj identyfikator grupy aplikacji (w sekcji Certyfikaty, identyfikatory i profile w Centrum członkowskim dla programu Apple Developer Program.
  2. Włącz funkcję grup aplikacji, określając powyższy identyfikator grupy aplikacji dla każdej aplikacji, która musi się komunikować (można to zrobić w Xcode: Target -> Capabilities lub w Member Center ).
  3. Użyj jednego z dwóch interfejsów API, aby uzyskać dostęp do współdzielonego kontenera.

Pierwsze API oparte jest na NSUserDefaults:

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

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

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

Drugie API jest oparte na NSFileManager. Jest to po prostu udostępniony folder, do którego można uzyskać dostęp po uzyskaniu jego adresu URL:

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

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

Wszystko, co umieścisz w środku myDefaultslub wskazany przez Ciebie folder, sharedFolderURLbędzie widoczne i dostępne dla wszystkich Twoich aplikacji.

W przypadku folderu, proszę pisać / czytać atomowo, aby upewnić się, że nie ma możliwości zakleszczenia.

siejkowski
źródło
Przeszedłem przez twoje kroki i otrzymałem udostępniony adres URL. ale jak umieścić Obraz na tej ścieżce. dołączam nazwę obrazu i zapisuję dane. następnie próbuję odzyskać, ale nie udało mi się odzyskać obrazu.
ChintaN -Maddy- Ramani
Udało mi się napisać wszystkie obrazy z app1 i pobrać wszystkie obrazy z app2 za pomocą grupy aplikacji. Dzięki . +1 :).
ChintaN -Maddy- Ramani
Czy mogę dołączyć aplikację innej firmy do mojej grupy (według wyboru), czy też wszystkie aplikacje muszą pochodzić z tego samego konta programisty?
DwarDoh
@DwarDoh musi być z tego samego konta programisty.
ChintaN -Maddy- Ramani
14

Udostępniać dane między aplikacjami? Tak to jest!

Użyj UIPasteBoard dostępnego od iOS 3.0, dokumentacja jest dostępna tutaj . Dokumenty Apple mówią:

Klasa UIPasteboard umożliwia aplikacji udostępnianie danych w ramach aplikacji lub z inną aplikacją przy użyciu tablic pasteboard obejmujących cały system lub specyficznych dla aplikacji.

Możliwe jest również udostępnianie danych między aplikacjami w pęku kluczy, chociaż dane mają być przede wszystkim hasłami i tak można przechowywać wszystko, co można serializować. Oto pytanie dotyczące przepełnienia stosu.

JugsteR
źródło
Świetny! Wygląda to na realny sposób udostępniania danych między aplikacjami.
trusktr
1
UIPasteboard brzmi jak dobre rozwiązanie do udostępniania małych danych, takich jak kopiowanie wklejania ciągów. Czy istnieje opcja udostępniania plików między aplikacjami?
AlikElzin-kilaka
1
@ AlikElzin-kilaka tak, obsługuje NSDatarównież.
Evgeny Karkan
4

Możesz użyć niestandardowego schematu adresu URL, aby uzyskać dostęp do danych z jednej aplikacji do drugiej. Kliknij poniższy link, aby uzyskać więcej informacji -

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

PawanShakya
źródło
2
„Dane dostępowe” są tutaj mylące. Link odnosi się do artykułu, w którym niektóre parametry są przekazywane do aplikacji w samym adresie URL.
DonSteep
3

Wspomnij, że udostępnianie danych między aplikacjami za pośrednictwem UIPasteBoard działa tylko w przypadku aplikacji w tej samej grupie aplikacji w systemie iOS7. Jak mówi jabłka:

+ [UIPasteboard pasteboardWithName: create:] i + [UIPasteboard pasteboardWithUniqueName] są teraz unikalne dla danej nazwy, aby umożliwić dostęp do obszaru roboczego tylko tym aplikacjom z tej samej grupy aplikacji. Jeśli programista spróbuje utworzyć stół roboczy o nazwie, która już istnieje, a nie są one częścią tego samego pakietu aplikacji, otrzyma swój własny, unikalny i prywatny obszar roboczy. Należy zauważyć, że nie ma to wpływu na dostarczone przez system tablice robocze, ogólne i znajdowanie.

MasterBeta
źródło
Co Apple rozumie przez „tę samą grupę aplikacji”?
Magic Bullet Dave
2
@MagicBulletDave Aplikacje, które mają ten sam identyfikator początkowy pakietu.
MasterBeta
UIPasteboard klasa umożliwia aplikację na wymianę danych w aplikacji i innej aplikacji. Aby udostępnić dane dowolnej innej aplikacji, możesz użyć tablic roboczych obejmujących cały system; aby udostępniać dane innej aplikacji, która ma ten sam identyfikator zespołu co Twoja aplikacja, możesz użyć tablic roboczych specyficznych dla aplikacji.
testowanie
2

Jeśli nie masz nic przeciwko wejściu do sieci, możesz zaimplementować niestandardową usługę internetową, aby to zrobić, lub skorzystać z usługi w chmurze. Sam iCloud nie będzie tutaj zbyt przydatny; umożliwia tylko udostępnianie danych między tą samą aplikacją na różnych urządzeniach. Możesz przeczytać o iCloud tutaj .

Bez korzystania z sieci możesz wykorzystać „ szybkie przełączanie aplikacji” ” do przesyłania ograniczonej ilości danych między aplikacjami za pomocą kodowania adresów URL. Rzeczywista ilość danych, które można przesłać, nie wiem, ale na pewno byłaby bardzo ograniczona.

W tym przypadku najlepsze są odpowiedzi JugsteR i baudota.

CO BYŁO DO OKAZANIA
źródło
Cześć psoft, czy możesz powiedzieć więcej na temat udostępniania iCloud, które wyjaśniłeś tutaj w dwóch wierszach
Vinayaka Karjigi,
Czytałem, że identyfikator iCloud nie musi pasować do identyfikatora pakietu aplikacji, dlatego udostępnianie iCloud byłoby opcją.
testowanie
Możliwe jest przesłanie 64kB danych w ramach standardowego adresu URL. To faktycznie działa dobrze. Jeśli nie masz zbyt dużo danych, możesz zaszyfrować / base64 dla lepszego bezpieczeństwa.
igraczech
2

Możesz użyć https://github.com/burczyk/Camouflage, aby odczytać i zapisać NSData w iOS Camera Roll jako plik .bmp i udostępniać go między aplikacjami :)

Całkiem nowe rozwiązanie!

Kamil
źródło
kreatywny pomysł ... fajny
MoralCode
-4

Nie. Musiałbyś użyć rozwiązania w chmurze.

dbrajkovic
źródło
O ile wiem, iCloud jest przeznaczony do synchronizowania danych na jednym urządzeniu z innymi urządzeniami.Jeśli znasz sposoby udostępniania danych między aplikacjami na urządzeniu, udostępnij je.
Durai Amuthan.H
2
dbarjkovic masz rację, możemy użyć rozwiązania chmurowego do synchronizacji danych między aplikacjami, ponieważ identyfikator używany w iCloud różni się od identyfikatora pakietu i jest całkowicie możliwy. tutaj jest link do sprawdzenia, czy stackoverflow.com/a/8882763/730807 . zagłosuj za swoją odpowiedzią.
Durai Amuthan.H
Dlaczego ta odpowiedź jest odrzucana? To jest poprawna odpowiedź, ale musi zawierać więcej szczegółów z dokumentacji i podać kilka przykładów
Basheer_CAD