2016-12-21 4 views
0

Я включил группы приложений для своего приложения и его расширение iMessage, чтобы я мог делиться данными между ними. Я реализовал синхронизацию NSUserDefaults в обоих кодах. Тем не менее, я не нашел хороший способ проверить синхронизацию.Тестирование синхронизации NSUserDefaults в группах приложений в симуляторе

В одном из ViewControllers для моего основного приложения, я добавил этот:

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

В расширения Шеззаде, я добавил это:

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

Когда я запустить приложение в Симуляторе, я вижу в консоли, что синхронизация происходит. Когда я запускаю расширение в Simulator, я вижу на консоли, что он пытается синхронизировать (и не работает, потому что приложение не работает, поэтому синхронизация не синхронизируется). Всякий раз, когда я пытаюсь запустить обе цели одновременно в симуляторе, я получаю эту аварию для расширения Шеззадя:

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 

Я не достаточно опытным при отладке, чтобы знать, что это значит. На последней строке также отображается (lldb).

Любая помощь приветствуется. Как еще я могу проверить свой код синхронизации?

ответ

0

После значительных проб и ошибок и повторного чтения других уроков я получил его. Этот AppCoda tutorial оказался последним, что я прочитал, прежде чем я его заработал.

В моем главном приложении я объявил глобальную переменную:

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

Затем в функции (основного приложения), где значение, которое я хочу поделиться обновляется, я использовал:

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

от контроллера представления расширения я снова объявлены глобальные значения по умолчанию переменной и использовал это в viewDidLoad():

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

Чтобы проверить, сначала я запускал расширение приложения, а затем основное приложение. Переход к расширению в Simulator иногда может привести к сбою, но если я повторно запустил эту схему, я увижу, что моя общая переменная печатается на консоли.

Смежные вопросы