2014-06-09 4 views
52

Kürzlich habe ich eine einfache iOS 8-Freigabeerweiterung erstellt, um zu verstehen, wie das System funktioniert. Wie Apple in seiner App Extension Programming Guide angibt:Freigeben von Daten zwischen einer iOS 8-Freigabeerweiterung und einer Haupt-App

Standardmäßig haben Ihre enthaltende App und seine Erweiterungen keinen direkten Zugriff auf die jeweils anderen Container.

Das bedeutet, dass die Erweiterung und die enthaltende App keine Daten gemeinsam nutzen. Aber auf der gleichen Seite bringt Apple eine Lösung:

Wenn Sie möchten, dass Ihre enthaltende App und ihre Erweiterungen Daten gemeinsam nutzen können, verwenden Sie Xcode oder das Entwicklerportal, um App-Gruppen für die App und ihre Erweiterungen zu aktivieren. Als Nächstes registrieren Sie 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 zu teilen. Genau das möchte ich tun. Aber aus irgendeinem Grund funktioniert es nicht.

In der gleichen Seite, Apple die Standardvorgaben schlägt vor:

var defaults = NSUserDefaults.standardUserDefaults() 

In einer WWDC Präsentation (217), schlagen sie vor, ein gemeinsames Paket:

var defaults = NSUserDefaults(suiteName: kDefaultsPackage) 

Auch aktivierte ich App-Gruppen für Sowohl das Ziel der enthaltenden App als auch das Ziel der Erweiterung mit demselben Namen der App-Gruppe: XCode Target capabilities, App Groups

Aber all diese Einstellungen sind umsonst. Ich kann die Daten, die ich in der enthaltenen App gespeichert habe, nicht von der Erweiterung abrufen. Es ist so, als würden zwei Ziele völlig unterschiedliche NSUserDefaults-Speicher verwenden.

So

  1. Gibt es eine Lösung für dieses Verfahren?
  2. Wie kann ich einfache Daten zwischen der enthaltenden App und der Freigabeerweiterung freigeben? Die Daten sind nur Benutzeranmeldeinformationen für eine API.
+3

möglich Duplikat [Kommunikation zwischen Anwendungen mit App Groups] (http://stackoverflow.com/questions/24015506/communicating-between-apps-with-app-groups) – GuramK

+1

Dies kann Ihnen helfen: http://stackoverflow.com/q/24015506/1586692 Aber ich habe immer noch Probleme wie folgt aus: http://stackoverflow.com/q/24067975/1586692 – heheBear

Antwort

3

offenbar So funktioniert es nur, wenn die Gruppennamen als Name Suite verwendet wird für NSUserDefaults.

Die Dokumentation sagt NSUserDefaults.standartUserDefaults() sollte auch funktionieren, aber es nicht, und dies ist wahrscheinlich ein Fehler.

+0

Sie einige Beispiel-Code für die Einrichtung hinzufügen die 'NSUserDefaults' und die Weitergabe der Daten. Danke –

+0

Müssen Sie die Gruppe zu beiden Zielen hinzufügen? –

31

Sie sollten NSUserDefaults wie folgt verwenden:

Daten speichern:

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

Daten lesen:

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

Das fein arbeiten ist!

+9

swift language wurde gebeten, bitte aktualisieren Sie Ihre Post mit oder zumindest hinzufügen schnelle Sprache – Nicholas

+4

Es ist schön zu sehen, objektive c entlang der Seite schnell. Es hilft, den Unterschied zu verstehen. Angesichts der vielen Codebeispiele von ObjC und nicht vielen von momentan ist es gut zu verstehen, wie man es konvertiert. – Lightbulb1

+0

Eigentlich in Swift die .Synchronize() ist redundant –

4

Wenn Sie

group.yourappgroup 

Verwendung

var defaults = NSUserDefaults(suiteName: "yourappgroup") 

Dies funktioniert haben für mich

+0

Ich bekomme den Fehler Falsche Argument-Label in Aufruf ('SuiteName:', erwartet 'Benutzer:') –

+0

Richtig, weder dies funktioniert für mich. Xcode 6 zeigt die entsprechende Ausnahme an: 'Die Verwendung Ihrer eigenen Paketkennung als NSUserDefaults-Suite-Name ist nicht sinnvoll und funktioniert nicht. Brechen Sie auf _NSUserDefaults_Log_Nonsensical_Suites auf, um das zu finden. Mit dem Präfix "Gruppe", obwohl es funktioniert. – udondan

+0

@naturalc NSUserDefaults (suiteName :) gibt ein optionales NSUserDefaults zurück. Sie sollten die optionale Bindung verwenden, um sicherzustellen, dass sie gültig ist. Versuchen Sie, die! Am Ende. – Pops

3

In meinem Szenario ich Daten zwischen der Mutter iOS App und WatchKit teilen. Ich verwende Xcode 6.3.1, iOS Deployment Ziel 8,3

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

In Ihrem viewDidLoad stellen Sie sicher, synchronisieren:

override func viewDidLoad() { 
    super.viewDidLoad() 

    defaults?.synchronize() 

} 

Beispiel einer Schaltfläche Text senden, aber natürlich können Sie passieren, was auch immer:

@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 sicher App Gruppe machen Spiele:

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

Dann synchronisieren und cal: (In diesem Fall „lblNumber“ ist ein IBOutlet Label)

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

Dann, wenn Sie etwas auf dieser Seite und synchronisieren es damals nur tun die gleiche Sache und synchronisieren setzen wollten und nur sicherstellen, dass die stringForKey, die Sie auf der anderen Seite nennen, ist das gleiche:

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

Hoffnung das macht Sinn

2

ich in schnellen foogry Antwort ü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 
10

Hier ist, wie ich es tat:

  1. Öffnen Sie Ihre Haupt-App Ziel> Kompetenzen> App-Gruppen setzen auf
  2. Fügen Sie eine neue App-Gruppe hinzu und vergewissern Sie sich, dass sie angekreuzt ist (zB group.com.seligmanventures.L iightAlarmFree)
  3. Öffnen Sie Ihr Überwachungsziel (das mit der Registerkarte Fähigkeiten)> App-Gruppen auf aktiviert
  4. Fügen Sie eine neue App-Gruppe hinzu und stellen Sie sicher, dass sie aktiviert ist (z. group.com.seligmanventures.LightAlarmFree - aber muss die gleichen Namen wie Gruppe oben sein)
  5. speichern Daten in die Gruppe wie folgt:

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

    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") 
    } 
    
+0

Wissen Sie, ob defaults.suiteName permanent gespeichert ist, genau wie defaults.standard? – VDog

0

Sie sollten NSUserDefaults wie folgt verwenden und sicherstellen, dass Sie die App-Gruppe in Ihrem vorläufigen Profil aktiviert haben müssen und die App-Gruppe als grünes Symbol konfiguriert werden muss und es zu Ihrem hinzufügen sollte provisorisches Profil & 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"]; 
Verwandte Themen