Совместное использование данных между двумя или более приложениями 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 позволяет приложению обмениваться данными в приложении или с другим приложением с использованием системных или прикладных платформ.

Также можно обмениваться данными между приложениями в цепочке ключей, хотя данные в первую очередь предназначены для использования паролями и, таким образом, могут быть сохранены все, что может быть сериализовано. Здесь - вопрос о переполнении стека.

Ответ 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

Нет. Вам нужно будет использовать некоторое облачное решение.