두 개 이상의 iPhone 응용 프로그램간에 데이터 공유


79

동일한 장치의 두 응용 프로그램간에 데이터를 공유 할 수 있습니까?

아니면 다른 응용 프로그램이 내 응용 프로그램의 정보 / 데이터를 사용하거나 다른 방식으로 사용하도록 허용 할 수 있습니까?

예를 들어 첫 번째 응용 프로그램은 이벤트 관리 용이며 일부 이벤트를 저장하는 데 사용합니다. 두 번째 응용 프로그램은 미리 알림을위한 것으로, 이벤트에 대해 상기시키기 위해 다른 응용 프로그램에서 데이터를 가져옵니다.

이것은 실제 시나리오가 아닌 단순한 예입니다.

답변:


38

역사적으로 iPhone은 앱 간의 데이터 공유를 방지하려고 노력했습니다. 아이디어는 다른 앱의 데이터를 얻을 수 없다면 그 앱에 나쁜 일을 할 수 없다는 것입니다.

최근 출시 된 IOS에서는 약간 느슨해졌습니다. 예를 들어 iOS 프로그래밍 가이드에는 이제 한 앱이 특정 URL 접두사를 요청하고 다른 앱이 해당 URL을 참조하도록하여 앱간에 데이터를 전달하는 섹션이 있습니다. 따라서 웹 서버가 "http : //"URL에 응답하는 것과 동일한 방식으로 "event : //"URL에 응답하도록 이벤트 앱을 설정할 수 있습니다.

이러한 접근 방식에 대한 Apple의 문서는 여기에 있습니다 .

"사용자 정의 URL 체계 구현"을 살펴보십시오.


감사합니다. 제가 찾고있는 것이 바로 이것이었습니다.
Kamleshwar

대용량 데이터 (예 : 파일)를 그런 방식으로 공유 할 수 있습니까?
AlikElzin-kilaka

2
지금까지 읽고 있다면 아래 @siejkowski 응답이 최신이므로 확인하십시오.
mahboudz 2015 년

1
@ chintan-maddy-ramani의 답변도 주목할 만합니다.
mahboudz 2015 년

2
예,이 답변을 작성한 이후로 더 나은 방법이 많이 추가되었습니다. 오래된 질문에는 오래된 답변이 있습니다!
baudot

103

샌드 박스 화 된 iOS 개발 세계 에서는 애플리케이션간에 데이터를 공유하는 것이 어려울 수 있습니다. iOS 개발자는 파일 시스템을 통해 직접 데이터를 공유 할 수 없기 때문에 애플리케이션에 대한 대체 솔루션을 찾아야합니다. 몇 가지 일반적인 솔루션은 다음과 같습니다.

  • UIDocumentInteractionController

  • UIActivityViewController

  • 공유 키 체인 접근

  • 맞춤 URL 체계

  • 웹 서비스

  • iCloud API


UIDocumentInteractionController :

사용자가 특정 문서 UTI (Uniform Type Identifier) 를 처리 할 수있는 것으로 등록 된 다른 애플리케이션에서 문서를 열 수 있습니다 .

UIDocumentInteractionController는 과거에 기기의 다른 애플리케이션에서 문서를 여는 수단 (예 : 메일 앱에서 이메일 첨부 파일 열기)으로 사용되었습니다.

UIDocumentInteractionController

불행히도 UIDocumentInteractionController의 UI는 6 개의 애플리케이션 만 표시합니다 .

귀하의 애플리케이션이 목록에 표시된다는 보장은 없습니다. UIDocumentInteractionController는 더 이상 사용되지 않지만 UIActivityViewController 는 iOS 6.0부터 더 유연한 대체 기능을 제공합니다.

유효성: iOS 3.2 이상

장점 :

  • 다양한 애플리케이션과 공통 데이터 유형을 공유 할 수 있습니다.

단점 :

  • UIDocumentInteractionController로 전송되는 데이터 유형을 제어 할 수 있지만 대상은 제어 할 수 없습니다.

  • 추가 사용자 상호 작용이 필요합니다.

  • 제한된 수의 데이터 대상으로 인해 응용 프로그램이 목록에 표시되지 않을 수 있습니다.


UIActivityViewController :

사용자가 데이터 배열로 여러 작업을 수행 할 수 있습니다.

예를 들어 인쇄, 이메일, 복사, 소셜 미디어에 게시하거나 다른 응용 프로그램에서 열 수 있습니다.

사용자에게 사용자 지정 서비스를 제공하기 위해 고유 한 UIActivity 하위 클래스를 만들 수 있습니다.

UIActivityController

가용성 : iOS 6.0 이상

장점 :

  • 다양한 애플리케이션 및 소셜 미디어와 공통 데이터 유형을 공유하는 데 적합합니다.

  • 활동에 적용 할 항목 배열을 제공 할 수 있습니다. 개체는 UIActivityItemSource 프로토콜을 준수해야합니다.

  • 제외 된 활동 유형을 설정할 수 있습니다.

  • 페이징 UI는 UIDocumentInteractionController보다 더 많은 데이터 대상을 허용합니다.

단점 :

  • 공통 데이터 유형의 "열기…"대상을 제한하려면 사용자 정의 활동 유형을 정의해야합니다.

  • 추가 사용자 상호 작용이 필요합니다.


공유 키 체인 액세스 :

응용 프로그램 제품군의 일부인 다른 응용 프로그램이 액세스 할 수있는 공유 키 체인에 데이터를 안전하게 저장할 수 있습니다.

키 체인 액세스를 공유하는 모든 애플리케이션은 동일한 앱 ID 접두사를 사용해야합니다.

실행중인 공유 키 체인 액세스의 예입니다. Apple의 GenericKeychain 샘플 코드를 참조하십시오 .

공유 키 체인

가용성 : iOS 3.0 이상

장점 :

  • 데이터에 대한 보안 액세스.

단점 :

  • 공통 앱 ID 접두사를 공유하는 애플리케이션간에 만 데이터를 공유 할 수 있습니다.

  • iOS 시뮬레이터의 키 체인 API는 iOS 기기와 다른 API가있는 OS X에서 제공됩니다.


맞춤 URL 체계 :

단순 URL을 사용하여 애플리케이션간에 데이터를 전달할 수 있습니다.

맞춤 URL 체계

가용성 : iOS 3.0 이상

장점 :

  • 네트워크 연결이 필요하지 않습니다.
  • 이스케이프 된 합법적 인 URL로 쉽게 인코딩 할 수있는 소량의 데이터에 적합합니다.

단점 :

  • 데이터를 이스케이프 된 법적 URL로 인코딩해야합니다.

    참고 : base64 인코딩은 직렬화 가능한 데이터를 문자열 값으로 바꾸는 데 일반적으로 사용되었습니다. 그러나 base64 문자열에는 URL에서 사용할 수없는 문자가 포함될 수 있습니다. base64url 사용을 고려할 수 있습니다. 자세한 내용은 URL 및 파일 이름 안전 알파벳사용한 Base 64 인코딩 을 참조하십시오.


iCloud API :

모두가 iCloud, 장단점에 대해 알고 있으므로 더 이상 설명하지 않습니다.

그러나 하나의 장치 내에서 응용 프로그램간에 데이터를 공유 할 수있는 방법에 대해 몇 가지 해결 방법이 있는지 묻습니다.

iCloud

iCloud에 사용되는 식별자가 번들 식별자와 다르기 때문에 가능하므로 이미지, 동영상, 기타 문서 공유가 가능합니다.

자세한 내용은이 주제에 대한 토론을 참조하십시오.


웹 서비스:

타사 (예 : Dropbox) 또는 맞춤형 웹 서비스를 통해 데이터를 동기화합니다.

웹 서비스

가용성 : iOS 2.0 이상

장점 :

  • 많은 양의 데이터를 공유하거나 배포하는 데 유용합니다.

단점 :

  • 네트워크 연결이 필요합니다.
  • 웹 서비스 구현 오버 헤드.

참고


3
광범위한 대답 및 그래픽의 사용과 같은
coolharsh55

1
UIPasteboardAPI도 언급해야 합니다.
Evgeny Karkan

@EvgenyKarkan-게시물을 자유롭게 편집하십시오 :)
Durai Amuthan.H

54

에서 아이폰 OS 8 내가 사용에 성공적으로 액세스 같은 폴더했습니다 " 앱 그룹 기능을. "나는 @siejkowski의 대답을 확장하고있다.

참고 : 동일한 개발자 계정에서만 작동합니다.

이를 위해 아래 단계를 따라야합니다.

  1. 먼저 개발자 계정에서 "앱 그룹"을 활성화합니다.
  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"]가 null이됩니다.

자신의 앱 기능에서 요소공유 하는 Apple 덕분 입니다. 행복한 코딩. :)


s / getSharedLocationPath : / sharedLocationPathForAppGroup : / :-)
Ivan Vučica

1
@ChintaN -Maddy- Ramani는 공유 위치 경로에 sqlLite 또는 영역 db를 포함 할 수 있습니까? 이를 위해 확장이 필요합니까?
user2363025 2016

@ user2363025 아마도 그렇습니다. 당신은 시도 할 수 있습니다. 방금 이미지로 시도했습니다. 거기에 데이터베이스를 복사 할 수 있습니다.
ChintaN -Maddy- Ramani 2011

@ ChintaN-Maddy-Ramani. 아래 오류가 발생합니다. Domain = NSCocoaErrorDomain Code = 512 ""1FAA9B86-E775-4A2D-A2D6-A442C8A9A8FA "파일을"AppGroup "폴더에 저장할 수 없습니다." UserInfo = {NSFilePath = / private / var / mobile / Containers / Shared / AppGroup / 1FAA9B86-E775-4A2D-A2D6-A442C8A9A8FA, NSUnderlyingError = 0x282202250 {Error Domain = NSPOSIXErrorDomain Code = 21 "Is a directory"}}
Anand Prakash


18

iOS 8부터는 공통 앱 그룹에 속한 앱간에 데이터를 쉽게 공유 할 수 있습니다.

Apple 문서는 확장 컨텍스트에서이를 가장 잘 설명합니다 : https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

기본적으로 다음을 수행해야합니다.

  1. 앱 그룹 ID를 정의 합니다 (Apple 개발자 프로그램에 대한 Member Center인증서, 식별자 및 프로필 섹션에서) .
  2. 통신해야하는 각 앱에 대해 위의 앱 그룹 ID를 지정하는 앱 그룹 기능을 활성화합니다 (cen은 Xcode : Target- > Capabilities 또는 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모든 앱에서 표시되고 액세스 할 수 있습니다.

폴더의 경우 교착 상태가 발생하지 않도록 원자 단위로 쓰고 읽으십시오.


나는 당신의 단계를 거쳐 공유 URL을 얻습니다. 그러나 그 경로에 이미지를 넣는 방법. 내 이미지 이름을 추가하고 데이터를 씁니다. 그런 다음 검색을 시도했지만 이미지를 다시 가져올 수 없습니다.
ChintaN -Maddy- Ramani

나는 성공적으로 app1의 모든 이미지를 작성하고 앱 그룹을 사용하여 app2에서 모든 이미지를 검색했습니다. 감사 . +1 :).
ChintaN -Maddy- Ramani

선택에 따라 타사 앱을 내 그룹에 가입시킬 수 있습니까? 아니면 모든 앱이 동일한 개발자 계정에 있어야합니까?
DwarDoh

@DwarDoh 같은 개발자 계정이어야합니다.
ChintaN -Maddy- Ramani

14

앱간에 데이터를 공유 할 수 있습니까? 네, 그렇습니다!

iOS 3.0에서 제공되는 UIPasteBoard를 사용 하십시오 . 문서는 여기에서 볼 수 있습니다 . Apple 문서는 다음과 같이 말합니다.

UIPasteboard 클래스를 사용하면 애플리케이션이 애플리케이션 내에서 또는 시스템 전체 또는 애플리케이션 별 페이스트 보드를 사용하여 다른 애플리케이션과 데이터를 공유 할 수 있습니다.

키 체인에있는 앱간에 데이터를 공유하는 것도 가능하지만, 데이터는 기본적으로 암호이므로 직렬화 가능한 모든 것을 저장할 수 있습니다. 여기 에 대한 스택 오버플로 질문이 있습니다.


큰! 이는 앱간에 데이터를 공유하는 실행 가능한 방법처럼 보입니다.
trusktr 2013 년

1
UIPasteboard는 문자열 복사와 같은 작은 데이터를 공유하기위한 좋은 솔루션처럼 들립니다. 앱간에 파일을 공유하는 옵션이 있습니까?
AlikElzin-kilaka

1
@ AlikElzin-kilaka 예, 지원 NSData합니다.
Evgeny Karkan


3

UIPasteBoard를 통해 앱간에 데이터를 공유하는 것은 iOS7의 동일한 애플리케이션 그룹에있는 앱에서만 작동한다고 언급합니다. 사과가 말했듯이 :

+ [UIPasteboard pasteboardWithName : create :] 및 + [UIPasteboard pasteboardWithUniqueName]은 이제 동일한 애플리케이션 그룹에있는 앱만 대지에 액세스 할 수 있도록 주어진 이름을 고유하게합니다. 개발자가 이미 존재하고 동일한 앱 스위트의 일부가 아닌 이름으로 대지를 만들려고하면 고유 한 개인 대지를 갖게됩니다. 이것은 시스템에서 제공하는 대지, 일반 및 찾기에 영향을주지 않습니다.


"동일한 애플리케이션 그룹"이란 Apple이 무엇을 의미합니까?
마법의 총알 데이브

2
Bundle Seed ID가 동일한 @MagicBulletDave 앱.
MasterBeta 2013 년

UIPasteboard의 클래스는 응용 프로그램 내에서 다른 응용 프로그램과 데이터를 공유하는 응용 프로그램을 할 수 있습니다. 다른 앱과 데이터를 공유하려면 시스템 전체의 대지를 사용할 수 있습니다. 앱과 동일한 팀 ID를 가진 다른 앱과 데이터를 공유하려면 앱별 페이스트 보드를 사용할 수 있습니다.
테스트

2

네트워크에 접속해도 괜찮다면 맞춤형 웹 서비스를 구현하거나 일부 클라우드 서비스를 사용할 수 있습니다. iCloud 자체는 여기서 많이 사용되지 않습니다. 다른 장치의 동일한 앱간에 데이터를 공유 할 수만 있습니다. 여기에서 iCloud에 대해 읽을 수 있습니다 .

네트워크를 사용하지 않고 " 빠른 앱 전환을 이용할 수 있습니다. "을 이용하여 URL 인코딩을 통해 앱간에 제한된 양의 데이터를 전송할 . 전송 가능한 실제 데이터 양은 모르겠지만 매우 제한적일 것입니다.

이 경우 JugsteR 및 baudot의 답변이 가장 좋습니다.


안녕하세요 psoft에서 두 줄로 설명한 iCloud 공유에 대해 자세히 설명해 주
시겠습니까

iCloud ID가 앱의 번들 ID와 일치하지 않아도되므로 iCloud 공유가 옵션이 될 것이라고 읽었습니다.
테스트

표준 URL 내에서 64kB의 데이터를 전송할 수 있습니다. 실제로 잘 작동합니다. 데이터가 너무 많지 않은 경우 더 나은 보안을 위해 암호화 / base64 할 수 있습니다.
igraczech


-4

아니요. 클라우드 솔루션을 사용해야합니다.


내가 아는 한 iCloud는 한 기기의 데이터를 다른 기기와 동기화하기위한 것이므로 기기의 앱간에 데이터를 공유하는 방법을 알고 있다면 친절하게 공유하세요.
Durai Amuthan.H

2
iCloud에 사용되는 식별자가 번들 식별자와 다르며 완전히 가능하기 때문에 클라우드 솔루션을 사용하여 앱간에 데이터를 동기화 할 수 있습니다. 다음은 stackoverflow.com/a/8882763/730807 을 확인하는 링크 입니다. 귀하의 답변에 찬성 투표하십시오.
Durai Amuthan.H

이 답변이 반대 투표 된 이유는 무엇입니까? 이것은 정답이지만 문서에서 더 자세한 정보를 제공하고 몇 가지 예를 제공해야합니다
Basheer_CAD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.