둘 이상의 iPhone 응용 프로그램 간에 데이터 공유
동일한 장치에 있는 두 애플리케이션 간에 데이터를 공유할 수 있습니까?
아니면 다른 응용프로그램이 내 응용프로그램의 정보/데이터 또는 다른 방법으로 사용하도록 허용할 수 있습니까?
예를 들어, 첫 번째 응용 프로그램은 이벤트 관리를 위한 것이며, 저는 이 응용 프로그램을 사용하여 이벤트를 저장을 합니다.두 번째 응용 프로그램은 알림을 위한 것으로, 다른 응용 프로그램에서 이벤트에 대한 정보를 가져옵니다.
이것은 실제 시나리오가 아닌 단순한 예일 뿐입니다.
애플리케이션 간에 데이터를 공유하는 것은 iOS 개발자들이 파일 시스템을 통해 직접 데이터를 공유할 수 없기 때문에 애플리케이션에 대한 대체 솔루션을 찾아야 합니다.일반적인 솔루션은 다음과 같습니다.
UID 문서상호 작용 제어기
UIActivityView 컨트롤러
공유 키 체인 액세스
사용자 지정 URL 구성표
웹 서비스
아이클라우드 API
UID 문서상호 작용 컨트롤러:
사용자가 특정 문서 UTI(Uniform Type Identifier)를 처리할 수 있는 것으로 등록된 다른 응용프로그램에서 문서를 열 수 있습니다.
UID 문서상호 작용 컨트롤러는 과거에 메일 앱에서 전자 메일 첨부 파일을 여는 등 장치의 다른 응용 프로그램에서 문서를 여는 수단으로 사용되었습니다.
유감스럽게도 UID 문서는InteractionController의 UI는 6개의 응용프로그램만 표시합니다.
응용프로그램이 목록에 표시될 것이라고 보장할 수 없습니다.UID 문서 중InteractionController는 더 이상 사용되지 않으며, UIActivityViewController는 iOS 6.0부터 보다 유연한 교체 기능을 제공합니다.
가용성: iOS 3.2+
찬성:
- 다양한 애플리케이션과 공통 데이터 유형을 공유할 수 있습니다.
단점:
UID 문서로 전송되는 데이터 유형을 제어할 수 있습니다.상호 작용 컨트롤러(대상은 아님).
추가 사용자 상호 작용이 필요합니다.
데이터 대상 수가 제한되어 있으면 응용 프로그램이 목록에 표시되지 않을 수 있습니다.
UIAactivityView 컨트롤러:
사용자가 데이터 배열을 사용하여 여러 작업을 수행할 수 있습니다.
예를 들어 인쇄, 전자 메일, 복사, 소셜 미디어에 게시 또는 다른 응용 프로그램에서 열 수 있습니다.
고유한 UIActivity 하위 클래스를 만들어 사용자에게 사용자 지정 서비스를 제공할 수 있습니다.
가용성: iOS 6.0+
찬성:
다양한 애플리케이션 및 소셜 미디어와 공통 데이터 유형을 공유하는 데 적합합니다.
활동에 적용할 항목의 배열을 제공할 수 있습니다.개체는 UIActivity를 준수해야 합니다.ItemSource 프로토콜입니다.
제외된 활동 유형을 설정할 수 있습니다.
페이징 UI는 UID 문서보다 더 많은 데이터 대상을 허용합니다.상호 작용 제어기.
단점:
사용자 정의 활동 유형을 정의하여 공통 데이터 유형의 "열린 위치…" 대상을 제한해야 합니다.
추가 사용자 상호 작용이 필요합니다.
공유 키 체인 액세스:
응용프로그램 모음의 일부인 다른 응용프로그램이 액세스할 수 있는 공유 키 체인에 데이터를 안전하게 저장할 수 있습니다.
키 체인 액세스를 공유하는 모든 응용 프로그램은 동일한 응용 프로그램 ID 접두사를 사용해야 합니다.
실행 중인 공유 키 체인 액세스의 예입니다.Apple의 Generic Keychain 샘플 코드를 참조하십시오.
가용성: iOS 3.0+
찬성:
- 데이터에 대한 안전한 액세스.
단점:
공통 앱 ID 접두사를 공유하는 응용 프로그램 간에만 데이터를 공유할 수 있습니다.
iOS 시뮬레이터의 Keychain API는 iOS 기기와 API가 다른 OS X에서 제공됩니다.
사용자 지정 URL 구성표:
단순 URL을 사용하여 응용프로그램 간에 데이터를 전달할 수 있습니다.
가용성: iOS 3.0+
찬성:
- 네트워크 연결이 필요하지 않습니다.
- 이스케이프된 합법적인 URL로 쉽게 인코딩할 수 있는 소량의 데이터에 적합합니다.
단점:
- 데이터를 이스케이프 합법적 URL로 인코딩해야 합니다.
참고: base64 인코딩은 직렬화 가능한 데이터를 문자열 값으로 변환하는 데 일반적으로 사용됩니다.그러나 base64 문자열에는 URL에 사용할 수 없는 문자가 포함될 수 있습니다.base64url 사용을 고려할 수 있습니다.자세한 내용은 URL 및 파일 이름 안전 알파벳을 사용한 기본 64 인코딩을 참조하십시오.
iCloud API:
모두가 아이클라우드, 찬성과 반대가 무엇인지 알고 있으므로 더 이상 설명할 필요가 없습니다.
그러나 단일 장치 내의 애플리케이션 간에 데이터를 공유하는 것이 어떻게 가능한지에 대한 몇 가지 해결 방법이 있을 수 있습니다.
iCloud에 사용되는 식별자가 번들 식별자와 달라 이미지, 동영상 및 기타 문서를 공유할 수 있기 때문에 가능합니다.
자세한 내용은 이 항목에 대한 토론을 참조하십시오.
웹 서비스:
타사(예: Dropbox) 또는 맞춤형 웹 서비스를 통해 데이터를 동기화합니다.
가용성: iOS 2.0+
찬성:
- 대량의 데이터를 공유하거나 배포하는 데 유용합니다.
단점:
- 네트워크 연결이 필요합니다.
- 웹 서비스 구현 오버헤드입니다.
iOS 8에서 "앱 그룹 기능"을 사용하여 동일한 폴더에 성공적으로 액세스했습니다.@siejkowski의 답변을 연장합니다.
참고: 동일한 개발자 계정에서만 작동합니다.
그러기 위해서는 아래 단계를 따라야 합니다.
- 먼저 개발자 계정에서 "앱 그룹"을 활성화합니다.
- 프로비저닝 프로파일을 생성하고 사용합니다.
이제 두 개의 앱을 만들어야 합니다.샘플 이름
- 데모_공유_원
- 데모_공유_투
이제 Demo_Share_One에서 공유 폴더로 이미지를 복사하고 있습니다. 공유 폴더는 앱 그룹을 활성화하고 앱을 실행할 때 기본적으로 생성되며 Demo_Share_Two의 모든 이미지에 액세스합니다.
은 당신의 으로 설정된 Take 가야 합니다. say 당신당은개설합그가이니다져야가름을룹.라고 말합니다.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에서 작성한 모든 이미지를 얻을 수 있습니다.
따라서 지금부터 이 폴더 2를 세 번째 앱으로 공유하고 싶다면 그룹에 해당 앱을 추가하면 됩니다.따라서 다중 앱에서 동일한 요소에 액세스하는 것이 너무 쉽습니다.
앱에서 앱 그룹을 활성화하지 않을 경우그러면 [자체 getSharedLocationPath:@"그룹.filessharingdemo"]이(가) null입니다.
Apple이 자체 앱 기능의 Share Elements를 제공해 주셔서 감사합니다.해피 코딩.:)
역사적으로 아이폰은 앱 간의 데이터 공유를 방지하기 위해 노력해 왔습니다.다른 앱의 데이터를 얻을 수 없다면 그 앱에 나쁜 짓을 할 수 없다는 생각이었습니다.
IOS의 최근 릴리스에서는 이를 다소 완화했습니다.예를 들어, iOS 프로그래밍 가이드에는 이제 한 앱이 특정 URL 접두사를 할당한 다음 다른 앱이 해당 URL을 참조하도록 하여 앱 간에 데이터를 전달하는 섹션이 있습니다. 따라서 웹 서버가 "http://" URL에 응답하는 것과 같은 방식으로 이벤트 앱이 "event:/" URL에 응답하도록 설정할 수 있습니다.
이러한 접근 방식에 대한 Apple의 문서화는 여기에 있습니다.
사용자 지정 URL 체계 구현 아래에서 엿봅니다.
iOS 8은 공통 앱 그룹에 있는 한 앱 간에 데이터를 쉽게 공유할 수 있습니다.
Apple 설명서는 확장 컨텍스트에서 이를 가장 잘 설명합니다. https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html
기본적으로 다음을 수행해야 합니다.
- 앱 그룹 ID를 정의합니다(Apple Developer Program용 Member Center의 인증서, 식별자 및 프로필 섹션).
- 통신해야 하는 각 앱에 대해 위의 앱 그룹 ID를 지정하는 앱 그룹 기능을 활성화합니다(Xcode:대상 -> 역량 또는 회원 센터).
- 공유 컨테이너 액세스에 두 개의 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
모든 앱에서 볼 수 있고 액세스할 수 있습니다.
폴더의 경우 교착 상태가 발생하지 않도록 원자적으로 쓰기/읽기하십시오.
앱 간에 데이터를 공유할 수 있습니까?네, 그렇습니다!
iOS 3.0에서 사용할 수 있는 UIPasteBoard를 사용하십시오. 설명서는 여기에서 사용할 수 있습니다.Apple 문서는 다음과 같이 말합니다.
UIP 게시판 클래스를 사용하면 응용 프로그램이 시스템 전체 또는 응용 프로그램별 붙여넣기 보드를 사용하여 응용 프로그램 내 또는 다른 응용 프로그램과 데이터를 공유할 수 있습니다.
키 체인의 앱 간에 데이터를 공유할 수도 있습니다. 데이터는 주로 암호 등을 사용하지만 직렬화 가능한 모든 데이터를 저장할 수 있습니다.다음은 스택 오버플로 문제입니다.
사용자 지정 URL 구성표를 사용하여 한 앱에서 다른 앱으로 데이터에 액세스할 수 있습니다.자세한 내용은 아래 링크를 참조하십시오.
http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html
UIPasteBoard를 통한 앱 간 데이터 공유는 iOS7에서 동일한 애플리케이션 그룹에 있는 앱에서만 작동합니다.사과의 말처럼:
+[UIP 게시판 이름:create:] 및 +[UIP 게시판 게시판 게시판 게시판 만들기]이제 UniqueName]을(를) 사용하여 지정된 이름을 고유하게 지정하여 동일한 응용 프로그램 그룹의 앱만 붙여넣기 보드에 액세스할 수 있습니다.개발자가 이미 존재하는 이름의 붙여넣기 보드를 만들려고 시도하고 동일한 앱 제품군의 일부가 아닌 경우, 개발자는 고유하고 개인적인 붙여넣기 보드를 얻게 됩니다.시스템에서 제공하는 Pasteboard, General 및 Find에는 영향을 주지 않습니다.
네트워크에 접속하는 것이 괜찮다면 사용자 지정 웹 서비스를 구현하거나 클라우드 서비스를 사용할 수 있습니다.iCloud 자체는 여기서 큰 도움이 되지 않을 것입니다. 다른 장치의 동일한 앱 간에만 데이터를 공유할 수 있습니다.여기에서 iCloud에 대해 읽을 수 있습니다.
네트워크를 사용하지 않고 "빠른 앱 전환"을 이용하여 URL 인코딩을 통해 앱 간에 제한된 양의 데이터를 전송할 수 있습니다.실제 전송 가능한 데이터의 양은 모르겠지만 매우 제한적일 것이라고 확신합니다.
JugsteR과 Baudot의 대답은 이 경우에 가장 좋습니다.
https://github.com/burczyk/Camouflage 을 사용하여 iOS 카메라 롤에 .bmp 파일로 NSData를 읽고 쓰고 앱 간에 공유할 수 있습니다 :)
새로운 솔루션!
아니요. 클라우드 솔루션을 사용해야 합니다.
언급URL : https://stackoverflow.com/questions/9425706/share-data-between-two-or-more-iphone-applications
'programing' 카테고리의 다른 글
그리스몽키에서 jQuery를 사용하려면 어떻게 해야 합니까? (0) | 2023.08.08 |
---|---|
스위프트에서 GIF 이미지를 로드하는 방법은 무엇입니까? (0) | 2023.08.08 |
UISegmentedControl에서 문자열 값 가져오기 (0) | 2023.08.08 |
iOS에서 numpad 키보드에 '완료' 버튼을 추가하는 방법 (0) | 2023.08.08 |
mariadb 프로세스 목록의 InnoDB 정리 작업자 (0) | 2023.08.08 |