Я веб-разработчик по профессии, а это значит, что последние восемь или около того лет я ревностно смотрел на мир нативной мобильной разработки и постоянно расширяющийся набор функций, с которыми он должен работать, чего я не делаю. Push-уведомления, фоновая загрузка, встроенные элементы управления просмотром, виджеты… все это вне моей досягаемости. Как и многие веб-специалисты, я окунулся в этот мир с некоторыми прототипами и хакерскими проектами - проделал Objective C, был в восторге от Swift, был уверен, что Java по-прежнему ... ну, действительно Java-y. Но основная проблема остается - большая часть моей работы всегда должна выполняться в Интернете, поэтому я никогда не смогу полностью перейти на нативную сторону.

Но год назад из ниоткуда появилось два проекта - React Native и NativeScript. Оба обещали позволить мне писать кроссплатформенные нативные приложения с JavaScript, который я уже использую каждый день. Меня восхищают и то, и другое, и в особенности то, есть ли у них потенциал для тех из нас, кто занимается издательским делом новостей, которые не могут позволить себе игнорировать Интернет.

React Native, безусловно, имеет наибольшую поддержку сообщества, но код JavaScript, который вы пишете, живет в своем собственном мире - если нет плагина для какой-либо нативной функции, которую вы хотите, вам нужно перейти к Objective C или Swift, чтобы получить его. NativeScript обещает нечто большее: полную доступность нативного API через JavaScript. Я хотел написать действительно быстрый прототип (для обнаружения враждебной мобильной рекламы, перенаправляющей пользователей в App Store), и это казалось идеальным шансом испытать NativeScript.

Установка

NativeScript использует Node для многих сценариев, но как только он у вас есть в вашей системе, установить его так же просто, как набрать npm install nativescript. Когда вы создаете новый проект, он добавляет некоторый шаблонный код, который включает собственный XML-формат NativeScript для определения представлений. Это полнофункциональная кроссплатформенная библиотека пользовательского интерфейса, но я хотел пока проигнорировать все это, чтобы как можно ближе приблизиться к нативной настройке - просто использовать сами API. Итак, я стер все файлы и создал новый файл app.ts со следующим:

const App = NSObject.extend({
    applicationDidFinishLaunchingWithOptions: function (application, launchOptions) {
        // Launch code here
    }
}, {
    protocols: [UIApplicationDelegate]
});

..и это действительно все, что вам нужно сделать, чтобы подключиться к запуску приложения. Вам даже не нужно использовать TypeScript, но я решил пойти ва-банк, используя Visual Studio Code, чтобы включить функцию TypeScript typeahead. Это действительно здорово:

С этим начальным крючком все, что мне нужно было сделать, это объявить UIViewController с UIWebView внутри него:

export const DetectorController = UIViewController.extend({
    init: function() {
        this.webview = UIWebView.new()
            .initWithFrame(UIScreen.mainScreen().bounds);
            
        this.webview.delegate = this;
        this.view = this.webview;
        return this.super.init();
    }
}, {
    protocols: [UIWebViewDelegate]
})

и напишу мой код тестирования рекламы внутри этого контроллера. Я выложил все репо на Github - это всего несколько десятков строк кода, но все же. Доказательство концепции.

Заключение

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

Понятно, что доступ к API NativeScript невероятно мощный, но этот пример по сути является JavaScript для JavaScript - было бы проще и проще просто написать это на Swift. Отладка кажется более сложной, чем в Xcode (хотя отсутствие необходимости использовать XCode является преимуществом), хотя есть потенциал для функциональности «живой перезагрузки», которая позволила бы избежать постоянных перестроек во время разработки.

Реальный потенциал здесь зависит от того, соответствует ли NativeScript своему кроссплатформенному обещанию (вы можете получить доступ к API Android таким же образом) и улучшит ли он взаимодействие с помощью встроенного веб-представления (WKWebView имеет гораздо более продвинутые средства связи - можем ли мы сделать прямые Интересно, вызовы JS-to-JS?). Жюри еще не принято, но мне нравится то, что я пробовал до сих пор.