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.
UIDocumentInteractionController
UIActivityViewController
Dostęp do udostępnionego pęku kluczy
Schemat niestandardowego adresu URL
Serwis internetowy
iCloud API
UIDocumentInteractionController:
Dostępność: iOS 3.2+
Plusy:
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:
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:
Dostępność: iOS 3.0+
Plusy:
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:
Dostępność: iOS 3.0+
Plusy:
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:
Serwis internetowy:
Dostępność: iOS 2.0+
Plusy:
Cons:
Odniesienie
źródło
UIPasteboard
API.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.
Teraz musisz stworzyć dwie aplikacje. Nazwa próbki
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.
Podziękowania dla Apple za udostępnianie elementów z własnych aplikacji . Miłego kodowania. :)
źródło
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:
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
myDefaults
lub wskazany przez Ciebie folder,sharedFolderURL
bę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.
źródło
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ą:
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.
źródło
NSData
również.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
źródło
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.
źródło
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.
źródło
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!
źródło
Nie. Musiałbyś użyć rozwiązania w chmurze.
źródło