IT TIP

iOS 8 공유 확장 프로그램과 기본 앱간에 데이터 공유

itqueen 2020. 12. 1. 20:23
반응형

iOS 8 공유 확장 프로그램과 기본 앱간에 데이터 공유


최근에 시스템 작동 방식을 이해하기 위해 간단한 iOS 8 공유 확장을 만들고 있습니다. Apple은 앱 확장 프로그래밍 가이드 에서 다음과 같이 말합니다 .

기본적으로 포함하는 앱과 확장 프로그램은 서로의 컨테이너에 직접 액세스 할 수 없습니다.

이는 확장 프로그램과 포함하는 앱이 데이터를 공유하지 않음을 의미합니다. 그러나 같은 페이지에서 Apple은 솔루션을 제공합니다.

포함하는 앱과 확장이 데이터를 공유 할 수 있도록하려면 Xcode 또는 개발자 포털을 사용하여 앱 및 확장에 대한 앱 그룹을 활성화합니다. 다음으로 포털에 앱 그룹을 등록하고 포함 된 앱에서 사용할 앱 그룹을 지정합니다.

그런 다음 NSUserDefaults를 사용하여 포함하는 앱과 확장간에 데이터를 공유 할 수 있습니다. 이것이 바로 제가하고 싶은 일입니다. 그러나 어떤 이유로 작동하지 않습니다.

같은 페이지에서 Apple은 표준 기본값을 제안합니다.

var defaults = NSUserDefaults.standardUserDefaults()

WWDC 프레젠테이션 (217)에서 그들은 공통 패키지를 제안합니다.

var defaults = NSUserDefaults(suiteName: kDefaultsPackage)

또한 동일한 앱 그룹 이름을 사용하여 포함하는 앱 대상과 확장 대상 모두에 대해 앱 그룹을 활성화했습니다. XCode Target 기능, 앱 그룹

그러나이 모든 설정은 아무것도 아닙니다. 확장 프로그램에서 포함 된 앱에 저장 한 데이터를 검색 할 수 없습니다. 두 대상이 완전히 다른 NSUserDefaults 저장소를 사용하는 것과 같습니다.

그래서,

  1. 이 방법에 대한 해결책이 있습니까?
  2. 포함 된 앱과 공유 확장간에 간단한 데이터를 공유하려면 어떻게해야합니까? 데이터는 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)

이것은 잘 작동합니다!


내가 한 방법은 다음과 같습니다.

  1. 기본 앱 대상> 기능> on으로 설정된 앱 그룹을 엽니 다.
  2. 새 앱 그룹을 추가하고 선택되어 있는지 확인합니다 (예 : group.com.seligmanventures.LightAlarmFree).
  3. 감시 대상 (기능 탭이있는 대상)> 앱 그룹을 켜기로 설정합니다.
  4. 새 앱 그룹을 추가하고 선택되어 있는지 확인합니다 (예 : group.com.seligmanventures.LightAlarmFree-위 그룹과 동일한 이름이어야 함).
  5. 다음과 같이 그룹에 데이터를 저장합니다.

    var defaults = NSUserDefaults(suiteName: "group.com.seligmanventures.LightAlarmFree")
    defaults?.setObject("It worked!", forKey: "alarmTime")
    defaults?.synchronize()
    
  6. 다음과 같이 그룹에서 데이터를 검색합니다.

    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를 붙여 넣습니다.

프로젝트 기능 탭에서 AppGroups 활성화

2) 확장 프로그램 선택-> 기능 탭 선택-> 앱 그룹 활성화-> '+'클릭-> '그룹'뒤에 번들 ID를 붙여 넣습니다.

확장 기능 탭에서 AppGroups 활성화

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"];

참고 URL : https://stackoverflow.com/questions/24118918/sharing-data-between-an-ios-8-share-extension-and-main-app

반응형