tags:

views:

102

answers:

2

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.

+2  A: 

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.

Richard
Could you possibly provide a code sample for this? Sorry i'm very new to Blackberry Development and I know that at some point I will need to do this
Chris
The short answer is no. The reason that is the answer is that there are enough variables in methods to connect (BES, BIS-B, APN), and application type that it is, in the end, better for you to learn how to do each step and then put it together with your application in a way that makes sense. If you are very new to Blackberry Development, then you probably want to put this part of your application aside until you are better prepared.
Richard
+2  A: 

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
Marc Paradise
Drat - somehow this showed up as a current item for me.. didn't realize it was from a year ago :( Ah, well, it's still useful information; hopefully somebody else will find it down the road.
Marc Paradise
We, in fact, did implement a system quite similar to the one you described.
Andrey Butov
Cool; in the end, it just seems the least painful way to manage it - especially when you get to the point that you have multiple BB configuration/builds to manage deployment binaries for.
Marc Paradise