Desenvolvimento

10 fev, 2015

Atualizando aplicativos Cordova-iOS fora da App Store

Publicidade

Em um dos meus últimos artigos, eu expliquei como atualizar os aplicativos Cordova-Android fora da Google Play Store com AngularJS. Hoje é a vez dos aplicativos iOS.

Se você trabalha com aplicativos iOS in-house, precisa definir uma estratégia de distribuição (você não pode usar a App Store, na verdade). A Apple fornece documentação para fazê-lo. Basicamente, precisamos colocar o nosso arquivo ipa além do arquivo plist (gerado quando arquivamos o nosso pedido com o Xcode). Eu não vou explicar como fazer isso aqui. Como eu disse antes, é bem documentado. Aqui eu vou explicar como fazer o mesmo truque que o do artigo do Android, mas agora com o aplicativo iOS.

Com o iOS, para instalar o aplicativo, só precisamos fornecer o link do iTunes para o nosso aplicativo plist (algo assim: itms-services://?action=download-manifest&url=http://url.to.plist) e abri-lo com o plugin InAppBrowser.

Primeiro, vamos instalar o plugin InAppBrowser:

$ cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser.git

E agora nós só precisamos abrir a URL usando o plugin:

var iosPlistUrl = 'http://url.to.plist';
cordova.exec(null, null, "InAppBrowser", "open", [encodeURI("itms-services://?action=download-manifest&url=" + iosPlistUrl), "_system"]);

Podemos usar exatamente o mesmo AngularJS utilizado no artigo anterior para verificar a versão e a mesma verificação do lado do servidor.

Podemos, também, detectar a plataforma com o plugin do dispositivo e fazer uma coisa ou outra, dependendo do sistema que estivermos usando – Android ou iOS.

Aqui você pode ver um exemplo usando o framework Ionic. Esse exemplo usa um $ httpinterceptor para enviar o número da versão dentro de cada pedido e nós desencadeamos ‘wrong.version’ para o evento distribuidor quando ele detecta uma versão errada entre o cliente e o servidor.

angular.module('G', ['ionic'])
 
    .value('appConf', {
        version: 1,
        apiHost: 'http://localhost:8080'
    })
 
    .config(function ($httpProvider, $urlRouterProvider, $stateProvider) {
        $httpProvider.interceptors.push('versionInterceptor');
 
        $stateProvider
            .state('home', {
                url: '/home',
                templateUrl: 'partials/home.html',
                controller: 'HomeController'
            })
            .state('upgrade', {
                url: '/upgrade',
                templateUrl: 'partials/upgrade.html',
                controller: 'UpgradeController'
            })
        ;
 
        $urlRouterProvider.otherwise('/home');
 
    })
 
    .run(function ($ionicPlatform, $rootScope, $state) {
        $ionicPlatform.ready(function () {
            if (window.cordova && window.cordova.plugins.Keyboard) {
                cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
            }
            if (window.StatusBar) {
                StatusBar.styleDefault();
            }
        });
 
        $rootScope.$on('wrong.version', function () {
            $state.go("upgrade");
        });
    })
 
    .controller('HomeController', function ($scope, $http, appConf) {
        $scope.someAction = function () {
            $http.get(appConf.apiHost + "/hello", function (data) {
                alert(data);
            });
        }
    })
 
    .controller('UpgradeController', function ($scope) {
        $scope.upgrade = function () {
            cordova.exec(null, null, "InAppBrowser", "open", [encodeURI("itms-services://?action=download-manifest&url=https://path/to/plist.plist"), "_system"]);
        }
    })
 
    .factory('versionInterceptor', function ($rootScope, appConf) {
        var versionInterceptor = {
            request: function (config) {
                config.url = config.url + '?_version=' + appConf.version;
 
                return config;
            },
            responseError: function(response) {
                if (response.status == 410) {
                    $rootScope.$emit('wrong.version');
                }
            }
        };
 
        return versionInterceptor;
    })
;

***

Artigo traduzido pela Redação iMasters, com autorização do autor. Publicado originalmente em http://gonzalo123.com/2014/10/13/upgrading-cordova-ios-apps-outside-apple-store/