앱 그룹을 사용하여 앱간에 데이터 통신 및 유지


85

iOS 8은 어제 앱 그룹과 관련된 새로운 API를 공개했습니다. 이전에는 데이터를 공유하고 앱간에 통신하는 것이 다소 지저분했으며 이것이 바로 앱 그룹이 수정하려는 의도라고 생각합니다.

내 앱에서 앱 그룹을 활성화하고 새 그룹을 추가했지만 사용 방법에 대한 문서를 찾을 수 없습니다. 문서 및 API 참조에는 그룹을 추가하는 방법 만 나와 있습니다.

그렇다면 앱 그룹은 실제로 무엇을하려는 것일까 요? 그것을 사용하는 방법에 대한 문서가 어딘가에 있습니까?

답변:


81

앱 그룹의 또 다른 이점은 NSUserDefaults데이터베이스 를 공유 할 수 있다는 것 입니다. 이는 앱 확장 (알림 센터 위젯, 사용자 정의 키보드 등)에서도 작동합니다.

NSUserDefaults앱 그룹의 모든 애플리케이션에서 다음과 같이 개체를 초기화 하면 데이터베이스를 공유합니다.

목표 -C :

[[NSUserDefaults alloc] initWithSuiteName:@"<group identifier>"];

빠른:

NSUserDefaults(suiteName: "<group identifier>")

[NSUserDefaults standardUserDefaults]각 응용 프로그램에 대한 데이터베이스의 모든 내용 이이 데이터베이스로 전달되지는 않습니다.

설명서 (베타 3으로)뿐만 아니라 올바른 예를 제공합니다.

그리고 데이터베이스를 동기화하는 것을 잊지 마십시오.

[yourDefaults synchronize];

2
시뮬레이터에서만 작동 (XCode 6 베타 5, iOS 8 베타 5)
iOS Dev

8
참고 : iOS 8 확장 (예 : 키보드)과 함께 사용하는 경우 확장 프로그램의 Info.plist 파일에 RequestsOpenAccess = YES가 있는지 확인해야합니다.
Kiran Panesar

1
RequestsOpenAccess = YES를했고 여전히 장치에서 작동하지 않고 에뮬레이터에서 잘 작동하는 지침을 따르십시오.
MAC

나와 같은 문제, 내 앱에 공유 확장 기능을 통합했습니다. 시뮬레이터에서는 작동하지만 실제 장치에서는 작동하지 않습니다. RequestOpenAccess = YES를 추가했지만 작동하지 않습니다. 내 질문은 stackoverflow.com/questions/30489894/입니다. …
Ravi Ojha

3
@MikeRichards는 확실하지 않지만 올바르게 기억하면 앱 그룹에 팀 ID가 접두사로 붙습니다
Santa Claus

74

여러 앱간에 NSUserDefaults 데이터 공유

앱과 확장 또는 두 앱간에 기본값을 공유하려면 다음 단계를 사용하여 설정에서 앱 그룹을 추가해야합니다.

  1. Project Navigator에서 * .xcodeproj 파일 (맨 위에 있어야 함)을 클릭합니다.
  2. 프로젝트 네비게이터 오른쪽에서 프로젝트 및 대상을 찾습니다. 대상 아래에서 기본 대상을 클릭합니다 (대상 아래에서 가장 먼저 표시되어야 함).
  3. 상단의 기능 탭을 클릭합니다.
  4. 앱 그룹 섹션에서 오른쪽에있는 스위치를 클릭하여 앱 그룹을 켭니다.
  5. + 버튼을 클릭하고 group.com.company.myApp 이라는 앱 그룹을 추가합니다 .
  6. 다른 앱의 동일한 위치로 이동하면 이제이 그룹을 선택할 수 있습니다. 이 공유 데이터를 사용할 각 앱에 대해이 그룹을 사용 설정합니다.

참고 : Apple 개발자 포털 (모든 인증서, 식별자, 장치 및 프로비저닝 프로파일을 표시하는 Apple 웹 사이트)로 이동하고 식별자> 앱 그룹으로 이동하면이 새로운 앱 그룹이 표시됩니다.

데이터를 저장하려면 :

var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")!
userDefaults.setObject("user12345", forKey: "userId")
userDefaults.synchronize()

데이터를 검색하려면 :

var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
if let testUserId = userDefaults?.objectForKey("userId") as? String {
  print("User Id: \(testUserId)")
}

2
감사! 이 작업을 수행하는 방법을 알아 내기 위해 문서를 검색하는 데 약간의 시간이 걸렸으며 다른 사람들이 내가 취한 조치를 고맙게 생각할 것이라고 생각했습니다.
TenaciousJay

자세한 설명 감사합니다 ...! 이 그룹을 활성화하려면 Apple 개발자 포털 (모든 인증서, 식별자, 장치 및 프로비저닝 프로필을 표시하는 Apple 웹 사이트)에서 인증서를 만들어야합니까? 푸시 알림과 동일합니다.?
Arbaz Shaikh

5 단계를 수행 할 때 앱 그룹을 Apple 개발자 포털에 추가해야하며 추가하기 위해 개발자 포털로 직접 이동할 필요가 없습니다. 5 단계를 수행 한 후 포털로 이동하여 포털이 생성되었는지 확인할 수 있습니다.
TenaciousJay

@TenaciousJay 훌륭한 대답입니다. 추가하고 싶은 경우 func 애플리케이션에서 앱을 실행하려면 (app : UIApplication, openURL url : NSURL, options : [String : AnyObject])-> Bool
Taimur Ajmal

좋은 대답입니다. 감사합니다 @TenaciousJay. AppB에서 AppA로 변수와 그 값을 검색하려고합니다. 어떻게해야합니까? 예를 들어 AppB에서 "riderCancelledRequest = true"이면 AppA에서 어떻게 검색합니까?
LizG

37

기존 문서에 대한 내 해석에 따르면 애플리케이션 그룹은 주로 확장, 특히 위젯을 대상으로합니다. 위젯은 앱과 공존하는 자체 애플리케이션 번들입니다. 별도의 응용 프로그램이므로 자체 샌드 박스가 있으므로 앱 그룹을 사용하여 파일을 공유해야합니다.

헤더 grep'ing 후 API가 필요하다고 생각했지만 실제로 iOS 7의 일부로 포함되었습니다.

NSFileManagercontainerURLForSecurityApplicationGroupIdentifier:앱에 대해 앱 그룹을 켤 때 생성 한 식별자를 전달할 수 있는 메서드가 있습니다.

NSURL *containerURL = [[NSFileManager defaultManager] 
           containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];

감사합니다. 확장성에 대한 귀하의 말이 맞다고 생각합니다. 나는이 iOS 7 방법에 대해 조금 더 모호하다. 그것은 나에게 꽤 정적 인 것처럼 보였고, iOS 8은 앱 간의 실제 상호 작용과 통신을 도입했다.
streem 2014-06-04

@Justafinger이 iOS 7 방법은 공유 응용 프로그램간에 데이터를 쓰고 읽을 URL을 만드는 데만 사용됩니다. 이 특정 방법은 위젯에만 유용하지만 다른 확장 기능에는 유용하지 않습니다.
Wayne Hartman

글쎄요, 저는 Apple이 프로그래밍 방식으로 컨테이너를 만들고 사용자 지정 파일을 공유 할 필요없이 iOS 8에서 이것을 더 쉽게 만들고 싶었다고 생각합니다. 문서에 NSUserDefault를 사용하여 데이터를 공유 할 수 있어야한다고 나와 있습니다. 내가 뭔가를 놓치고 있다고 생각합니다. 왜냐하면 그것은 나를 위해 작동하지 않기 때문입니다.
streem

@Justafinger 나도 NSUserDefaults일할 수 없었습니다 . 나는 베타 1 버그까지 초크한다.
Wayne Hartman

@WayneHartman NSUserDefaults데이터베이스에 대한 해결 방법이 있습니다. 내 대답을 참조하십시오.
산타 클로스

6

오늘 제가 활용 한 한 가지 중요한 함정은 다음과 같습니다.

많은 프로젝트에서 단일 앱 대상과 해당 대상의 각 구성에 대해 다른 번들 식별자가 설정된 것을 보았습니다. 여기 일이 더러워집니다. 개발자가 의도 한 것은 디버그 구성 용 디버그 앱과 릴리스 대상 용 프로덕션 앱을 만드는 것이 었습니다.

그렇게하면 두 앱이 이렇게 설정 될 때 동일한 NSUserDefaults를 공유합니다.

var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()

이로 인해 여러 곳에서 문제가 발생합니다.

  1. 사용자에게 특별한 앱 소개 화면이 표시 될 때 키에 대해 YES를 설정했다고 가정 해보십시오. 이제 다른 앱도 YES를 읽고 인트로를 표시하지 않습니다.
  2. 예 일부 앱은 사용자 기본값에 oAuth 토큰도 저장합니다. 어쨌든 ... 구현에 따라 앱은 토큰이 있음을 인식하고 잘못된 토큰을 사용하여 데이터 검색을 시작합니다. 이상한 오류로 인해 실패 할 가능성이 높습니다.

일반적으로이 문제에 대한 해결책은 기본 키에 현재 빌드 된 구성을 접두사로 붙이는 것입니다. 구성에 대해 다른 번들 식별자를 설정하여 런타임에 구성을 쉽게 감지 할 수 있습니다. 그런 다음에서 번들 식별자를 읽습니다 NSBundle.mainBundle(). 동일한 번들 식별자가있는 경우 다음과 같은 다른 전 처리기 매크로를 설정해야합니다.

#ifdef DEBUG
  NSString* configuration = @"debug";
#elif RELEASE
  NSString* configuration = @"release";
#endif

Swift에서는 거의 동일하게 보입니다.

#if DEBUG
  let configuration = "debug"
#elseif RELEASE
  let configuration = "release"
#endif

8
공유 UserDefaults에서 모든 데이터를 혼합하기 때문에 문제가 존재합니다. 당신은 사용해야 NSUserDefaults.standardUserDefaults()공유하지 않아야 데이터.
Daniel

2

저장하려면

let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")!
shared.setObject("abc.png", forKey: "favEmoji")
shared.synchronize()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.