iOS 8 공유 확장 프로그램과 기본 앱간에 데이터 공유
최근에 시스템 작동 방식을 이해하기 위해 간단한 iOS 8 공유 확장을 만들고 있습니다. Apple은 앱 확장 프로그래밍 가이드 에서 다음과 같이 말합니다 .
기본적으로 포함하는 앱과 확장 프로그램은 서로의 컨테이너에 직접 액세스 할 수 없습니다.
이는 확장 프로그램과 포함하는 앱이 데이터를 공유하지 않음을 의미합니다. 그러나 같은 페이지에서 Apple은 솔루션을 제공합니다.
포함하는 앱과 확장이 데이터를 공유 할 수 있도록하려면 Xcode 또는 개발자 포털을 사용하여 앱 및 확장에 대한 앱 그룹을 활성화합니다. 다음으로 포털에 앱 그룹을 등록하고 포함 된 앱에서 사용할 앱 그룹을 지정합니다.
그런 다음 NSUserDefaults를 사용하여 포함하는 앱과 확장간에 데이터를 공유 할 수 있습니다. 이것이 바로 제가하고 싶은 일입니다. 그러나 어떤 이유로 작동하지 않습니다.
같은 페이지에서 Apple은 표준 기본값을 제안합니다.
var defaults = NSUserDefaults.standardUserDefaults()
WWDC 프레젠테이션 (217)에서 그들은 공통 패키지를 제안합니다.
var defaults = NSUserDefaults(suiteName: kDefaultsPackage)
또한 동일한 앱 그룹 이름을 사용하여 포함하는 앱 대상과 확장 대상 모두에 대해 앱 그룹을 활성화했습니다.
그러나이 모든 설정은 아무것도 아닙니다. 확장 프로그램에서 포함 된 앱에 저장 한 데이터를 검색 할 수 없습니다. 두 대상이 완전히 다른 NSUserDefaults 저장소를 사용하는 것과 같습니다.
그래서,
- 이 방법에 대한 해결책이 있습니까?
- 포함 된 앱과 공유 확장간에 간단한 데이터를 공유하려면 어떻게해야합니까? 데이터는 API에 대한 사용자 자격 증명 일뿐입니다.
다음과 같이 NSUserDefaults를 사용해야합니다.
데이터를 저장:
objc
NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.yougroup"];
[shared setObject:object forKey:@"yourkey"];
[shared synchronize];
빠른
let defaults = UserDefaults(suiteName: "group.yourgroup")
defaults?.set(5.9, forKey: "yourKey")
데이터 읽기 :
objc
NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.yougroup"];
id value = [shared valueForKey:@"yourkey"];
NSLog(@"%@",value);
빠른
let defaults = UserDefaults(suiteName: "group.yourgroup")
let x = defaults?.double(forKey: "yourKey")
print(x)
이것은 잘 작동합니다!
내가 한 방법은 다음과 같습니다.
- 기본 앱 대상> 기능> on으로 설정된 앱 그룹을 엽니 다.
- 새 앱 그룹을 추가하고 선택되어 있는지 확인합니다 (예 : group.com.seligmanventures.LightAlarmFree).
- 감시 대상 (기능 탭이있는 대상)> 앱 그룹을 켜기로 설정합니다.
- 새 앱 그룹을 추가하고 선택되어 있는지 확인합니다 (예 : group.com.seligmanventures.LightAlarmFree-위 그룹과 동일한 이름이어야 함).
다음과 같이 그룹에 데이터를 저장합니다.
var defaults = NSUserDefaults(suiteName: "group.com.seligmanventures.LightAlarmFree") defaults?.setObject("It worked!", forKey: "alarmTime") defaults?.synchronize()
다음과 같이 그룹에서 데이터를 검색합니다.
var defaults = NSUserDefaults(suiteName: "group.com.seligmanventures.LightAlarmFree") defaults?.synchronize() // Check for null value before setting if let restoredValue = defaults!.stringForKey("alarmTime") { myLabel.setText(restoredValue) } else { myLabel.setText("Cannot find value") }
따라서 NSUserDefaults 의 제품군 이름 으로 그룹 이름 이 사용되는 경우에만 작동합니다 .
문서에는 NSUserDefaults.standartUserDefaults ()도 작동해야한다고 나와 있지만 작동하지 않으며 이는 아마도 버그 일 것입니다.
당신이 가지고 있다면
group.yourappgroup
사용하다
var defaults = NSUserDefaults(suiteName: "yourappgroup")
이것은 나를 위해 작동합니다
내 시나리오에서는 상위 iOS 앱과 WatchKit간에 데이터를 공유하고 있습니다. Xcode 6.3.1, iOS 배포 대상 8.3을 사용하고 있습니다.
var defaults = NSUserDefaults(suiteName: "group.yourappgroup.example")
viewDidLoad에서 동기화했는지 확인하십시오.
override func viewDidLoad() {
super.viewDidLoad()
defaults?.synchronize()
}
텍스트를 보내는 버튼의 예이지만 물론 무엇이든 전달할 수 있습니다.
@IBAction func btnSend(sender: UIButton) {
var aNumber : Int = 0;
aNumber = aNumber + 1
//Pass anything with this line
defaults?.setObject("\(aNumber)", forKey: "userKey")
defaults?.synchronize()
}
그런 다음 다른 쪽에서 앱 그룹이 일치하는지 확인하십시오.
var defaults = NSUserDefaults(suiteName: "group.yourappgroup.example")
그런 다음 동기화 및 cal :(이 경우 "lblNumber"는 IBOutlet 레이블 임)
defaults?.synchronize()
var tempVar = defaults!.stringForKey("userKey")!;
lblNumber.setText(tempVar);
그런 다음 이쪽에 무언가를 설정하고 다시 동기화하려면 동일한 작업을 수행하고 동기화하고 다른 쪽에서 호출하는 stringForKey가 동일한 지 확인하십시오.
defaults?.setObject("sending sample text", forKey: "sampleKey")
defaults?.synchronize()
이것이 이해되기를 바랍니다.
나는 빠른 foogry의 대답으로 번역했고 작동합니다!
데이터를 저장:
let shared = NSUserDefaults(suiteName: "nameOfCreatedGroup")
shared("Saved String 1", forKey: "Key1")
shared("Saved String 2", forKey: "Key2")
데이터 읽기 :
let shared = NSUserDefaults(suiteName: "nameOfCreatedGroup")!
valueToRead1 = shared("Key1") as? String
valueToRead2 = shared("Key2") as? String
println(valueToRead1) // Saved String 1
println(valueToRead2) // Saved String 2
아래 단계에 따라 데이터를 공유 할 수 있습니다.
1) 프로젝트 선택-> 기능 탭 선택-> 앱 그룹 활성화-> '+'클릭-> '그룹'뒤에 번들 ID를 붙여 넣습니다.
2) 확장 프로그램 선택-> 기능 탭 선택-> 앱 그룹 활성화-> '+'클릭-> '그룹'뒤에 번들 ID를 붙여 넣습니다.
3) 공유하려는 데이터가있는 기본 앱의 코드 아래에 배치하십시오.
NSUserDefaults * appGroupData = [[NSUserDefaults alloc]initWithSuiteName:@"group.com.appname"];
NSData * data = [NSKeyedArchiver archivedDataWithRootObject:[self allData]]; // Get my array which I need to share
[appGroupData setObject:data forKey:@"Data"];
[appGroupData synchronize];
4) 확장에서 객체를 얻을 수 있습니다.
NSUserDefaults * appGroupData = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.appname"];
NSData * data = [appGroupData dataForKey:@"Data"];
NSArray * arrReceivedData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
다음과 같이 NSUserDefaults를 사용해야하며 임시 프로필에서 앱 그룹을 활성화해야하며 앱 그룹은 녹색 기호로 구성해야하며 임시 프로필 및 BundleID에 추가해야합니다.
NSUserDefaults *sharedUserDefault = [[NSUserDefaults alloc] initWithSuiteName:@"group.yougroup"];
[sharedUserDefault setObject:object forKey:@"yourkey"];
[sharedUserDefault synchronize];
NSUserDefaults *sharedUserDefault = [[NSUserDefaults alloc] initWithSuiteName:@"group.yougroup"];
sharedUserDefault value = [sharedUserDefault valueForKey:@"yourkey"];
'IT TIP' 카테고리의 다른 글
Java 다중 인수 점 표기법-Varargs (0) | 2020.12.01 |
---|---|
"패키지를로드 할 수 없음 : my_prog 패키지 : my_prog 및 main 패키지를 찾았습니다."오류 (0) | 2020.12.01 |
자식 여백은 부모 키에 영향을주지 않습니다. (0) | 2020.12.01 |
EF 마이그레이션으로 프로덕션 데이터베이스를 업데이트해도됩니까? (0) | 2020.12.01 |
Angular $ http가 PUT / POST 대신 OPTIONS를 보냅니다. (0) | 2020.12.01 |