2016-12-21 1 views
0

Ich habe App-Gruppen für meine App und ihre iMessage-Erweiterung aktiviert, sodass ich Daten zwischen beiden teilen kann. Ich habe NSUserDefaults Synchronisation in beiden Codebasen implementiert. Ich habe jedoch keine gute Möglichkeit gefunden, die Synchronisation zu testen.Testen der NSUserDefaults-Synchronisierung über App-Gruppen hinweg im Simulator

In eines des Viewcontrollers für meinen Haupt-App habe ich hinzugefügt, um diese:

var defaults = NSUserDefaults(suiteName: "group.com.myAppGroup") 
       defaults?.setObject(movieTitles, forKey: "movieTitles") 
       defaults?.synchronize() 
       print("synchronizing movieTitles as \(movieTitles)") 

In der iMessage Erweiterung habe ich habe dieses Bild:

var defaults = NSUserDefaults(suiteName: "group.com.myAppGroup") 
    defaults?.synchronize() 

    // Check for null value before setting 
    if let movieTitles = defaults!.stringForKey("movieTitles") { 
     print("synchronized movieTitles from \(movieTitles)") 
    } 
    else { 
     print("Cannot synchronize movieTitles") 
    } 

Wenn ich laufe die App Im Simulator kann ich in der Konsole sehen, dass die Synchronisierung stattfindet. Wenn ich die Erweiterung in Simulator ausführen, kann ich in der Konsole sehen, dass es versucht zu synchronisieren (und fehlgeschlagen, weil die App nicht ausgeführt wird, so gibt es nichts zu synchronisieren). Jedes Mal, wenn ich versuche, beide Ziele gleichzeitig in Simulator zu laufen, bekomme ich diesen Absturz für die iMessage-Erweiterung:

libsystem_kernel.dylib`mach_msg_trap: 
    0x109d2b380 <+0>: movq %rcx, %r10 
    0x109d2b383 <+3>: movl $0x100001f, %eax   ; imm = 0x100001F 
    0x109d2b388 <+8>: syscall 
-> 0x109d2b38a <+10>: retq 
    0x109d2b38b <+11>: nop 

Ich bin nicht kompetent genug, um das Debuggen zu wissen, was das bedeutet. Die Konsole zeigt (lldb) auch in der letzten Zeile.

Jede Hilfe wird geschätzt. Wie kann ich sonst meinen Synchronisationscode testen?

Antwort

0

Nach beträchtlichen Versuch und Irrtum und erneutes Lesen anderer Tutorials, habe ich es. Diese AppCoda tutorial endete als das letzte, was ich las, bevor ich es funktionierte.

In meinem Haupt-app ich eine globale Variable deklariert:

var defaults = NSUserDefaults(suiteName: "group.com.myOrg.myApp") 

Dann wird in einer Funktion (der Haupt-App), wo der Wert Ich möchte aktualisiert wird teilen, habe ich:

defaults?.setObject(movieTitles, forKey: "movieTitles") 
defaults?.synchronize() 

Von der Erweiterung view-Controller erklärte ich wieder die globalen Standardwerte Variable und verwendet diese in viewDidLoad():

if let extMovies = defaults.stringArrayForKey("extensionMovies") { 
    print("extMovies is \(extMovies)") 
} else { 
    print("no extMovies to be found here") 
} 

Zum Testen habe ich zuerst die App-Erweiterung und dann die Haupt-App ausgeführt. Das Zurückschalten auf die Erweiterung in Simulator würde manchmal zu einem Absturz führen, aber wenn ich dieses Schema erneut ausführen würde, würde ich meine freigegebene Variable auf der Konsole ausgeben sehen.