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

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

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

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



답변

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

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

목표 -C :

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

빠른:

NSUserDefaults(suiteName: "<group identifier>")

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

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

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

[yourDefaults synchronize];


답변

여러 앱간에 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)")
}


답변

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

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

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

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


답변

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

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

그렇게하면 두 앱이 이렇게 설정 될 때 동일한 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


답변

저장하려면

let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")!
shared.setObject("abc.png", forKey: "favEmoji")
shared.synchronize()


답변