앱 그룹을 사용하여 앱간에 데이터 통신 및 유지
iOS 8은 어제 앱 그룹과 관련된 새로운 API를 공개했습니다. 이전에는 데이터를 공유하고 앱간에 통신하는 것이 다소 지저분했고 이것이 바로 앱 그룹이 수정하려는 의도라고 생각합니다.
내 앱에서 앱 그룹을 활성화하고 새 그룹을 추가했지만 사용 방법에 대한 문서를 찾을 수 없습니다. 문서 및 API 참조에는 그룹을 추가하는 방법 만 나와 있습니다.
그렇다면 앱 그룹은 실제로 무엇을하려는 것일까 요? 그것을 사용하는 방법에 대한 문서가 어딘가에 있습니까?
앱 그룹의 또 다른 이점은 NSUserDefaults데이터베이스 를 공유 할 수 있다는 것 입니다. 이는 앱 확장 (알림 센터 위젯, 사용자 정의 키보드 등)에서도 작동합니다.
NSUserDefaults앱 그룹의 모든 애플리케이션에서 다음과 같이 개체를 초기화 하면 데이터베이스를 공유합니다.
목표 -C :
[[NSUserDefaults alloc] initWithSuiteName:@"<group identifier>"];
빠른:
NSUserDefaults(suiteName: "<group identifier>")
[NSUserDefaults standardUserDefaults]각 응용 프로그램에 대한 데이터베이스의 모든 내용 이이 데이터베이스로 전달되지는 않습니다.
설명서 (베타 3으로)뿐만 아니라 올바른 예를 제공합니다.
그리고 데이터베이스를 동기화하는 것을 잊지 마십시오.
[yourDefaults synchronize];
여러 앱간에 NSUserDefaults 데이터 공유
앱과 확장 또는 두 앱간에 기본값을 공유하려면 다음 단계를 사용하여 설정에서 앱 그룹을 추가해야합니다.
- 프로젝트 네비게이터에서 * .xcodeproj 파일 (맨 위에 있어야 함)을 클릭합니다.
- 프로젝트 네비게이터 오른쪽에서 프로젝트 및 대상을 찾습니다. 대상 아래에서 기본 대상을 클릭합니다 (대상 아래에서 첫 번째 항목이어야 함).
- 상단의 기능 탭을 클릭합니다.
- 앱 그룹 섹션에서 오른쪽에있는 스위치를 클릭하여 앱 그룹을 켭니다.
- + 버튼을 클릭하고 group.com.company.myApp 이라는 앱 그룹을 추가합니다 .
- 다른 앱의 동일한 위치로 이동하면 이제이 그룹을 선택할 수 있습니다. 이 공유 데이터를 사용할 각 앱에 대해이 그룹을 사용 설정합니다.
참고 : 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()
이로 인해 여러 곳에서 문제가 발생합니다.
- 사용자에게 특별한 앱 소개 화면이 표시 될 때 키에 대해 YES를 설정했다고 가정 해보십시오. 이제 다른 앱도 YES를 읽고 인트로를 표시하지 않습니다.
- 예 일부 앱은 사용자 기본값에 oAuth 토큰도 저장합니다. 어쨌든 ... 구현에 따라 앱은 토큰이 있음을 인식하고 잘못된 토큰을 사용하여 데이터 검색을 시작합니다. 이상한 오류로 인해 실패 할 가능성이 높습니다.
The solution to this problem in general is to prefix the defaults keys with the current configuration built. You can detect the configuration easily at runtime by setting different bundle identifiers for your configurations. Then just read the bundle identifier from NSBundle.mainBundle(). If you have the same bundle identifiers you need to set different preprocessor macros like
#ifdef DEBUG
NSString* configuration = @"debug";
#elif RELEASE
NSString* configuration = @"release";
#endif
In Swift it will look almost the same:
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif
To store
let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")!
shared.setObject("abc.png", forKey: "favEmoji")
shared.synchronize()
'Programing' 카테고리의 다른 글
| Vim Surround는 단어 주위에 추가 공간을 삽입합니다. (0) | 2020.10.07 |
|---|---|
| 문자열이 비어 있지 않거나 쉘 스크립트에서 공백이 아닌지 확인하십시오. (0) | 2020.10.07 |
| C ++에서 쉼표 연산자의 다른 동작이 반환됩니까? (0) | 2020.10.07 |
| Google Play 앱 서명을 활성화하는 방법 (0) | 2020.10.07 |
| 드롭 다운의 변경 이벤트 트리거 (0) | 2020.10.07 |