Этот пост продолжает нашу серию о Stampy Day, общекорпоративном хакерском дне здесь, в Paperless Post. Мы надеемся, что вам понравится читать о некоторых проектах, реализованных в тот день.

В прошлом году мы приступили к амбициозному проекту по поэтапному отказу от нашего интерактивного «инструмента для создания» на основе флэш-памяти, заменив его JavaScript и HTML5. Платформой, на которую мы изначально нацеливались, была не сеть, а наше родное приложение для iOS. Это был шаг, который позволил бы нам использовать общую базу кода и набор функций на всех платформах.

Просмотр, как мы его называем, полностью написан на JavaScript, и его возглавлял @talltyler. Что касается iOS, мы сразу же обнаружили, что предоставленный Apple UIWebView, способный выполнять JavaScript, не подходит для этой работы (по многим причинам). Нам посчастливилось найти проект с открытым исходным кодом Ejecta, который сам по себе описывает Быстрая реализация JavaScript, Canvas и Audio с открытым исходным кодом для iOS.

Во время разработки большая часть отладки JavaScript происходила на уровне браузера с использованием консоли отладки в Chrome и Safari. Это часто оставляло все на волю случая, когда мы запускали их в iOS. Для Stampy Day в этом году мы решили решить эту проблему, создав удаленную консоль отладки для iOS + JavaScript. Что касается веба, @talltyler создал веб-приложение, которое мы запускаем на нашем сервере сборки Mac Mini. Веб-приложение использует сокеты через Socket.io и может одновременно размещать несколько клиентов. Что касается iOS, мы также используем реализацию Cocoa Socket.io для подключения к серверу. После установления соединения вы можете получить доступ к любому устройству из веб-приложения и начать отладку! Отладка работает так, как и следовало ожидать: введите какой-нибудь javascript, отправьте его, и БУМ, новый вывод консоли.

В iOS мы создали специальный подкласс нашего «javaScriptView», который создается в режиме отладки как кластерный класс. Когда окно просмотра настроено и работает, подключиться очень просто:

- (void)openConnection
{
    self.remoteConnection = [PPJSRemoteConnection connectionWithDelegate:self];
    [self.remoteConnection setHost:self.host];
    [self.remoteConnection openConnection];
}

Всякий раз, когда веб-приложение отправляет JavaScript, наш делегат получает обратный вызов, оценивает JS и возвращает результат, если требуется обратный вызов:

- (void)remoteConnection:(PPJSRemoteConnection *)connection didReceiveMessage:(PPJSRemoteMessage *)message requestedCallBack:(void (^)(NSArray *args))callback
{
  NSString *js = [message javaScriptToBeEvaluated];
  //debug_eval has the JSContext execute the provided JavaScript and return a value, if any 
    id returnValue = [self debug_eval:js]? :  [NSNull null];
    if (callback) {
        callback(@[returnValue]);
    }
}

Благодаря динамической природе JavaScript мы можем диагностировать проблемы, обновлять код и исправлять ошибки в режиме реального времени без необходимости перестраивать приложение iOS или файл JavaScript.