Author Archive: T. Ravi Kumar

Adobe AIR applications installation issue

This technote addresses the installation issue of Adobe AIR applications after 30th Oct 2017 that is signed with SHA1 certificate. It is applicable to both Windows and Mac.

Issue

When you install your AIR application, the installation fails with the below error. The error dialog is a generic installation failure message that could occur for various reasons. One of them is due to signature validation failure.

Who should use this solution?

If your developed AIR application fails to install after 30th Oct 2017.

Issue confirmation

Follow the steps below to verify if the signature validation failure is the cause of the installation failure:

  1. Open the application installation logs. The location of the log files for different platforms is mentioned in the article: https://helpx.adobe.com/air/kb/logging-air-2-desktop-application.html
  2. If the installation log contains the error: “Package signature validation failed”, it indicates that the application is signed with SHA1 certificate.
  3. Set your system date to a date prior to 30th Oct 2017, and try to install the application again. Successful installation confirms that your application is impacted by the signature validation issue.

Solution

You will have to re-sign your Adobe AIR application. Follow the steps below to re-sign your application:

  1. Rename your Adobe AIR application by changing its extension from .air to .zip. In case you don’t see the extension in the filename, enable the filename extension before renaming the application.
  2. Extract the .zip file renamed in Step 1.
  3. Go to the extracted folder and perform the following modifications (in the order specified):
    1. Move xml present inside META-INF\AIR\ folder to the root of the extracted folder.
    2. Delete “META-INF” folder.
    3. Delete “mimetype” file located in the root of the extracted folder.
  4. Download the latest AIR SDK for your platform from http://www.adobe.com/devnet/air/air-sdk-download.html.
  5. Locate the AIR SDK archive file downloaded in Step 4 and extract the AIR SDK Compiler (if on Windows) or mount the AIR SDK Compiler dmg (if on Mac).
  6. Open the command prompt and change the current working directory to the root directory of the extracted AIR application directory.
  7. Use the command below to re-package the AIR application with a new certificate:

<AIR_SDK_compiler_path>\bin\adt -package -storetype pkcs12 -keystore  <app_signing_certficate_path> myApp.air application.xml .

Command line parameters:

  1. AIR_SDK_compiler_path – Location of AIR SDK compiler extracted or mounted in Step 5.
  2. app_signing_certficate_path – Fully qualified path of your application signing certificate. Make sure you are using SHA256 certificate.
  3. myApp.air – Name of the application to be packaged.
  4. application.xml – The file that was moved in Step 3.A

When prompted, enter the password of your application signing certificate.

Note:
Do not ignore the . (dot) at the end of the packaging command above. It is used to package all the resources present in your existing application. For more details on packaging AIR applications, refer https://help.adobe.com/en_US/air/build/WS901d38e593cd1bac1e63e3d128cdca935b-8000.html.

Workaround

AIR applications with the above-mentioned issue can be installed using two methods.

Using keyboard shortcuts: 

Install the Adobe AIR Runtime

Steps to follow on Windows:

1. Go to C:\Program Files (x86)\Common Files\Adobe AIR\Versions\1.0

2. While holding the “Ctrl” key,  select the Adobe AIR Application Installer.exe -> Right click on it -> Run as Administrator. Do not take your finger off the “ctrl” key until you see the window open up.

3. Select and open the AIR application to be installed.

Steps to follow on Mac:

1. Go to /Applications/Utilities

2. While holding the “command” key,  double click on the Adobe AIR Application Installer.  Do not take your finger off the “command” key until you see the window open up.

3. Select and open the AIR application to be installed.

The Adobe AIR Application should be installed successfully.

Using the new -ignoreExpiredCertificateTimestamp directive while launching AIR Application installer using Command Prompt/Terminal

Install the Adobe AIR Runtime

Steps to follow on Windows:

1. Open a command prompt as Administrator.

2. Run the following command:

“C:\Program Files (x86)\Common Files\Adobe AIR\Versions\1.0\Adobe AIR Application Installer.exe” – ignoreExpiredCertificateTimestamp

3. Window opens up.

4. Select and open the AIR application to be installed.

Steps to follow on Mac:

1. Open Terminal.

2. Run the following command:

/Applications/Utilities/Adobe\ AIR\ Application\ Installer.app/Contents/MacOS/Adobe\ AIR\ Application\ Installer/ -ignoreExpiredCertificateTimestamp

3. Window opens up.

4. Select the AIR application to be installed.

Adobe AIR Applications gets installed successfully.

Feathers 3.2

Congratulations to Josh Tynjala and the Feathers open source project for the release of Feathers 3.2. Feathers offers a large collection of ActionScript user interface components and layouts for mobile and desktop. It is powered by both Starling Framework and Adobe AIR.

What’s new in this release?

In version 3.2.0, Feathers UI includes a new PullToRefresh example, a new swipe gesture for TabNavigator, real time collection filtering, and support for asynchronous texture uploads with the ImageLoader component.

Collection filtering

The new filterFunction property in the ListCollection class makes it possible to filter data in real time. To illustrate this functionality, let us create a quick example that uses a TextInput component to filter the items in a List component.

Firstly, we will create the List and TextInput. Then we will populate the ListCollection with some data:

var data:Array =
[
	{ label: "Apple" },
	{ label: "Banana" },
	{ label: "Cherry" },
	{ label: "Grape" },
	{ label: "Lemon" },
	{ label: "Peach" },
	{ label: "Strawberry" },
	{ label: "Watermelon" },
];
var collection:ListCollection = new ListCollection(data);

var list:List = new List();
list.dataProvider = collection;
this.addChild(list);

var input:TextInput = new TextInput();
this.addChild(input);

Now, we would like to filter the items displayed in the List when the TextInput is modified. To accomplish this, we will listen for Event.CHANGE and modify the filterFunction property:

input.addEventListener(Event.CHANGE, function():void
{
   if(input.text.length === 0)
   {
       collection.filterFunction = null;
       return;
   }
   collection.filterFunction = function(item:Object):Boolean
   {
       var itemText:String = item.label.toLowerCase();
       var filterText:String = input.text.toLowerCase();
       return itemText.indexOf( filterText ) >= 0;
   };
});

The filterFunction is called for each item in the ListCollection. If it returns true, the item is displayed and if it returns false, the item is hidden.

Get started with Feathers 3.2.0

You can find the Feathers UI 3.2.0 release notes on the project’s Github page. Developers are encouraged to download the latest stable build from the Feathers website.