Совместное использование данных между двумя или более приложениями iPhone
Возможно ли обмен данными между двумя приложениями на одном устройстве?
Или я могу разрешить некоторым другим приложениям использовать информацию/данные приложения или любым другим способом?
Например, первое приложение предназначено для управления событиями, и я использую его для сохранения некоторого события. Второе приложение предназначено для напоминаний, которое будет получать данные из другого приложения, чтобы напомнить мне об этом событии.
Это простой пример, а не реальный сценарий.
Ответы
Ответ 1
Исторически, iPhone пытался предотвратить обмен данными между приложениями. Идея заключалась в том, что если вы не смогли получить другие данные приложения, вы не смогли бы сделать что-то плохое для этого приложения.
В последних выпусках IOS они немного ослабили это. Например, в руководстве по программированию iOS теперь есть раздел о передаче данных между приложениями, если у одного приложения есть определенный префикс URL, а затем другие приложения ссылаются на этот URL. Таким образом, возможно, вы настроили приложение для событий, чтобы отвечать на URL-адреса "event://" так же, как веб-сервер отвечает за URL "http://".
Документация Apple на этот подход здесь.
Подглядывать под "Реализация пользовательских схем URL".
Ответ 2
В изолированном мире данных совместного использования продуктов iOS между приложения могут оказаться трудными, так как разработчики iOS не могут делиться данными непосредственно через файловую систему , они должны найти альтернативные решения для их применения. Некоторые общие решения включают:
-
UIDocumentInteractionController
-
UIActivityViewController
-
Доступ к совместному доступу к ключам
-
Пользовательская схема URL
-
Веб-сервис
-
API iCloud
UIDocumentInteractionController:
Позволяет пользователю открывать документ в любом другом приложении, которое регистрирует как способный обрабатывать конкретный документ Единый тип Идентификатор (UTI).
UIDocumentInteractionController использовался в прошлом как средства открытия документа в других приложениях на устройстве, для например, открытие вложений электронной почты из приложения Mail.
![UIDocumentInteractionController]()
К сожалению, пользовательский интерфейс UIDocumentInteractionController отображается только шесть приложений.
Вы не можете гарантировать, что ваше приложение появится в списке. Хотя UIDocumentInteractionController не устарел, UIActivityViewController обеспечивает более гибкую замену iOS 6.0.
Доступность: iOS 3.2 +
Плюсы:
- Позволяет использовать общие типы данных с широким спектром
приложения.
Минусы:
-
Позволяет управлять типом данных, отправленных в UIDocumentInteractionController, но не для адресатов.
-
Требуется дополнительное взаимодействие с пользователем.
-
Ограниченное количество адресатов данных может привести к тому, что ваше приложение не будет отображаться в списке.
UIActivityViewController:
Позволяет пользователю выполнять ряд действий с массивом данных.
Например, они могут печатать, отправлять по электронной почте, копировать, публиковать в социальных сетях или открывать в другом приложении.
Вы можете создавать собственные подклассы UIActivity для предоставления пользовательских услуг для пользователя.
![UIActivityController]()
Доступность: iOS 6.0 +
Плюсы:
-
Отлично подходит для обмена общими типами данных с широким спектром приложений и социальных сетей.
-
Может поставлять массив элементов для приложения в действие. Объекты должны соответствовать протоколу UIActivityItemSource.
-
Имеет возможность устанавливать исключенные типы активности.
-
Пейджинговый пользовательский интерфейс позволяет больше адресатов данных, чем UIDocumentInteractionController.
Минусы:
-
Вы должны определить тип настраиваемого вида, который бы ограничивал назначения "Открытые..." общих типов данных.
-
Требуется дополнительное взаимодействие с пользователем.
Доступ к совместному доступу к цепочке:
Позволяет безопасно хранить данные в общей цепочке ключей, чтобы другие приложения, входящие в комплект приложений.
Все приложения, которые используют доступ к keychain, должны использовать один и тот же идентификатор приложения префикс.
Пример совместного доступа к keychain в действии. См. Яблоки Пример кода GenericKeychain.
![Shared Key Chain]()
Доступность: iOS 3.0 +
Плюсы:
- Безопасный доступ к данным.
Минусы:
-
Вы можете делиться только данными между приложениями, которые используют общий префикс идентификатора приложения.
-
API-интерфейс Keychain на iOS-симуляторе поставляется с OS X, у которого API отличается от API-интерфейса iOS.
Пользовательская схема URL:
Позволяет передавать данные между приложениями с использованием простых URL-адресов.
![Custom URL Scheme]()
Доступность: iOS 3.0 +
Плюсы:
- Не требуется подключение к сети.
- Отлично подходит для небольших объемов данных, которые вы можете легко кодировать в экранированный юридический URL.
Минусы:
API iCloud:
Всем известно о том, что такое iCloud, "Плюсы и минусы", так что больше объяснение этого.
Но можно спросить, как можно делиться данными между приложений внутри одного устройства есть некоторые обходные пути для достичь этого.
![iCloud]()
Это возможно, потому что идентификатор, который используется для iCloud, отличается от идентификатора пучка, поэтому можно изображения, видео и другие документы.
Узнать больше см. обсуждение по этому вопросу
Веб-сервис:
Синхронизация данных через стороннюю (например, Dropbox) или настраиваемую веб-страницу обслуживание.
![web service]()
Доступность: iOS 2.0 +
Плюсы:
- Полезно для совместного использования и распространения большого объема данных.
Минусы:
- Требуется сетевое подключение.
- Накладные расходы на реализацию веб-сервиса.
Ссылка
Ответ 3
От iOS 8 Я успешно получил доступ к той же папке при использовании функциональности группы приложений. "Я расширяю ответ @siejkowski.
Для этого вам нужно выполнить следующие шаги.
- Сначала включите "Группы приложений" из своей учетной записи разработчика.
- Создайте профиль Provisioning. и использовать его.
Теперь вам нужно создать два приложения. Имя образца
- Demo_Share_One
- Demo_Share_Two
Теперь мы копируем изображения из папки Demo_Share_One в папку общего доступа, которая создается по умолчанию при включении групп приложений и запуска приложения. и будет получать доступ ко всем этим изображениям из Demo_Share_Two.
Вам нужно взять название группы, которое было настроено на ваш аккаунт разработчика. Например, group.filesharingdemo
.
Добавить метод "ниже" в обоих приложениях, чтобы получить относительный путь для совместного доступа к папке.
- (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.
Итак, теперь, если вы хотите поделиться этой папкой с двумя своими третьими приложениями. просто добавьте это приложение в свою группу. Таким образом, слишком легко получить доступ к тем же элементам в нескольких приложениях.
если вы не включите группы приложений в свой AppID, вы получите [self getSharedLocationPath: @ "group.filesharingdemo" ] значение null.
Благодаря Apple для Share Elements из ваших собственных приложений. Счастливое кодирование.:)
Ответ 4
С iOS 8 вы можете легко обмениваться данными между приложениями, пока они находятся в общей группе приложений.
Документация Apple лучше всего объясняет это в контексте Extensions: https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html
В принципе, вам необходимо:
- Определите идентификатор группы приложений (в разделе "Сертификаты, идентификаторы и профили" в Центре-члене для вашей Apple Developer Program.
- Включить возможность использования групп приложений, указав указанный выше идентификатор группы приложений для каждого приложения, которое должно быть связано (возможно, в Xcode: Target → Capabilities или в Центре-члене).
- Используйте один из двух API для совместного доступа к контейнеру.
Первый 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
, будет видимой и доступной для всех ваших приложений.
В случае папки, пожалуйста, напишите/прочитайте атомарно только для того, чтобы избежать взаимоблокировок.
Ответ 5
Обмен данными между приложениями возможно? Да, это так!
Использовать UIPasteBoard, доступный из iOS 3.0, имеется документация здесь.
Apple сообщает:
Класс UIPastboard позволяет приложению обмениваться данными в приложении или с другим приложением с использованием системных или прикладных платформ.
Также можно обмениваться данными между приложениями в цепочке ключей, хотя данные в первую очередь предназначены для использования паролями и, таким образом, могут быть сохранены все, что может быть сериализовано.
Здесь - вопрос о переполнении стека.
Ответ 6
Вы можете использовать специальную схему URL для доступа к данным из одного приложения в другое. Следуйте приведенной ниже ссылке для получения дополнительной информации -
http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html
Ответ 7
Упомяните, что обмен данными между приложениями через UIPasteBoard работает только для приложений в одной и той же группе приложений в iOS7. Как говорят яблоки:
+ [UIPasteboard cardboardWithName: create:] и + [UIPasteboard cardboardWithUniqueName] теперь уникальное имя, позволяющее только тем приложениям из той же группы приложений получать доступ к картону. Если разработчик пытается создать картотеку с именем, которое уже существует, и они не являются частью одного и того же набора приложений, они получат свой собственный уникальный и закрытый картона. Обратите внимание, что это не влияет на предоставляемые системой карты, общие и находки.
Ответ 8
Вы можете использовать https://github.com/burczyk/Camouflage для чтения и записи NSData в iOS Camera Roll как .bmp файл и поделиться им между приложениями:)
Новое решение!
Ответ 9
Если вы не против попадания в сеть, вы можете реализовать пользовательский веб-сервис, чтобы сделать это, или использовать некоторые облачные сервисы. Сам iCloud здесь не пригодится; он позволяет вам обмениваться данными между одним и тем же приложением на разных устройствах. Вы можете прочитать об iCloud здесь.
Без использования сети вы можете использовать " быстрое переключение приложений", чтобы передавать ограниченный объем данных между приложениями через URL-кодирование. Фактический объем передаваемых данных я не знаю, но это было бы очень ограничено. Я уверен.
В этом случае лучше всего подходят ответы JugsteR и baudot.
Ответ 10
Нет. Вам нужно будет использовать некоторое облачное решение.