Проблема WCSession с Xcode 7.3

привет

Перед обновлением Xcode до версии 7.3 у меня было приложение с приложением WatchOS 2. Приложение часов вызывало func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) { , а приложение iOS выбирало вызов и вставляло переданное значение. Все было хорошо.

Но после обновления до Xcode 7.3 я заметил одну проблему: func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) { вызывается дважды ТОЛЬКО, когда приложение iOS запускается в первый раз, если приложение работает или находится в фоновом режиме, эта функция позвонили только один раз.

Если я передаю значения 1, 5 и 10, а приложение iOS не запущено, добавляются значения 1, 5, 10, 1, 5 и 10. Но если приложение работает в любой форме, добавляются значения 1, 5 и 10.

Есть идеи, почему?

Вот код со стороны WatchOS, я сам до этого додумался, но по моим тестам они вызываются только один раз. Я провел много тестов, и это происходит только тогда, когда приложение iOS запускается, а не когда оно работает в фоновом режиме.

@IBAction func ConfirmButtonPressed() {

    let applicationDict = ["Amount out":  self.AmountText    ]// Create a dict of application data
      //applicationDict = ["status":   "0"   ]// Create a dict of application data
    WCSession.defaultSession().transferUserInfo(applicationDict)
}

Вот код приложения iOS из делегата приложения

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    if (WCSession.isSupported()) {
        print("xyz3")
        session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
    }

..........

func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) {

    var status = false
    var AmountUILabel = ""

          status = false
         AmountUILabel  = userInfo["Amount out"]  as! String
        print(userInfo["Amount out"]  )

    let i  =  NSString (string:   AmountUILabel ).doubleValue
      let when = NSDate()
     let list :[AnyObject] =  controller.viewControllers!
    let j = list[1].topViewController  as! AllEntriesTableViewController

    j.AddAmount(i , date:  when, what: "---", status: status)
   }

person hsn    schedule 25.03.2016    source источник
comment
Можете ли вы показать, что отправляет приложение часов? В словаре 3 значения, и вы его дважды передаете?   -  person    schedule 25.03.2016


Ответы (1)


Я смог найти ответ после целого дня исследований. Я должен был начать didReceiveUserInfo с dispatch_async

Это исправило проблему и увеличило скорость связи между приложением для часов и приложением для iOS.

func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) {
    dispatch_async(dispatch_get_main_queue()) {
person hsn    schedule 25.03.2016
comment
Спасибо, что вернулись, чтобы опубликовать свое решение. Я боролся с той же проблемой. Это видео (developer.apple.com/videos/play/wwdc2015/713) был действительно полезен для понимания WatchConnectivity, и хотя они упоминают, что эти делегаты вызываются вне основной очереди, я никогда не думал, что это может привести к дублированию вызова. - person gohnjanotis; 05.05.2016
comment
У меня возникла проблема в моем приложении iOS после передачи userInfo из приложения Watch OS 2, когда приложение iOS было завершено (принудительно закрыто): объект из приложения Watch создавался дважды, когда приложение iOS запускалось позже; обернув didReceiveUserInfo его в dispatch_async , как предлагается здесь, устранена проблема дублирования. - person cdf1982; 17.07.2016
comment
@ cdf1982 рад, что мой ответ помог! - person hsn; 18.07.2016