Обмен данными между двумя или более приложениями iPhone
Это можно обмениваться данными между двумя приложениями на одном устройстве?
или я могу позволить какому-либо другому приложению использовать информацию / данные моего приложения или каким-либо другим способом?
например, первое приложение предназначено для управления событиями, и я использую его для сохранения некоторых событий. Второе приложение предназначено для напоминаний, которые будут получать данные из другого приложения, чтобы напомнить мне о событии.
Это просто простой пример, а не реальный сценарий.
10 ответов:
исторически сложилось так, что iPhone пытался предотвратить обмен данными между приложениями. Идея заключалась в том, что если вы не можете получить данные другого приложения, вы не можете сделать ничего плохого для этого приложения.
в последних версиях IOS они немного ослабили это. Например, в руководстве по программированию iOS теперь есть раздел о передаче данных между приложениями, когда одно приложение утверждает определенный префикс URL, а затем другие приложения ссылаются на этот URL. Итак, возможно, вы установили свое приложение для событий, чтобы ответить " событие://" URL-адреса так же, как веб-сервер отвечает за URL-адреса "http://".
документация Apple об этом подходе здесь.
загляните в раздел "реализация пользовательских схем URL".
на изолированное мир iOS development обмен данными между приложения могут оказаться сложными, так как разработчики iOS не могут обмениваться данными прямо через файловой системы, они должны найти альтернативный решения для их применения. Некоторые общие решения включают в себя:
UIDocumentInteractionController
UIActivityViewController
общий Брелок Доступа
пользовательская схема URL
Веб-Сервиса
iCloud API
UIDocumentInteractionController:
позволяет пользователю открыть документ в любом другом приложении, которое регистрируется как способный обрабатывать определенный документ Единый Тип Идентификатор (ИМП).
UIDocumentInteractionController был использован в прошлом в качестве средства открытия документа в других приложениях на устройстве, для например, открытие вложений электронной почты из почтового приложения.
к сожалению,UIDOCUMENTINTERACTIONCONTROLLER отображает только пользовательский интерфейс шесть заявок.
вы не можете гарантировать, что ваша заявка появится в списке. Хотя UIDocumentInteractionController не является устаревшим, UIActivityViewController обеспечивает более гибкую замену с iOS 6.0.
в наличии: iOS 3.2+
плюсы:
- позволяет совместно использовать общие типы данных с широким спектром приложения.
плюсы:
позволяет управлять типом данных, отправляемых на UIDocumentInteractionController, но не назначения.
требуется дополнительное взаимодействие с пользователем.
ограниченное число назначений данных может привести к тому, что приложение не будет отображаться в списке.
UIActivityViewController:
позволяет пользователю выполнять ряд действий с массивом данных.
например, они могут печатать, отправлять по электронной почте, копировать, отправлять сообщения социальные медиа, или открыть в другом приложении.
вы можете создать свои собственные подклассы UIActivity для предоставления пользовательских услуги для пользователя.
в наличии: iOS 6.0+
плюсы:
большой для общих типов данных с широким спектром приложений и социальных медиа.
можем массив элементов для приложения к действию. Объекты должны соответствовать протоколу UIActivityItemSource.
имеет возможность устанавливать исключенные типы активности.
интерфейс подкачки позволяет использовать больше назначений данных, чем UIDocumentInteractionController.
плюсы:
вы должны определить пользовательский тип действия, чтобы ограничить" открыть в... " назначения общих данных типы.
требуется дополнительное взаимодействие с пользователем.
Общий Доступ К Связке Ключей:
позволяет безопасно хранить данные в общей связке ключей, что другие приложения, которые являются частью набора приложений, могут получить доступ.
все приложения, имеющие общий доступ к связке ключей, должны использовать один и тот же идентификатор приложения префикс.
для примера общего доступа к связке ключей в действии. Видеть Яблоко GenericKeychain пример кода.
в наличии: iOS 3.0+
плюсы:
- защищенный доступ к данным.
плюсы:
вы можете обмениваться данными только между приложениями, которые имеют общий префикс идентификатора приложения.
в Keychain API на симуляторе iOS поставляется из OS X, который имеет другой API, чем у устройства iOS.
пользовательская схема URL:
позволяет передавать данные между приложениями с помощью простых URL-адресов.
в наличии: iOS 3.0+
плюсы:
- нет подключения к сети требуемый.
- отлично подходит для небольших объемов данных, которые вы можете легко кодировать в экранированный, юридический URL.
плюсы:
вы должны кодировать данные в экранированный юридический URL.
Примечание: кодировка base64 часто используется для преобразования сериализуемых данных в строковое значение. Однако строки base64 могут содержать символы, недопустимые для использования в URL-адресах. Вы можете рассмотреть возможность использования base64url. см. кодировку Base 64 с URL и именем файла Safe Alphabet для получения дополнительной информации.
iCloud API:
все знают о том, что такое iCloud, плюсы и минусы, так что не более объяснения тому.
но можно спросить, как можно обмениваться данными между приложения внутри одного устройства есть некоторые обходные пути достигать что.
это возможно потому, что идентификатор, который используется для iCloud, это отличается от идентификатора пакета, так что можно поделиться изображения,видео и другие документы.
узнать больше смотрите обсуждение по этой теме
Веб-Сервиса:
синхронизация данных через третью сторону (например, Dropbox) или пользовательский веб-сайт услуга.
в наличии: iOS 2.0+
плюсы:
- полезно для обмена и иные способы распространения больших объемов данных.
плюсы:
- требуется подключение к сети.
- реализация веб-сервиса накладные расходы.
С iOS 8 я успешно получил доступ к той же папке с помощью "Функциональность Группы Приложений. " я расширяю ответ @siejkowski.
Примечание: он будет работать только с той же учетной записи разработчика.
для этого вы должны выполнить следующие шаги.
- сначала включите "группы приложений" из своей учетной записи разработчика.
- создать профиля подготовки. и использовать его.
теперь вы должны создайте два приложения. Имя Образца
- Demo_Share_One
- 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"] имеет значение null.
Спасибо Apple за доля элементов из ваших собственных приложений функциональности. Счастливое Кодирование. :)
начиная с iOS 8 вы можете легко обмениваться данными между приложениями, пока они находятся в общей группе приложения.
документация Apple лучше всего объясняет это в контексте расширений: https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html
в принципе, вам нужно:
- определить идентификатор группы приложений (в Сертификаты, Идентификаторы И Профили из Member Center для вашей программы разработчика Apple.
- включить возможность групп приложений, указав вышеуказанный идентификатор группы приложений для каждого приложения, которое должно взаимодействовать (cen может быть сделано либо в Xcode:Цели -> Функции или Member Center).
- используйте один из двух 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
будет виден и доступен для всех ваших приложений.в случае папки, пожалуйста, напишите / прочитайте атомарно, чтобы убедиться, что нет взаимоблокировок возможны.
обмен данными между приложениями? Да, это так!
используйте UIPasteBoard, доступный из iOS 3.0, документация доступна здесь. Apple docs говорят:
класс UIPasteboard позволяет приложению совместно использовать данные внутри приложения или с другим приложением, используя общесистемные или специфические для приложения пастбища.
также можно обмениваться данными между приложениями в связке ключей, хотя данные в первую очередь подразумеваются чтобы быть паролями и т. д., Все, что можно сериализовать, может быть сохранено. здесь Это вопрос переполнения стека об этом.
вы можете использовать пользовательскую схему URL для доступа к данным из одного приложения в другое. Следуйте по ссылке ниже для получения дополнительной информации -
http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html
обратите внимание, что обмен данными между приложениями через UIPasteBoard работает только для приложений в той же группе приложений в iOS7. Как яблоки говорит:
+[UIPasteboard pasteboardWithName: create:] и +[UIPasteboard pasteboardWithUniqueName] теперь уникальное имя, чтобы разрешить только те приложения в той же группе приложений для доступа к pasteboard. Если разработчик попытается создать картон с именем, которое уже существует, и они не являются частью одного и того же набора приложений, они получат свои собственный уникальный и частный картон. Обратите внимание, что это не влияет на систему, при условии, папки, общие, и найти.
вы можете использовать https://github.com/burczyk/Camouflage для чтения и записи NSData в iOS Camera Roll as .bmp-файл и поделиться им между приложениями :)
новое решение!
Если вы не против попасть в сеть, вы можете реализовать пользовательский веб-сервис для этого или использовать какой-то облачный сервис. сам iCloud не будет много пользы здесь; он позволяет только обмениваться данными между одним и тем же приложением на разных устройствах. Вы можете прочитать об iCloud здесь.
без использования сети, вы можете использовать "быстрое переключение приложений" для передачи ограниченного объема данных между приложениями через URL-кодирование. Фактический объем передаваемых данных Я не знаю, но это было бы очень ограничено, я уверен.
ответы Джагстера и Бодо лучше всего в этом случае.