Обновление приложения 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/.

  • Заголовок UITableView не может работать с UIViewAnimationOptions.Repeat
  • SmartView SDK Samsung / Tizen - внутренняя ошибка сервера 500
  • Откройте список SMS-сообщений на iOS
  • Получить предыдущие, текущие и следующие недели, исключая субботу и воскресенье
  • Как добавить стикеры в изображение в Swift?
  • Проверка безопасности 5-й фазы Swift 4
  • Почему я получаю ошибку com.facebook.sdk.login 308?
  • Как обрабатывать ошибки в NSPersistentContainer.loadPersistentStores?
  • Как сделать снимок с помощью датчика приближения?
  • Как я могу наложить NSMutableArray на массив Swift определенного типа?
  • removeConstraint () не работает
  • Interesting Posts

    iOS 11 – В тестировании покупки приложений с помощью пользователя песочницы продолжает просить войти в систему и для кого-то еще? Навсегда?

    Зачем вам нужен сертификат разработчика IOS для запуска приложения IOS на устройстве?

    Проблема с рендерингом AVAssetExportSession

    Swift 2.0 Формат 1000 в дружественный K

    Уведомления IOS с FCM

    Использование многопоточности для сохранения данных на iOS

    CNContact измененная дата и контакты изменены

    iOS UIWebView Javascript Timers

    Как определить клавиатуру iOS, когда она находится между контроллерами?

    Как вернуться к RootViewController с контроллера PresentView?

    Настройка Naive Git, возможно ли отследить файлы, указанные в моем .gitignore?

    В чем разница между установкой объекта = nil и VS и object = nil?

    вызов popToRootViewController с другой вкладки

    реализация алгоритма сглаживания floyd steinberg в opencv не работает должным образом

    Нежелательный пустой UITableViewCell в верхней части моего UITableView

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