동일한 장치의 두 응용 프로그램간에 데이터를 공유 할 수 있습니까?
아니면 다른 응용 프로그램이 내 응용 프로그램의 정보 / 데이터를 사용하거나 다른 방식으로 사용하도록 허용 할 수 있습니까?
예를 들어 첫 번째 응용 프로그램은 이벤트 관리 용이며 일부 이벤트를 저장하는 데 사용합니다. 두 번째 응용 프로그램은 미리 알림을위한 것으로, 이벤트에 대해 상기시키기 위해 다른 응용 프로그램에서 데이터를 가져옵니다.
이것은 실제 시나리오가 아닌 단순한 예입니다.
답변
역사적으로 iPhone은 앱 간의 데이터 공유를 방지하려고 노력했습니다. 아이디어는 다른 앱의 데이터를 얻을 수 없다면 그 앱에 나쁜 일을 할 수 없다는 것입니다.
최근 출시 된 IOS에서는 약간 느슨해졌습니다. 예를 들어 iOS 프로그래밍 가이드에는 이제 한 앱이 특정 URL 접두사를 요청하고 다른 앱이 해당 URL을 참조하도록하여 앱간에 데이터를 전달하는 섹션이 있습니다. 따라서 웹 서버가 “http : //”URL에 응답하는 것과 동일한 방식으로 “event : //”URL에 응답하도록 이벤트 앱을 설정할 수 있습니다.
이러한 접근 방식에 대한 Apple의 문서는 여기에 있습니다 .
“사용자 정의 URL 체계 구현”을 살펴보십시오.
답변
샌드 박스 화 된 iOS 개발 세계 에서는 애플리케이션간에 데이터를 공유하는 것이 어려울 수 있습니다. iOS 개발자는 파일 시스템을 통해 직접 데이터를 공유 할 수 없기 때문에 애플리케이션에 대한 대체 솔루션을 찾아야합니다. 몇 가지 일반적인 솔루션은 다음과 같습니다.
-
UIDocumentInteractionController
-
UIActivityViewController
-
공유 키 체인 접근
-
맞춤 URL 체계
-
웹 서비스
-
iCloud API
UIDocumentInteractionController :
사용자가 특정 문서 UTI (Uniform Type Identifier) 를 처리 할 수있는 것으로 등록 된 다른 애플리케이션에서 문서를 열 수 있습니다 .
UIDocumentInteractionController는 과거에 기기의 다른 애플리케이션에서 문서를 여는 수단 (예 : 메일 앱에서 이메일 첨부 파일 열기)으로 사용되었습니다.
불행히도 UIDocumentInteractionController의 UI는 6 개의 애플리케이션 만 표시합니다 .
귀하의 애플리케이션이 목록에 표시된다는 보장은 없습니다. UIDocumentInteractionController는 더 이상 사용되지 않지만
UIActivityViewController 는 iOS 6.0부터 더 유연한 대체 기능을 제공합니다.
유효성: iOS 3.2 이상
장점 :
- 다양한 애플리케이션과 공통 데이터 유형을 공유 할 수 있습니다.
단점 :
-
UIDocumentInteractionController로 전송되는 데이터 유형을 제어 할 수 있지만 대상은 제어 할 수 없습니다.
-
추가 사용자 상호 작용이 필요합니다.
-
제한된 수의 데이터 대상으로 인해 응용 프로그램이 목록에 표시되지 않을 수 있습니다.
UIActivityViewController :
사용자가 데이터 배열로 여러 작업을 수행 할 수 있습니다.
예를 들어 인쇄, 이메일, 복사, 소셜 미디어에 게시하거나 다른 응용 프로그램에서 열 수 있습니다.
사용자에게 사용자 지정 서비스를 제공하기 위해 고유 한 UIActivity 하위 클래스를 만들 수 있습니다.
가용성 : iOS 6.0 이상
장점 :
-
다양한 애플리케이션 및 소셜 미디어와 공통 데이터 유형을 공유하는 데 적합합니다.
-
활동에 적용 할 항목 배열을 제공 할 수 있습니다. 개체는 UIActivityItemSource 프로토콜을 준수해야합니다.
-
제외 된 활동 유형을 설정할 수 있습니다.
-
페이징 UI는 UIDocumentInteractionController보다 더 많은 데이터 대상을 허용합니다.
단점 :
-
공통 데이터 유형의 “열기…”대상을 제한하려면 사용자 정의 활동 유형을 정의해야합니다.
-
추가 사용자 상호 작용이 필요합니다.
공유 키 체인 액세스 :
응용 프로그램 제품군의 일부인 다른 응용 프로그램이 액세스 할 수있는 공유 키 체인에 데이터를 안전하게 저장할 수 있습니다.
키 체인 액세스를 공유하는 모든 애플리케이션은 동일한 앱 ID 접두사를 사용해야합니다.
실행중인 공유 키 체인 액세스의 예입니다. Apple의 GenericKeychain 샘플 코드를 참조하십시오 .
가용성 : iOS 3.0 이상
장점 :
- 데이터에 대한 보안 액세스.
단점 :
-
공통 앱 ID 접두사를 공유하는 애플리케이션간에 만 데이터를 공유 할 수 있습니다.
-
iOS 시뮬레이터의 키 체인 API는 iOS 기기와 다른 API가있는 OS X에서 제공됩니다.
맞춤 URL 체계 :
단순 URL을 사용하여 애플리케이션간에 데이터를 전달할 수 있습니다.
가용성 : iOS 3.0 이상
장점 :
- 네트워크 연결이 필요하지 않습니다.
- 이스케이프 된 합법적 인 URL로 쉽게 인코딩 할 수있는 소량의 데이터에 적합합니다.
단점 :
-
데이터를 이스케이프 된 법적 URL로 인코딩해야합니다.
참고 : base64 인코딩은 직렬화 가능한 데이터를 문자열 값으로 바꾸는 데 일반적으로 사용되었습니다. 그러나 base64 문자열에는 URL에서 사용할 수없는 문자가 포함될 수 있습니다. base64url 사용을 고려할 수 있습니다. 자세한 내용은 URL 및 파일 이름 안전 알파벳 을 사용한 Base 64 인코딩 을 참조하십시오.
iCloud API :
모두가 iCloud, 장단점에 대해 알고 있으므로 더 이상 설명하지 않습니다.
그러나 하나의 장치 내에서 응용 프로그램간에 데이터를 공유 할 수있는 방법에 대해 몇 가지 해결 방법이 있는지 묻습니다.
iCloud에 사용되는 식별자가 번들 식별자와 다르기 때문에 가능하므로 이미지, 동영상, 기타 문서 공유가 가능합니다.
웹 서비스:
타사 (예 : Dropbox) 또는 맞춤형 웹 서비스를 통해 데이터를 동기화합니다.
가용성 : iOS 2.0 이상
장점 :
- 많은 양의 데이터를 공유하거나 배포하는 데 유용합니다.
단점 :
- 네트워크 연결이 필요합니다.
- 웹 서비스 구현 오버 헤드.
답변
에서 아이폰 OS 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
기본적으로 다음을 수행해야합니다.
- 앱 그룹 ID를 정의 합니다 (Apple 개발자 프로그램에 대한 Member Center 의 인증서, 식별자 및 프로필 섹션에서) .
- 통신해야하는 각 앱에 대해 위의 앱 그룹 ID를 지정하는 앱 그룹 기능을 활성화합니다 (cen은 Xcode : Target- > Capabilities 또는 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
모든 앱에서 표시되고 액세스 할 수 있습니다.
폴더의 경우 교착 상태가 발생하지 않도록 원자 단위로 쓰고 읽으십시오.
답변
앱간에 데이터를 공유 할 수 있습니까? 네, 그렇습니다!
iOS 3.0에서 제공되는 UIPasteBoard를 사용 하십시오 . 문서는 여기에서 볼 수 있습니다 . Apple 문서는 다음과 같이 말합니다.
UIPasteboard 클래스를 사용하면 애플리케이션이 애플리케이션 내에서 또는 시스템 전체 또는 애플리케이션 별 페이스트 보드를 사용하여 다른 애플리케이션과 데이터를 공유 할 수 있습니다.
키 체인에있는 앱간에 데이터를 공유하는 것도 가능하지만, 데이터는 기본적으로 암호이므로 직렬화 가능한 모든 것을 저장할 수 있습니다.
여기 에 대한 스택 오버플로 질문이 있습니다.
답변
사용자 지정 URL 체계를 사용하여 한 앱에서 다른 앱으로 데이터에 액세스 할 수 있습니다. 자세한 내용은 아래 언급 된 링크를 따르십시오-
http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html
답변
UIPasteBoard를 통해 앱간에 데이터를 공유하는 것은 iOS7의 동일한 애플리케이션 그룹에있는 앱에서만 작동한다고 언급합니다. 사과가 말했듯이 :
+ [UIPasteboard pasteboardWithName : create :] 및 + [UIPasteboard pasteboardWithUniqueName]은 이제 동일한 애플리케이션 그룹에있는 앱만 대지에 액세스 할 수 있도록 주어진 이름을 고유하게합니다. 개발자가 이미 존재하고 동일한 앱 스위트의 일부가 아닌 이름으로 대지를 만들려고하면 고유 한 개인 대지를 갖게됩니다. 이것은 시스템에서 제공하는 대지, 일반 및 찾기에 영향을주지 않습니다.