Можно ли обмениваться данными между двумя приложениями на одном устройстве?
Или я могу разрешить другому приложению использовать информацию / данные моего приложения или любым другим способом?
Например, первое приложение предназначено для управления событиями, и я использую его для сохранения некоторых событий. Второе приложение предназначено для напоминаний, которые будут получать данные из другого приложения, чтобы напомнить мне о событии.
Это всего лишь простой пример, а не реальный сценарий.
UIDocumentInteractionController
UIActivityViewController
Общий доступ к связке ключей
Собственная схема URL
Веб-сервис
iCloud API
UIDocumentInteractionController:
Доступность: iOS 3.2+
Плюсы:
Минусы:
Позволяет управлять типом данных, отправляемых в UIDocumentInteractionController, но не адресами.
Требуется дополнительное взаимодействие с пользователем.
Ограниченное количество адресатов данных может привести к тому, что ваше приложение не будет отображаться в списке.
UIActivityViewController:
Доступность: iOS 6.0+
Плюсы:
Отлично подходит для обмена общими типами данных с широким спектром приложений и социальных сетей.
Может предоставить массив элементов для приложения к действию. Объекты должны соответствовать протоколу UIActivityItemSource.
Имеет возможность устанавливать исключенные типы активности.
Пользовательский интерфейс разбиения на страницы позволяет использовать больше мест назначения данных, чем UIDocumentInteractionController.
Минусы:
Вы должны определить настраиваемый тип действия, чтобы ограничить назначение «Открыть в…» для общих типов данных.
Требуется дополнительное взаимодействие с пользователем.
Общий доступ к связке ключей:
Доступность: iOS 3.0+
Плюсы:
Минусы:
Вы можете обмениваться данными только между приложениями, которые имеют общий префикс идентификатора приложения.
API Связки ключей в симуляторе iOS поступает из OS X, API которой отличается от API устройства iOS.
Пользовательская схема URL:
Доступность: iOS 3.0+
Плюсы:
Минусы:
Вы должны кодировать данные в экранированный законный URL.
Примечание: кодировка base64 широко используется для преобразования сериализуемых данных в строковое значение. Однако строки base64 могут включать символы, недопустимые для использования в URL-адресах. Вы можете рассмотреть возможность использования base64url. Дополнительные сведения см. В разделе «Кодирование Base 64 с URL-адресом и безопасным алфавитом имени файла» .
iCloud API:
Веб-сервис:
Доступность: iOS 2.0+
Плюсы:
Минусы:
Справка
источник
UIPasteboard
API.С iOS 8 я успешно получил доступ к той же папке, используя « Функциональность группы приложений». Я расширяю ответ @siejkowski.
Примечание: он будет работать только с той же учетной записью разработчика.
Для этого вам необходимо выполнить следующие шаги.
Теперь вам нужно создать два приложения. Имя образца
Теперь мы копируем изображения из Demo_Share_One в папку общего доступа, которая создается по умолчанию, когда вы включаете группы приложений и запускаете приложение. и будет получать доступ ко всем этим изображениям из Demo_Share_Two .
Вы должны взять имя группы, которое было установлено для вашей учетной записи разработчика
group.filesharingdemo
.Добавьте метод ниже в обоих приложениях, чтобы получить относительный путь URL-адреса общей папки.
- (NSString *) getSharedLocationPath:(NSString *)appGroupName { NSFileManager *fileManager = [NSFileManager defaultManager]; NSURL *groupContainerURL = [fileManager containerURLForSecurityApplicationGroupIdentifier:appGroupName]; return [groupContainerURL relativePath]; }
Теперь мы копируем изображения из Bundle из 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"); } }
Теперь в Demo_Share_Two для доступа к этим изображениям
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];
И теперь вы получите все изображения, которые вы пишете, из Demo_Share_One .
Итак, с этого момента, если вы хотите поделиться этой папкой, два вашего третьего приложения. просто добавьте это приложение в свою группу. Поэтому слишком легко получить доступ к одним и тем же элементам в ваших нескольких приложениях.
Спасибо Apple за функцию обмена элементами из ваших собственных приложений . Удачного кодирования. :)
источник
Начиная с iOS 8, вы можете легко обмениваться данными между приложениями, если они находятся в общей группе приложений.
Документация Apple лучше всего объясняет это в контексте расширений: https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html
В основном вам необходимо:
Первый API основан на
NSUserDefaults
:NSString *appGroupId = @"group.my.group.id"; NSUserDefaults *myDefaults = [[NSUserDefaults alloc] initWithSuiteName:appGroupId]; [myDefaults setObject:@"foo" forKey:@"bar"];
Второй API основан на
NSFileManager
. Это просто общая папка, к которой вы можете получить доступ после получения ее URL:NSString *appGroupId = @"group.my.group.id"; NSURL *sharedFolderURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:appGroupId];
Все, что вы поместите внутрь
myDefaults
или указанную папку,sharedFolderURL
будет видно и доступно для всех ваших приложений.В случае папки, пожалуйста, пишите / читайте атомарно, чтобы избежать взаимоблокировок.
источник
Возможен обмен данными между приложениями? Да, именно так!
Используйте UIPasteBoard, доступный в iOS 3.0, документация доступна здесь . Документы Apple говорят:
Также можно обмениваться данными между приложениями в связке ключей, хотя данные в первую очередь предназначены для использования в качестве паролей, и все, что сериализуемое, может быть сохранено. Вот вопрос о переполнении стека по этому поводу.
источник
NSData
.Вы можете использовать настраиваемую схему URL-адресов для доступа к данным из одного приложения в другое. Для получения дополнительной информации перейдите по указанной ниже ссылке -
http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html
источник
Обратите внимание, что совместное использование данных между приложениями через UIPasteBoard работает только для приложений в одной группе приложений в iOS7. Как говорят яблоки:
+ [UIPasteboard pasteboardWithName: create:] и + [UIPasteboard pasteboardWithUniqueName] теперь уникальны для данного имени, чтобы разрешить доступ к монтажному столу только тем приложениям в той же группе приложений. Если разработчик попытается создать монтажный стол с именем, которое уже существует, и они не являются частью того же набора приложений, он получит свой собственный уникальный и личный монтажный стол. Обратите внимание, что это не влияет на предоставляемые системой монтажные панели, общие и поиск.
источник
Если вы не против подключения к сети, вы можете реализовать для этого специальный веб-сервис или использовать облачный сервис. Сам iCloud здесь не принесет особой пользы; это позволяет вам обмениваться данными только между одним и тем же приложением на разных устройствах. Вы можете прочитать об iCloud здесь .
Без использования сети вы можете использовать « быстрое переключение приложений » для передачи ограниченного объема данных между приложениями с помощью кодирования URL. Фактический объем передаваемых данных я не знаю, но я уверен, что он будет очень ограниченным.
В этом случае лучше всего подходят ответы JugsteR и baudot.
источник
Вы можете использовать https://github.com/burczyk/Camouflage для чтения и записи NSData в iOS Camera Roll в виде файла .bmp и обмена им между приложениями :)
Совершенно новое решение!
источник
Нет. Вам нужно будет использовать какое-то облачное решение.
источник