Как мне использовать MMWormhole со Swift?

У меня есть приложение для iPhone, и я добавил WatchKitExtension. Из приложения для iPhone я хочу передать String в приложение WatchApp, которое должно изменить изображение на часах.

  • Что я уже сделал, так это загрузил исходные файлы и импортировал файлы MMWormhole.m и .h. Они написаны на Obj-C, поэтому Xcode автоматически соединил их для меня.
  • Я также добавил группу приложений и активировал ее для моего WatchExtension и цели для iPhone.

В руководстве на GitHub говорится, что я должен инициализировать червоточину с помощью:

self.wormhole = [[MMWormhole alloc] initWithApplicationGroupIdentifier:@"group.com.mutualmobile.wormhole"
                                                                          optionalDirectory:@"wormhole"];

... и отправить сообщение, используя:

[self.wormhole passMessageObject:@{@"titleString" : title} 
                         identifier:@"messageIdentifier"];

Но я понятия не имею, куда это поместить, я использую Swift в своем приложении для iPhone и WatchExtension.

Может ли кто-нибудь помочь мне там?


person LinusGeffarth    schedule 24.04.2015    source источник


Ответы (2)


Я предполагаю, что это зависит от разных приложений, но для одного приложения я помещаю слушателей в метод didFinishLaunchingWithOptions моего делегата приложения в основном приложении iOS. Это было связано с тем, что пользователь будет использовать часы и передавать информацию на телефон.

Слушателей было много...

var wormhole = MMWormhole(applicationGroupIdentifier: "group", optionalDirectory: nil)

wormhole.listenForMessageWithIdentifier("identifier", listener: { (message) -> Void in
                //do stuff
})

wormhole.listenForMessageWithIdentifier("identifier2", listener: { (message) -> Void in
            //do stuff
})

wormhole.listenForMessageWithIdentifier("identifier3", listener: { (message) -> Void in
            //do stuff
})

А потом в WKInterfaceController я отправил сообщение. Иногда в действии, иногда в методе willActivate. Это действительно зависит от потока вашего приложения

var wormhole = MMWormhole(applicationGroupIdentifier: "group", optionalDirectory: nil)
    @IBAction func buttonPushed(){            
        wormhole.passMessageObject("object", identifier: "identifier1")
    }

Однако это может работать в обоих направлениях, я мог бы очень легко поместить прослушиватель в свои часы, который будет ждать сообщений, инициированных каким-либо контроллером интерфейса на телефоне.

person prawn    schedule 24.04.2015
comment
Он говорит, что не знает MMWormhole... Я пытался импортировать его в свой AppDelegate.swift, но когда я набираю import MMWormhole или с .m или .h, он говорит, что такого модуля нет. - person LinusGeffarth; 24.04.2015
comment
Если вы перейдете в свой корневой проект -> Настройки сборки и выполните поиск заголовка Objective-C Briding, путь указывает на правильный файл? Файл должен называться примерно так: Projectname-Briding-Header.h. А в этом файле у вас есть строка #import "MMWormhole.h" верно? - person prawn; 24.04.2015
comment
Когда я ищу, он ничего не показывает для любой цели, поэтому я просто вставил имя файла. Это правильно или мне нужен путь к файлу? О, и я добавил #import "MMWormhole.h", но он все равно не работает :/ - person LinusGeffarth; 24.04.2015
comment
Хм. Нет объективной спецификации заголовка? Попробуйте посмотреть на это. Эта ссылка помогла мне, когда я не мог вызвать объектный код в Swift. stackoverflow.com/ вопросы/24002369/ - person prawn; 24.04.2015
comment
Понятия не имею, что произошло и что на самом деле решило проблему, но я добавлял, удалял, импортировал, удалял, читал и т. д., и каким-то образом теперь это работает. Ваше решение было полезным, и спасибо за перевод кода. - person LinusGeffarth; 24.04.2015
comment
У меня похожая проблема. Когда я подключаюсь, у меня нет проблем с использованием MMWormhole в приложении для iphone, но я получаю жалобы в расширении WatchKit. см. здесь: stackoverflow.com/questions/30828354/ - person murvinlai; 14.06.2015

Вот мои инструкции. Надеюсь, они помогут вам с самым простым вариантом использования, а затем вы сможете расширить его. (Не забудьте структурировать свой код так, чтобы он действительно имел смысл!)

  • Добавьте MMWormhole (.h и .m) в свой проект. Если вы знаете, как использовать Cocoapods, сделайте это, но в противном случае просто используйте подмодули git. (я использую подмодули git)
  • Поскольку вам нужно, чтобы .h был виден из Swift, вам нужно использовать заголовок-мост.
  • Настройте группу приложений, для чего необходимо использовать портал разработчика. Ссылка здесь
  • В вашем iPhone создайте цель -> Возможности -> Группы приложений и добавьте свою группу. Если все три флажка не проходят идеально, вернитесь на портал разработчика и убедитесь, что все в порядке, или начните заново.

Червоточина MM, сторона iPhone

Установите червоточину там, где вы можете до нее добраться. ПРИМЕЧАНИЕ: ID вашей группы должен быть указан выше!

let wormhole = MMWormhole(applicationGroupIdentifier: "group.testMe.now", optionalDirectory: nil)
wormhole.listenForMessageWithIdentifier("wormholeMessageFromWatch", listener: { (message ) -> Void in
    if let messageFromWatch = message as? String {
          // do something with messageFromWatch
    }
})

Приложение для iPhone отправляет строку

wormhole.passMessageObject("message from phone to watch", identifier: "wormholeMessageFromPhone")

Приложение для iPhone регистрируется для получения и снова отправляет в обратном вызове через MMWormhole (асинхронно, но круто)

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    universe.initWormhole(.phone, messageHandler: { (message) -> () in
        universe.wormhole.passMessageObject("the phone got \(message)", identifier: "wormholeMessageFromPhone")
    })
    return true
}

MMWormhole, сторона Apple Watch

Установите червоточину там, где вы можете до нее добраться. ПРИМЕЧАНИЕ: ID вашей группы должен быть указан выше!

let wormhole = MMWormhole(applicationGroupIdentifier: "group.testMe.now", optionalDirectory: nil)
wormhole.listenForMessageWithIdentifier("wormholeMessageFromPhone", listener: { (message ) -> Void in
    if let messageFromPhone = message as? String {
          // do something with messageFromPhone
    }
})

MMWormhole, следите за регистрацией приложения для получения

override func awakeWithContext(context: AnyObject?) {
    super.awakeWithContext(context)
    universe.initWormhole(.watch, messageHandler: { (message) -> () in
        println("MMWormhole Message Came to Watch: \(message)")
    })
}

MMWormhole, смотрите, приложение отправляет

// force open the parent application because otherwise the message goes nowhere until the app is opened
WKInterfaceController.openParentApplication(["":""], reply: nil) 
universe.wormhole.passMessageObject("[from watch to phone]", identifier: "wormholeMessageFromWatch")
person Dan Rosenstark    schedule 20.05.2015