Обновление приложения WatchKit с радиомаяком

Я работаю над созданием iOS-приложения Swift, которое включает iBeacons для предоставления данных в приложение WatchKit (OS 1). Приложение загружает данные из JSON в tableView, исходя из того, установлен ли для параметра маяка CLProximity значение .Near или .Immediate . Приложение iOS при запуске может обнаруживать маяки без проблем, заполнять переменную и делать ее доступной для приложения WatchKit. Однако, когда приложение WatchKit пытается запросить данные маяка из приложения с помощью application:handleWatchKitExtensionRequest когда iOS не был запущен первым, объект для маяков возвращается как nil . Мое предположение заключается в том, что когда приложение закрыто на телефоне, вызов WatchKit для открытия родительского приложения НЕ запускает код ранжирования маяка, который хранится в AppDelegate. Перемещение кода инициализации маяка в application:handleWatchKitExtensionRequest не application:handleWatchKitExtensionRequest проблему.

Как можно было бы построить приложение (в общих чертах, я знаю достаточно кода, что мне не обязательно нужна разбивка по строкам, хотя вы можете это сделать, если считаете, что это поможет другим), где:

  1. Пользователь приложения запускает приложение часов, чтобы проверять данные поблизости.
  2. Приложение watch запрашивает список ближайших / ближайших маяков из приложения iOS.
  3. Приложение iOS возвращает список маяков Основные строки для маяков, которые соответствуют этим критериям.
  4. Оптимально приложение iOS позволяет Наблюдающему приложению узнать, когда этот список изменится, и приложение WatchKit обновится.

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

2 Solutions collect form web for “Обновление приложения WatchKit с радиомаяком”

Перемещение кода в application:handleWatchKitExtensionRequest только частично решает проблему; Основная проблема заключается в том, что ваш маяк не готов немедленно (CLLocationManager – очень асинхронный компонент), и поэтому требуется фактически получить необходимую вам информацию.

Я лично работал над чем-то похожим, как мой забавный проект – на самом деле это был видеоплеер для Watch OS1 (у которого нет функций видеоплеера), и мне это удалось. Итак, модель WK1 действительно проста – вы запрашиваете приложение, у вас есть возможность ответить в

  func application(application: UIApplication, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]?, reply: (([NSObject : AnyObject]!) -> Void)!) 

Теперь забавная часть об этом и то, что я на самом деле закончил использовать, заключается в том, что вам не нужно вызывать метод ответа () в этом методе, вы можете ждать с ответом после завершения какого-либо события. В моем случае, это было асинхронно получить все кадры видео в некоторый буфер X секунд, а затем отправить обратно «Yup, я готов загрузить их сейчас», как только обработка видео закончится.

Так что, на мой взгляд, вы можете сделать следующее:

  • В приложении watch запросите данные маякового радиосигнала
  • В своем приложении проверьте, есть ли у вас данные маяка
  • Если у вас есть их, просто представьте их в WKInterfaceTable или, тем не менее, вы это сделаете
  • Если вы этого не сделаете, запросите маяк, откройте закрытие ответа
  • как только вы получите данные от маяка, вызовите закрытие так же, как и в (3)

Возможно, возникла одна проблема: ваше приложение будет разорвано, прежде чем вы получите желаемый ответ. В этом случае последующие вызовы должны позаботиться об этом

 UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({}) 

Правильный способ использования фоновых задач объясняется здесь подробно , поэтому я просто предоставляю вам ссылку.

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

Если у вас есть дополнительные вопросы или есть проблема с этим решением, просто спросите, и мы это выясним! 🙂 Удачи!

Редактировать:

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

Если это помогает, на странице «Советы Apple WatchKit» предлагается:

«Приложение iPhone должно выполнить большую часть работы. Если вашему приложению в Apple Watch необходимо выполнить более длительные фоновые задачи, например, сетевые вызовы, вы должны полагаться на свое приложение iPhone для выполнения этой работы. Используйте метод openParentApplication: reply: WKInterfaceController для пробуждения вашего iPhone-приложения в фоновом режиме и возврата данных, которые необходимы вашему расширению WatchKit. Метод UIApplicationDelegate, который обрабатывает запрос WatchKit, должен немедленно возвращаться. Если требуется асинхронный вызов, например, для выполнения сетевого взаимодействия, используйте фоновое задание убедитесь, что ваше приложение не заблокировано, прежде чем у него появится возможность отправить ответ ».

Проверьте его и связанные документы на странице https://developer.apple.com/watchkit/tips/.

  • Быстрая регистрация в Google+ GPPSignIn.sharedInstance (). UserID равно всегда nil
  • Почему мой узел мигает? (Быстрая оценка)
  • как получить правильную высоту, когда у нас есть некоторый контент в UIWebView в быстрой iOS?
  • SKSpriteNode: обработка столкновений во время SKAction
  • Сделайте сервисный вызов через регулярный промежуток времени в быстром
  • localizedCaseInsensitiveContainsString недоступен в Swift
  • Swift: как отслеживать и сообщать оценки между сценами в SpriteKit
  • iOS - извлечение и отображение изображения из Parse в UIImageView (ошибка Swift 1.2)
  • EXC_BAD_ACCESS (код = 1, адрес = 0x0)
  • Как обнаружить взаимодействия пользователей с целым диспетчером представлений
  • Синтаксис синтаксиса iOS
  • Interesting Posts

    Изменение размера UIModalPresentationFormSheet на iOS 8

    Добавить SearchDisplayController Over mapKit для поиска Адресная книга

    App Store: запуск только для iPhone / iPod, а не для iPad

    iOS – Как создать UITextView с текстом-заполнителем?

    CloudKit: проверьте подписку локально

    UITableView выполняет удаление и вставку строк в каскадной анимации

    Когда вызывается метод layoutSubviews?

    Не удается установить Enterprise-приложение на устройства с незарегистрированными UUID

    Попадание к определенному диспетчеру просмотра в стеке навигации

    Пользовательский init для подкласса NSManagedObject

    Анимация между двумя состояниями представления, использование пользовательской анимации

    Xcode Organizer: не удается удалить устройство

    Сделайте снимок / снимок экрана UIWebView

    Удаление изображения автоматически после 5 секунд бездействия

    Возобновление обратного отсчета при входе в корневой режим

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.