Обмен данными между двумя или более приложениями iPhone - PullRequest
74 голосов
/ 24 февраля 2012

Можно ли обмениваться данными между двумя приложениями на одном устройстве?

Или я могу позволить другому приложению использовать информацию / данные моего приложения или любым другим способом?

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

Это простой пример, а не реальный сценарий.

Ответы [ 10 ]

95 голосов
/ 18 ноября 2013

В изолированной мире разработки для iOS обмен данными между приложениями может оказаться затруднительным, поскольку разработчики iOS не могут обмениваться данными напрямую через файловую систему , им необходимо найтиальтернативные решения для их приложений.Некоторые общие решения включают в себя:

  • UIDocumentInteractionController

  • UIActivityViewController

  • Общий доступ к цепочке ключей

  • Пользовательская схема URL

  • Веб-сервис

  • iCloud API


UIDocumentInteractionController:

Позволяет пользователю открывать документ в любом другом приложении, которое регистрируется как способное обрабатывать определенный документ Универсальный идентификатор типа (UTI) .

В прошлом UIDocumentInteractionController использовался как средство открытия документа в других приложениях на устройстве, например, открытия вложений электронной почты из приложения Почта.

UIDocumentInteractionController

К сожалению, пользовательский интерфейс UIDocumentInteractionController отображает только шесть приложений .

Вы не можете гарантировать, что ваше приложение появится в списке.Хотя UIDocumentInteractionController не устарел, UIActivityViewController обеспечивает более гибкую замену с iOS 6.0.

Доступность: iOS3.2 +

Плюсы:

  • Позволяет совместно использовать общие типы данных с широким спектром приложений.

Минусы:

  • Позволяет контролировать тип данных, отправляемых в UIDocumentInteractionController, но не адресатов.

  • Требуется дополнительное взаимодействие с пользователем.

  • Ограниченное количество адресатов данных может привести к тому, что ваше приложение не будет отображаться в списке.


UIActivityViewController:

Позволяет пользователю выполнять ряд действий с массивом данных.

Например, они могут печатать, отправлять по электронной почте, копировать, публиковать в социальных сетях или открывать в другом приложении.

Вы можете создавать свои собственные подклассы UIActivity для предоставления пользовательских услуг пользователю.

UIActivityController

Наличие: iOS 6.0 +

Плюсы:

  • Отлично подходит для обмена общими типами данных с широким спектром приложений и социальных сетей.

  • Может предоставить массив элементов дляприложение к деятельности.Объекты должны соответствовать протоколу UIActivityItemSource.

  • Имеет возможность устанавливать исключенные типы действий.

  • Пейджинговый интерфейс позволяет использовать больше назначений данных, чем UIDocumentInteractionController.

Минусы:

  • Необходимо определить пользовательский тип действия для ограничения «Открыть в… ”Назначения общих типов данных.

  • Требуется дополнительное взаимодействие с пользователем.


Доступ к Shared Keychain:

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

Все приложения, которые имеют доступ к цепочке ключей, должны использовать один и тот же префикс идентификатора приложения.

Для примера совместного использования цепочки для ключей в действии.См. Пример кода Apple GenericKeychain .

Shared Key Chain

Доступность: iOS 3.0 +

Плюсы:

  • Безопасный доступ к данным.

Минусы:

  • Вы можете обмениваться данными только между приложениями, которые имеют общий префикс идентификатора приложения.

  • API цепочки для ключей на Симуляторе iOS прибывает из OS X, у которого есть API, отличный от того из устройства iOS.


Пользовательская схема URL:

Позволяет передавать данные между приложениями по простым URL-адресам.

Custom URL Scheme

Наличие: iOS 3.0 +

Плюсы:

  • Сетевое соединение не требуется.
  • Отлично подходит для небольших объемов данных, которые вы можете легко кодировать в экранированный юридический URL.

Минусы:


API iCloud:

Все знают, что такое iCloud, плюсы и минусы, так что больше нет объяснение этому.

Но можно спросить, как можно обмениваться данными между приложения внутри одного устройства есть некоторые обходные пути достичь этого.

iCloud

Это возможно, потому что идентификатор, который используется для iCloud отличается от идентификатора пакета, так что можно поделиться изображения, видео и другие документы.

Чтобы узнать больше см. Обсуждение по этой теме


Веб-сервис:

Синхронизация данных через сторонних производителей (например, Dropbox) или через пользовательский веб-интерфейс сервис.

web service

Наличие: iOS 2.0 +

Плюсы:

  • Полезно для обмена и иного распространения больших объемов данных.

Минусы:

  • Требуется подключение к сети.
  • Затраты на реализацию веб-службы.

Ссылка

50 голосов
/ 01 января 2015

Из iOS 8 Я успешно получил доступ к той же папке, используя " Функциональность группы приложений. " Я расширяю ответ @siejkowski.

Примечание: Он будет работать только с той же учетной записи разработчика.

Для этого необходимо выполнить следующие шаги.

  1. first Enable "Группы приложений »из вашей учетной записи разработчика.
  2. Создание профиля обеспечения.и используйте его.

Теперь вам нужно создать два приложения.Имя образца

  1. Demo_Share_One
  2. Demo_Share_Two

Теперь мы копируем изображения из 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];
}

Теперь мы копируем изображения из пакета из 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"], равное нулю.,

Спасибо Apple за Совместное использование элементов из ваших собственных приложений .Удачного кодирования.:)

32 голосов
/ 24 февраля 2012

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

В последних выпусках IOS они немного ослабили это.Например, в руководстве по программированию для iOS теперь есть раздел о передаче данных между приложениями, когда одно приложение запрашивает определенный префикс URL, а затем другие приложения ссылаются на этот URL.Таким образом, возможно, вы настроили приложение для событий так, чтобы оно отвечало на URL «event: //» так же, как веб-сервер отвечает на «http://" URL».

Документация Apple по этому подходу: здесь .

Просмотрите раздел "Реализация пользовательских схем URL".

16 голосов
/ 23 декабря 2014

Начиная с iOS 8, вы можете легко обмениваться данными между приложениями, если они находятся в общей группе приложений.

Документация Apple лучше всего объясняет это в контексте расширений: https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

В основном вам необходимо:

  1. Определение идентификатора группы приложений (в Сертификаты, идентификаторы и профили раздел Member Center для вашей программы Apple для разработчиков.
  2. Включите возможность групп приложений, указав вышеуказанный идентификатор группы приложений для каждого приложения, которое должно взаимодействовать (можно сделать в Xcode: Цель -> Возможности или в Member Center ).
  3. Используйте один из двух 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, будет видно и доступно для всех ваших приложений.

В случае папки, пожалуйста, напишите / прочитайте атомарно только для того, чтобы избежать возможных тупиков.

14 голосов
/ 18 октября 2012

Возможен ли обмен данными между приложениями?Да, это так!

Используйте UIPasteBoard, доступную в iOS 3.0, документация доступна здесь .Документы Apple гласят:

Класс UIPasteboard позволяет приложению обмениваться данными внутри приложения или с другим приложением, используя общесистемные или специфичные для приложения монтажные панели.

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

4 голосов
/ 24 февраля 2012

Вы можете использовать пользовательскую схему URL для доступа к данным из одного приложения в другое. Для получения дополнительной информации перейдите по указанной ниже ссылке -

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

3 голосов
/ 01 мая 2014

Вы можете использовать https://github.com/burczyk/Camouflage для чтения и записи NSData в iOS Camera Roll в виде файла .bmp и обмена им между приложениями:)

Совершенно новое решение!

3 голосов
/ 17 июля 2013

Укажите, что обмен данными между приложениями через UIPasteBoard работает только для приложений в той же группе приложений в iOS7. Как говорят яблоки:

+ [UIPasteboard pasteboardWithName: create:] и + [UIPasteboard pasteboardWithUniqueName] теперь уникально для данного имени, чтобы позволить только тем приложениям в той же группе приложений получить доступ к монтажному столу. Если разработчик попытается создать монтажный стол с именем, которое уже существует, и они не являются частью одного и того же набора приложений, он получит свой собственный уникальный и частный монтажный щит. Обратите внимание, что это не влияет на предоставляемые системой монтажные панели, общие и поиск.

2 голосов
/ 24 февраля 2012

Если вы не против подключиться к сети, вы можете реализовать собственный веб-сервис или использовать какой-либо облачный сервис. Сам по себе iCloud здесь не очень пригодится; это позволяет только обмениваться данными между одним и тем же приложением на разных устройствах. Вы можете прочитать об iCloud здесь .

Без использования сети вы можете использовать « быстрое переключение приложений » для передачи ограниченного объема данных между приложениями через кодировку URL. Фактический объем передаваемых данных я не знаю, но я уверен, что он будет очень ограниченным.

Ответы JugsteR и Baudot являются лучшими в этом случае.

0 голосов
/ 24 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...