Andrey Butov
Andrey Butov

Reputation: 2279

Updating a BlackBerry application installed on a user's device

In a situation where a BlackBerry application is installed to a user's device via OTA (BIS), and that application has a "Check for updates" button, one simple approach would be to launch the browser with the address of the .jad file which would then present the user with the "You have version 1.0 installed, would you like to download and install version 1.1?" dialog. But even if there are no updates, the user would get the "You have 1.0, would you like to replace it with 1.0 dialog", which is a hassle and is meaningless.

Is there an better method for doing this in a more seamless manner? For example, are there accepted ways for the application to check the server for an update (with user's permission), inform the user if an update is available, and install the update OTA without going through the browser/jad/ota/replace/restart device loop?

Targeting RIM OS 4.1+

Thank you.

Upvotes: 0

Views: 798

Answers (2)

Marc Paradise
Marc Paradise

Reputation: 1939

A similar method but one that I find a bit better than Richard's thought above because the client does not need a hard-coded JAD path this way (important since JAD files may differ for different BB OS versions):

  1. create a simple web page (php, jsp, servlet, cgi, whatever) that accepts app name and current app version as input; if you need it, also include OS version in the input.

  2. This URL will be constructed by the client by obtaining the appropriate data (details below) and appending it to the known base URL.

  3. the web page will parse the information, and calculate the proper version to run.

    • Note that you might not need all of the information above: if you only have one downloadable version of your app, you would really only need the device to send the client software version and nothing else. The calculation of proper version can be a simple hard-coded check (if ($version != LATEST_VERSION)) or something more complex, involving lookup into a database or elsewhere.
  4. This page will output plain text, non-HTML. It will write three values, one per line:
    1. "y" if an update is required , "n" if not.
    2. The current-most version for this client to use. This is only necessary if you want the client to display it.
    3. the download URL for the correct JAD.
  5. The client application will parse that data, and if the first flag is "Y" will display message "The current version is (contents of second line). Would you like to update?" When update is selected, it will launch the URL provided in the third line.

Reference

Obtaining Application Version

import net.rim.device.api.system.ApplicationDescriptor;
... 
// Returns current app version in the format Major.Minor.Minor.Build, eg 1.5.1.123
String version = ApplicationDescriptor.currentApplicationDescriptor().getVersion();

Obtaining Hardware and Platform Info

import net.rim.device.api.system.ApplicationDescriptor;
... 
// Obtain the platform version string in the format A.B.C.DDD, eg 5.0.0.464
String softwareVersion = DeviceInfo.getSoftwareVersion(); 
// Obtain the hardware name: 
String hardwareName = DeviceInfo.getDeviceName();

Launch HTTP URL

import net.rim.blackberry.api.browser.Browser;

Browser.getDefaultSession().displayPage("http://example.com");

Read HTTP file

String url = "full/url/assembled/with/data/above"
// YOU assemble "url" value  - and include more error handling than is here in this sample: 
HttpConnection conn;
try {

    conn = ConnectionHelper.getHttpConnection(url);
    LineInputStream stream = new LineInputStream(conn.openInputStream());
    String lineOneYesNo = stream.readLine(true); 
    String lineTwoCurrentVersion = stream.readLine(true))
    String lineThreeDownloadURL = stream.readLine(true))
    // ***
    // * Parse the data above and handle as described.
    // ***
    return data;
} catch (IOException e) {
            // Add appropriate erorro handling here
    return;
}

getHttpConnection Implementation

public static HttpConnection getHttpConnection(String URL) throws IOException {
    HttpConnection c = null;
    StringBuffer conn = new StringBuffer(URL);

            // *** IMPORTANT *** 
            // YOU must define this method below, as it will append 
            // values to the connection string based on connection 
            // type (MDS, TCP, WIFI, WAP2, etc)
            //
    configureConnectionString(conn);

    c = (HttpConnection) Connector.open(conn.toString());
    int rc = c.getResponseCode();
    if (rc != HttpConnection.HTTP_OK) {
        throw new IOException("HTTP Error: " + rc);
    }
    return c;
}

Reference: Simple LineInputStream implementation

http://svn.bbssh.org/trunk/BBSSH_Common/src/org/bbssh/io/LineInputStream.java

Sample Input URL 1 This URL is constructed by the client and sent to the server:

http://example.com/versioncheck.do/app-name/hardware-name/os-version/app-version
e.g. http://example.com/versioncheck.do/MyApplication/Bold9000/5.0.466/1.5.1.0

Sample Input URL 2 Alternative format for the same thing:

http://example.com/versioncheck.php?appName=A&hardwareName=B&osVersion=C&appVersion=D
e.g. http://example.com/versioncheck.php?appName=?MyApplication&hardwareName=Bold9000?osVersion=5.0.466&appVersion=1.5.1.0

Sample Output

y
1.3.1.125
http://example.com/ota/5.0.0/MyApp.jad

Upvotes: 2

Richard
Richard

Reputation: 8920

One way would be to fetch the JAD file using an HTTP connection in your app, parse for the version available on the server and only launch the browser if there is a newer version available, or after additionally asking the user if the upgrade is desired.

There are elements of the API that would allow you to also fetch the COD file(s) and install the modules yourself, but that seems like just increasing potential bug space unless you really need to avoid using the Browser OTA install.

Upvotes: 2

Related Questions