NSUserDefaults, group und WatchKit -> (null)

  • NSUserDefaults, group und WatchKit -> (null)

    Hi,

    ich hab ein Problem und komm einfach nicht weiter. Deshalb kurz ne Frage ob das bei einem von euch so funktiniert und überhaupt geht.

    In einer bestehenden App möchte ich gerne eine Funktion für die Watch integrieren.
    Nun ist es so, dass diese App für einige Abfragen auf die Standart User Defaults zugreift bzw. auf Strings darin. Die Einträge für die App werden unter den
    normalen iPhone EInstellungen eingetragen. Nicht in der App selbst.

    Mit der Mini-Funktion für die Watch muss ich auch auf diese Einstellungen zugreifen können.

    Nun hab ich eine AppGroup angelegt und diese den beiden Targets zugewiesen (App & Watch)
    Die Einstellungen rufe ich so (in der WatchKit Extension) ab:

    Quellcode

    1. - (void)awakeWithContext:(id)context {
    2. [super awakeWithContext:context];
    3. NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.xxxx.test"];
    4. [defaults synchronize];
    5. NSString *serial = [defaults stringForKey:@"serial_preference"];
    6. NSLog(@"Serial: %@ ",serial);
    7. }

    Als Ausgabe bekomme ich immer Serial: (null)

    Das Settings-Bundle liegt im Order der Hauptapp - hier habe ich auch den Eintrag:
    ApplicationGroupContainerIdentifier - string group.xxx.xxxx.test gesetzt

    Hat einer von euch ne Idee was ich falsch mache ?
    Danke & Lg Lena
  • Ich denke der findet meine nicht, oder stehen die Apple Einträge immer drin ??
    Ne Idee an was das liegt?

    Quellcode

    1. 2015-05-20 15:56:31.940 WatchKit Extension[1113:6068308] Serial: (null)
    2. 2015-05-20 15:56:31.942 WatchKit Extension[1113:6068308] userDefaults:{
    3. AppleITunesStoreItemKinds = (
    4. audiobook,
    5. "tv-episode",
    6. booklet,
    7. software,
    8. "software-update",
    9. "itunes-u",
    10. ringtone,
    11. "tv-season",
    12. movie,
    13. mix,
    14. newsstand,
    15. song,
    16. wemix,
    17. tone,
    18. artist,
    19. "podcast-episode",
    20. podcast,
    21. document,
    22. eBook,
    23. album,
    24. "music-video"
    25. );
    26. AppleKeyboards = (
    27. "en_US@hw=US;sw=QWERTY",
    28. "emoji@sw=Emoji",
    29. "de_CH@hw=Swiss German;sw=QWERTZ-German"
    30. );
    31. AppleKeyboardsExpanded = 1;
    32. AppleLanguages = (
    33. en,
    34. fr,
    35. de,
    36. "zh-Hans",
    37. "zh-Hant",
    38. ja,
    39. nl,
    40. it,
    41. es,
    42. "es-MX",
    43. ko,
    44. pt,
    45. "pt-PT",
    46. da,
    47. fi,
    48. nb,
    49. sv,
    50. ru,
    51. pl,
    52. tr,
    53. uk,
    54. ar,
    55. hr,
    56. cs,
    57. el,
    58. he,
    59. ro,
    60. sk,
    61. th,
    62. id,
    63. ms,
    64. "en-GB",
    65. "en-AU",
    66. ca,
    67. hu,
    68. vi,
    69. hi
    70. );
    71. AppleLocale = "en_US";
    72. MSVLoggingMasterSwitchEnabledKey = 0;
    73. NSInterfaceStyle = macintosh;
    74. NSLanguages = (
    75. en,
    76. fr,
    77. de,
    78. "zh-Hans",
    79. "zh-Hant",
    80. ja,
    81. nl,
    82. it,
    83. es,
    84. "es-MX",
    85. ko,
    86. pt,
    87. "pt-PT",
    88. da,
    89. fi,
    90. nb,
    91. sv,
    92. ru,
    93. pl,
    94. tr,
    95. uk,
    96. ar,
    97. hr,
    98. cs,
    99. el,
    100. he,
    101. ro,
    102. sk,
    103. th,
    104. id,
    105. ms,
    106. "en-GB",
    107. "en-AU",
    108. ca,
    109. hu,
    110. vi,
    111. hi
    112. );
    113. }
    Alles anzeigen
  • Die User Defaults habe ich zum Datenaustausch zwischen der Watch Kit Extension mit der Phone App bisher nicht verwendet.

    Alternativ könntest Du es mal mit openParentApplication:reply: in der Watch Kit Extension und application:handleWatchKitExtensionRequest:reply: in der Phone App versuchen.
  • Das probier ich auf alle Fälle auch noch aus.

    Was mir jetzt aber noch aufegefallen ist, das meine "Haupt-App" die User Defaults jetzt auch nicht mehr auslesen kann.

    Ich mach das so :
    NSString *textValue = [[[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.xxx.test"] stringForKey:@"name_preference"];

    Selbes ergebnis wie bei der Watch ... es kommt auch nur (null) an und die es werden die default Apple angaben ausgegeben

    Mit dem Widget müsste das ja später auch gehen...
    Noch jemand eine Idee , wo ich was mit den Groups und UserDefaults falsch gemacht haben könnte.
  • Für Änderungen an den besagten Einstellungen in den User Defaults verwendest Du ein Settings.bundle, richtig?

    Müsste man dem Settings.bundle dann nicht auch irgendwie/irgendwo mitteilen, dass die Einstellungen in den User Defaults der gewünschten App Group verwendet werden und nicht die Standard Defaults?
  • MCDan schrieb:

    Aber woher weiss das Settings.bundle bzw. die Apple App Einstellungen, dass es die Daten für die App Einstellungen aus den User Defaults der App Group und nicht die Standard Defaults verwenden soll? ?(

    Na dadurch

    Quellcode

    1. NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.xxxx.test"];

    Oder irre ich mich jetzt?
  • matz schrieb:

    MCDan schrieb:

    Aber woher weiss das Settings.bundle bzw. die Apple App Einstellungen, dass es die Daten für die App Einstellungen aus den User Defaults der App Group und nicht die Standard Defaults verwenden soll? ?(
    Na dadurch

    Quellcode

    1. NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.xxxx.test"];
    Oder irre ich mich jetzt?

    das kann dann doch jeder machen, wenn nicht in der app definiert ist welche andere identifier zugriffsrecht haben!?
  • matz schrieb:

    MCDan schrieb:

    Aber woher weiss das Settings.bundle bzw. die Apple App Einstellungen, dass es die Daten für die App Einstellungen aus den User Defaults der App Group und nicht die Standard Defaults verwenden soll? ?(
    Na dadurch

    Quellcode

    1. NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.xxxx.test"];
    Oder irre ich mich jetzt?
    Es ging mir eher um die Einstellungen zur App, welche durch die Definitionen im Settings.bundle in der Einstellungen App von iOS zu einer App durchgeführt werden können.

    Man kann ja in der Einstellungen App von iOS zu diversen Apps, also zu allen Apps welche ein Settings.bundle enthalten, Einstellungen vornehmen. Diese werden ja normalerweise in Standard User Defaults abgelegt. Woher soll die Einstellungen App von iOS jetzt wissen, das diese Einstellungen nicht in der Standard Use Defaults, sondern in den User Defaults der App Group abgelegt werden sollen?
  • --> Es ging mir eher um die Einstellungen zur App, welche durch die Definitionen im Settings.bundle in der Einstellungen App von iOS zu einer App durchgeführt werden können.

    Ich dachte das mache ich über :
    ApplicationGroupContainerIdentifier string group.xxx.xxxx.test gesetzt
    in dem .plist File im Settings.bundle ??
  • Ah ok, genau diese Info fehlte mir. Damit konnte ich auch die passende Doku von Apple diesbezüglich finden.

    Ich habe schon lange nichts mehr mit einem Settings.bundle gemacht, daher bin ich diesbezüglich nicht ganz aktuell. ;)

    Damals war es hilfreich, nach einer Änderung am Settings.bundle, die App vorher auf dem Device/Simulator zu löschen und auch die Einstellungen App zu beenden, damit das neue Settings.bundle verwendet wird. Probiere dies ggf. mal aus. Wenn Du eine Änderungen in den Einstellungen über die Einstellungen App machst, dann sollte diese eigentlich auch in den User Defaults der App Group auftauchen.
  • Prüfe mal in der App (nicht in der Extension) ob du die Daten in den shared UserDefaults findest. Wenn das da auch nicht geht, dann stimmt was beim Schreiben nicht.

    Am Rande: Ich hatte neulich das Problem, dass ich die Daten in der Watch-Extension nicht sehen konnte, weil unterschiedliche Build-Configs benutzt wurden.