webentwicklung-frage-antwort-db.com.de

Freigeben von Daten zwischen einer iOS 8-Freigabeerweiterung und der Hauptanwendung

Vor kurzem habe ich eine einfache iOS 8-Dateierweiterung erstellt, um zu verstehen, wie das System funktioniert. Wie Apple in seinem App Extension Programmierhandbuch feststellt

Standardmäßig haben Ihre umfassende App und ihre Erweiterungen keinen direkten Zugriff auf die Container der jeweils anderen.

Was bedeutet, dass die Erweiterung und die enthaltene App keine Daten gemeinsam nutzen. Aber auf derselben Seite bringt Apple eine Lösung:

Wenn Sie möchten, dass Ihre umfassende App und ihre Erweiterungen Daten gemeinsam nutzen können, verwenden Sie Xcode oder das Developer Portal, um App-Gruppen für die App und ihre Erweiterungen zu aktivieren. Registrieren Sie anschließend die App-Gruppe im Portal und geben Sie die App-Gruppe an, die in der enthaltenen App verwendet werden soll.

Dann wird es möglich, NSUserDefaults zu verwenden, um Daten zwischen der enthaltenden App und der Erweiterung auszutauschen. Genau das möchte ich tun. Aber aus irgendeinem Grund funktioniert es nicht.

Auf derselben Seite schlägt Apple die Standardeinstellungen vor:

var defaults = NSUserDefaults.standardUserDefaults()

In einer WWDC-Präsentation (217) schlagen sie ein allgemeines Paket vor:

var defaults = NSUserDefaults(suiteName: kDefaultsPackage)

Außerdem habe ich App Groups für das enthaltende App-Ziel und das Erweiterungsziel mit demselben App-Gruppennamen aktiviert: XCode Target capabilities, App Groups

Aber das ganze Setup ist umsonst. Ich kann die in der enthaltenen App gespeicherten Daten nicht von der Erweiterung abrufen. Es ist, als würden zwei Ziele völlig unterschiedliche NSUserDefaults-Speicher verwenden.

So, 

  1. Gibt es eine Lösung für diese Methode?
  2. Wie kann ich einfache Daten zwischen der enthaltenen App und der Dateierweiterung freigeben? Bei den Daten handelt es sich lediglich um Benutzeranmeldeinformationen für eine API.
58
Oguz Bilgener

Sie sollten NSUserDefaults folgendermaßen verwenden:

Daten speichern:

objc

NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.yougroup"];
[shared setObject:object forKey:@"yourkey"];
[shared synchronize];

Schnell

let defaults = UserDefaults(suiteName: "group.yourgroup")
defaults?.set(5.9, forKey: "yourKey")

Daten lesen:

objc

NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.yougroup"];
id value = [shared valueForKey:@"yourkey"];
NSLog(@"%@",value);

Schnell

let defaults = UserDefaults(suiteName: "group.yourgroup")
let x = defaults?.double(forKey: "yourKey")
print(x)

Das wird gut funktionieren!

41
foogry

So habe ich es gemacht:

  1. Öffnen Sie Ihr Hauptanwendungsziel> Funktionen> Anwendungsgruppen, die aktiviert sind
  2. Fügen Sie eine neue App-Gruppe hinzu und vergewissern Sie sich, dass sie angekreuzt ist (z. B. group.com.seligmanventures.LightAlarmFree).
  3. Öffnen Sie Ihr Überwachungsziel (das mit der Registerkarte "Funktionen")> Anwendungsgruppen auf "Ein" gesetzt
  4. Fügen Sie eine neue App-Gruppe hinzu und vergewissern Sie sich, dass sie angekreuzt ist (z. B. group.com.seligmanventures.LightAlarmFree - der Name muss jedoch der Gruppe oben entsprechen)
  5. Speichern Sie die Daten wie folgt in der Gruppe:

    var defaults = NSUserDefaults(suiteName: "group.com.seligmanventures.LightAlarmFree")
    defaults?.setObject("It worked!", forKey: "alarmTime")
    defaults?.synchronize()
    
  6. Rufen Sie Daten aus der Gruppe wie folgt ab:

    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")
    }
    
13

Wenn Sie haben 

group.yourappgroup

benutzen 

var defaults = NSUserDefaults(suiteName: "yourappgroup")

Das funktioniert für mich

5
Berni

Anscheinend funktioniert es also nur, wenn der Gruppenname als Suite-Name für NSUserDefaults verwendet wird.

Die Dokumentation besagt, dass NSUserDefaults.standartUserDefaults () ebenfalls funktionieren sollte, dies jedoch nicht, und dies ist wahrscheinlich ein Fehler.

4
Oguz Bilgener

In meinem Szenario teile ich Daten zwischen der übergeordneten iOS-App und WatchKit. Ich verwende Xcode 6.3.1, iOS Deployment Target 8.3

var defaults = NSUserDefaults(suiteName: "group.yourappgroup.example")

Vergewissern Sie sich in Ihrem viewDidLoad, dass Sie synchronisieren:

    override func viewDidLoad() {
    super.viewDidLoad()

    defaults?.synchronize()

}

Beispiel für eine Schaltfläche, die Text sendet, aber Sie können natürlich auch Folgendes übergeben:

 @IBAction func btnSend(sender: UIButton) {
    var aNumber : Int = 0;
    aNumber = aNumber + 1

    //Pass anything with this line
    defaults?.setObject("\(aNumber)", forKey: "userKey")
    defaults?.synchronize()

}

Dann auf der anderen Seite sicherstellen, dass die App-Gruppe übereinstimmt:

 var defaults = NSUserDefaults(suiteName: "group.yourappgroup.example")

Dann synchronisieren und cal: (In diesem Fall ist "lblNumber" ein IBOutlet-Label.)

defaults?.synchronize()
var tempVar = defaults!.stringForKey("userKey")!;
lblNumber.setText(tempVar);

Wenn Sie etwas auf dieser Seite festlegen und zurück synchronisieren möchten, tun Sie dasselbe und synchronisieren Sie und stellen Sie sicher, dass der StringForKey, den Sie auf der anderen Seite aufrufen, derselbe ist:

defaults?.setObject("sending sample text", forKey: "sampleKey")
defaults?.synchronize()

Hoffe das macht Sinn

3
Richmond

Ich habe die Antwort von Swift foogry übersetzt und es funktioniert !!

Daten speichern:

let shared = NSUserDefaults(suiteName: "nameOfCreatedGroup")
shared("Saved String 1", forKey: "Key1")
shared("Saved String 2", forKey: "Key2")

Daten lesen:

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
2
Matte.Car

Sie können Daten freigeben, indem Sie die folgenden Schritte ausführen:

1) Wählen Sie Ihr Projekt aus -> Registerkarte "Funktionen" auswählen -> App-Gruppen aktivieren -> Klicken Sie auf "+" -> Fügen Sie Ihre Bundle-ID nach "Gruppe" ein.

Enable AppGroups in project capabilities tab

2) Wählen Sie Ihre Erweiterung -> Registerkarte "Funktionen" -> App-Gruppen aktivieren -> Klicken Sie auf "+" -> fügen Sie Ihre Bundle-ID nach "Gruppe" ein.

Enable AppGroups in Extension capabilities tab

3) Platzieren Sie den folgenden Code in Ihrer Haupt-App, für die Sie Daten freigeben möchten:

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) Sie können Objekt in Erweiterung bekommen:

NSUserDefaults * appGroupData = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.appname"];
NSData * data = [appGroupData dataForKey:@"Data"];
NSArray * arrReceivedData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
1
Anjali jariwala

Sie sollten NSUserDefaults wie folgt verwenden und sicherstellen, dass Sie müssen die App-Gruppe in Ihrem vorläufigen Profil aktiviert haben. Die App-Gruppe muss als grünes Symbol konfiguriert werden, und es sollte zu Ihrem vorläufigen Profil und Ihrer BundleID hinzugefügt werden.

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"];
0
Hitesh Vaghela