Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   Update desktop air-приложения (http://www.flasher.ru/forum/showthread.php?t=214419)

hotdes 25.07.2017 16:59

Update desktop air-приложения
 
Есть флешовый проект, состоящий из множества swf-файлов и xml-файлов. С помощью adt умею делать сборку этого проекта в один файл .exe или .air, с помощью которых делается инсталляция приложения на windows. Почитал
http://help.adobe.com/ru_RU/air/buil...de46-7ff2.html
Насколько понял там речь идет об обновлении приложения когда типа один .air файл меняется на новый .air целиком при переходе на новую версию приложения. У меня же судя по всему будут незначительные апдейты, грубя говоря когда из 100 swf будет изменена только одна swf-ка. В этом случае не хотелось бы , чтобы пользователь качал .air файл новой версии, а скачивал бы типа только изменение "в одной из 100 sfw-ок" .

Как реализовать сей процесс?

undefined 25.07.2017 18:02

прикладывать к одному из 100 свф апдейтер,который положит его куда надо.

caseyryan 26.07.2017 06:26

.air файл это просто архив. При установке он распаковывается в систему и все его содержимое будет в папке с установленной программой, но загвоздка в том, что File.applicationDirectory - только для чтения, то есть записать туда что-то средствами самой программы нельзя, и о прикладывании какого-то swf апдейтера можно забыть. Есть хак для обхода этого запрета, но, насколько удалось выяснить, работает это только в винде, и то до 10ки.
Могу предложить такое решение: AIR программа скачивает с сервера нужный для обновления swf файл, кладет его во временную директорию, а чтобы скопировать его оттуда в папку с установкой, вызывает штатный терминал / командную строку системы и с помощью нее копирует файл, после чего перезапускается

Пример того как работать с командной строкой в винде (Это файл из моего рабочего проекта, так что есть кое что лишнее). Там есть методы назначения и чтения переменных среды, вот в них и происходит работа с командной строкой. Для MAC OS реализации нет за ненадобностью
Код AS3:

package ru.ppro.plagiatorpro.model {
        import com.hurlant.util.ArrayUtil;
        import flash.desktop.NativeApplication;
        import flash.desktop.NativeProcess;
        import flash.desktop.NativeProcessStartupInfo;
        import flash.events.ProgressEvent;
        import flash.filesystem.File;
        import flash.filesystem.FileMode;
        import flash.filesystem.FileStream;
        import flash.system.Capabilities;
        import flash.utils.ByteArray;
        import flash.utils.IDataInput;
        import flash.utils.getTimer;
        import ru.ppro.plagiatorpro.utils.arrayToVector;
        import ru.ppro.plagiatorpro.view.modalwindows.ModalWindowsManager;
 
        public class OSTools {
 
                public static const DOS_CYRILLIC:String = "cp866";
 
                public function OSTools() {
 
                }
                /**
                * Задает переменную среды в системе
                * @param        environmentVarName
                * @param        value
                */

                public static function setEnvironmentVariable(environmentVarName:String, value:String):void {
                        if (isWindows()) {
                                var envVarExecutable:File = null;
                                envVarExecutable                                                        = File.applicationStorageDirectory.resolvePath("envvarset.cmd");
                                var batContents:String                                                = "setx " + environmentVarName + " \"" + value.replace("\"", "") + "\"";                               
                                var fileStream:        FileStream                                        = new FileStream();
                                fileStream.open(envVarExecutable, FileMode.WRITE);
                                fileStream.writeMultiByte(batContents, DOS_CYRILLIC);
                                fileStream.close();
                                var envVarSetter:NativeProcess                                = new NativeProcess();
                                var startupInfo:NativeProcessStartupInfo        = new NativeProcessStartupInfo();
                                startupInfo.executable                                                = envVarExecutable;
                                try {
                                        envVarSetter.start(startupInfo);
                                } catch (err:Error) {
                                        killFile(envVarExecutable);
                                        ModalWindowsManager.instance.createWarningWindow(err.message);
                                }
                        }
                }
                public static function restartApplication():void {
 
 
                        var extenstion:        String        = "";
                        if (isWindows()) {
                                extenstion = ".exe";
                        } else if (isMacOS()) {
                                extenstion = ".app"
                        } else {
                                return;
                        }
 
                        try {
                                var appXML:                XML                        = NativeApplication.nativeApplication.applicationDescriptor;
                                var ns:                        Namespace                = appXML.namespace();
                                var fileName:        String                        = appXML.ns::filename + extenstion;
                                // экзешник для запуска приложения
                                var appFile:File  = File.applicationDirectory.resolvePath(fileName);
                                var appNSPI:NativeProcessStartupInfo = new NativeProcessStartupInfo()
                                appNSPI.executable = appFile; 
                                var appNP:NativeProcess = new NativeProcess()
                                appNP.start(appNSPI);
                                NativeApplication.nativeApplication.exit();
                        } catch (error:Error) {       
                                SettingsManager.log("----- ОШИБКА ПЕРЕЗАПУСКА -----");
                                SettingsManager.log(error.getStackTrace());
                                SettingsManager.log(appFile.nativePath);
                                SettingsManager.log("Native Process Support: " + NativeProcess.isSupported);
                                SettingsManager.log("\n OS: " + Capabilities.manufacturer);
                                ModalWindowsManager.instance.createWarningWindow(
                                        "Что-то пошло не так во время перезапуска программы! "
                                        + "Лог сохранен на рабочем столе"
                                );
                        }
                }
 
 
 
                private static function isWindows():Boolean {
                        return Capabilities.manufacturer.toLowerCase().indexOf("windows") > -1;
                }
                private static function isMacOS():Boolean {
                        return Capabilities.manufacturer.toLowerCase().indexOf("mac") > -1;
                }
                /**
                * Запрашивает у операционной системы значение переменной среды
                * @param        environmentVarName имя переменной, которую нужно получить
                * @param        onValueCallback метод с одним параметром типа String, в который будет передано
                * значение переенной, либо null
                */

                public static function getEnvirotnmentVariableValue(environmentVarName:String, onValueCallback:Function):void {
                        var envVarExecutable:File = null;
                        if (isWindows()) {
                                //trace("это винда");
                                envVarExecutable                        = File.applicationStorageDirectory.resolvePath("envvar.cmd");
                                var batContents:String                = "echo %" + environmentVarName + "%";
                                var fileStream:        FileStream        = new FileStream();
                                fileStream.open(envVarExecutable, FileMode.WRITE);
                                fileStream.writeMultiByte(batContents, DOS_CYRILLIC);
                                fileStream.close();
 
                                var envVarGetter:NativeProcess = new NativeProcess();
 
                                envVarGetter.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, function(e:ProgressEvent):void {
                                        // ошибка
                                        var standartOutput:IDataInput = (e.target as NativeProcess).standardError;
                                        var error:String = standartOutput.readMultiByte(standartOutput.bytesAvailable, DOS_CYRILLIC);
                                        ModalWindowsManager.instance.createWarningWindow("Произошла ошибка\nДанные записаны в log файл");
                                        SettingsManager.log(error);
                                        onValueCallback(null);
                                        killFile(envVarExecutable);
                                });
                                envVarGetter.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, function(e:ProgressEvent):void {
                                        var standartOutput:        IDataInput        = (e.target as NativeProcess).standardOutput;
                                        var output:String = standartOutput.readMultiByte(standartOutput.bytesAvailable, DOS_CYRILLIC);
                                        var presplit:Array = output.split("\n");
                                        if (presplit.length > 2) {
                                                var varValue:String = presplit[2];
                                                onValueCallback(varValue.replace(/[\r\n]+/g, ""));
                                                killFile(envVarExecutable);
                                        } else {
                                                onValueCallback(null);
                                                killFile(envVarExecutable);
                                        }
 
                                });
                                var startupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
                                startupInfo.executable = envVarExecutable;
 
                                try {
                                        envVarGetter.start(startupInfo);
                                } catch (err:Error) {
                                        onValueCallback(null);
                                        killFile(envVarExecutable);
                                        ModalWindowsManager.instance.createWarningWindow(err.message);
                                }
                        } else {
                                ModalWindowsManager.instance.createWarningWindow("Эта фича пока работает только в винде");
                                onValueCallback(null);
                                killFile(envVarExecutable);
                        }
                }
                /**
                * Запускает внешнее приложение с указанными аргументами
                * @param        applicationExecutablePath
                * @param        ...args
                */

 
 
                static public function startExternalApplication(applicationExecutablePath:String, ...args):void {
                        try {
                                var executable:File        = new File(applicationExecutablePath);
                                var startupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
                                startupInfo.executable        = executable;
                                startupInfo.arguments        = new Vector.<String>();
                                for (var i:int = 0; i < args.length; i++) {
                                        startupInfo.arguments.push(args[i]);
                                }
                                var nativeProcess:NativeProcess = new NativeProcess();
                                nativeProcess.start(startupInfo);
 
 
                        } catch (err:Error) {
                                ModalWindowsManager.instance.createWarningWindow("Не удалось запустить внешнее приложение, смотрите лог файл");
                                SettingsManager.log(">>> Ошибка запуска внешнего приложения >>>")
                                SettingsManager.log(err.message);
                                SettingsManager.log("<<< Ошибка запуска внешнего приложения <<<")
                        }
                }
 
 
 
 
 
                private static function killFile(file:File):void {
                        if (file && file.exists) {
                                file.deleteFile();
                        }
                }
        }
 
}

п.с. Все это будет работать только если в xml дескрипторе казать профиль extendedDesktop и собрать приложение в EXE
Цитата:

<supportedProfiles>extendedDesktop</supportedProfiles>

hotdes 26.07.2017 12:40

спасибо, попробую реализовать этот способ с помощью командной строки


Часовой пояс GMT +4, время: 00:27.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.