在黑莓中升级自己的应用程序

时间:2014-01-23 12:27:03

标签: blackberry

首先,我想告诉你,我是blackeberry开发的新手。

不知怎的,我已经在BB 5.0.0及更高版本中开发了一个应用程序。

我有一个功能可以实现我可以从我的应用程序中下载BB应用程序(如.cod文件)并升级它。

升级的应用程序将保留在我的公司服务器上,当我调用我的服务器并找到升级版本时,我可以通过编程方式升级它。

我提到了this个链接,最初找到了引用here

无法使用上述解决方案完成此任务。 我认为上面的URL解决方案需要BB AppWorld作为中介或升级版本保存在BB App服务器上。

请让我知道我是否可以升级我的BB应用程序,通过执行一些代码来下载并替换它,而无需将其保留在BB App世界中,如果是,那么我是否可以通过上述链接实现此目的。

这在Android和J2ME中是可行的,在iOS中是不可能的,但不了解Blackberry。

编辑:

我实施了官方黑莓开发者网站中提供的安装程序应用程序代码并获得以下异常。检查我的日志。

{"FileSize":2338776,"FileName":"MyApp_3.0.1.cod","LatestBuild":"2","LatestVersion":"3.0.1","DownloadURL":"http://myserver.link/uploads/116/MyApp_3.0.1.cod"}
 0:08:38.025: MyApp is being upgraded to version 3.0.1
 0:10:31.509: [AppWorld] - 01/23 11:38:00    INFO  Updater run() Update check at: Thu Jan 23 11:38:00 GMT 2014      
 0:10:31.511: [AppWorld] - 01/23 11:38:00    DEBUG  AbstractDatabase readDatabase()      
 0:10:31.513: [AppWorld] - 01/23 11:38:00    DEBUG  Updater run() Updater Content Installs 5      
 0:10:31.516: [AppWorld] - 01/23 11:38:00    DEBUG  Connecting to: 80bba47723dae059a32abfff7844cea89fbb7bc1e90e3ed8159e626b8427aeac825047d8b3dbc418dbf3b04b6dfd17a6f063f3d7cd6a0ed860be0c9f81cf58f488916d58a1d5b3fc52f1806693b9f8179b9fc9de5643c62f2bf92f4945716455af200982fa
 0:10:31.518: 1618056b5bddb91f830ae1d11076db1ec2adb6      
 0:10:31.519: [AppWorld] - 01/23 11:38:00    DEBUG  Connection Method: DEVICE      
 0:10:31.940: [AppWorld] - 01/23 11:38:00    INFO  AppStoreConnection: HTTP 200 , Content-Length: 2497      
 0:10:31.942: [AppWorld] - 01/23 11:38:00    INFO  Appworld server reporting minimum version: 4.0.0.55 our local version is: 2.1.4.13      
 0:10:31.944: [AppWorld] - 01/23 11:38:00  22  ERROR  An error has occur while updating.  Updater load() id1  null  
 0:10:31.948: VM:PISVt=0,h=4d1e,id=d15a33128dfbb5d9
 0:10:31.949: VM:LNTDa=commit,t=1,p=net_rim_bb_appworld_updater,h=135
 0:10:31.951: [AppWorld] - 01/23 11:38:00  22  ERROR  An error has occur while updating.    null  
 0:10:31.954: VM:PISVt=0,h=4d1e,id=d15a33128dfbb5d9
 0:10:31.956: VM:LNTDa=commit,t=1,p=net_rim_bb_appworld_updater,h=135
 0:10:31.957: [AppWorld] - 01/23 11:38:00    INFO  Updater rescheduleUpdateTime() Attempting to schedule Next Update at Thu Jan 23 12:08:00 GMT 2014      
 0:10:31.959: AM: App net_rim_bb_appworld_updater is trying to schedule for time: 1390478880504
 0:10:31.960: AM: Scheduled net_rim_bb_appworld_updater for 1390478880000
 0:10:31.962: [AppWorld] - 01/23 11:38:00    INFO  AppWorld Updater Rescheduled @ Thu Jan 23 12:08:00 GMT 2014      
 0:10:31.971: Process net_rim_bb_appworld_updater(303) cleanup started
 0:10:31.972: Process net_rim_bb_appworld_updater(303) cleanup done
 0:10:38.055: Exception: java.io.InterruptedIOException: Local connection timed out after ~ 120000 downloading URL: http://myserver.link/uploads/116/MyApp_3.0.1.cod
 0:10:38.059: FD Back On
 0:10:38.061: Exception during install of MyApp java.lang.NullPointerException
 0:10:38.064: MyApp 3.0.1 failed to upgrade.
 0:10:38.117: FocusHistory: Focus gained; App net_rim_services_impl; Component net.rim.device.api.ui.component.ButtonField

更新

我在我的应用中为我的目的保留的安装程序代码:

CodeModuleGroup cmGroup = new CodeModuleGroup(appInfo.getModuleGroupName());
cmGroup.setFriendlyName(appInfo.getModuleGroupFriendlyName());
cmGroup.setVersion(appInfo.getVersion());   
cmGroup.setVendor(appInfo.getVendor());

//Download and save all of the cod files.
//for(int count = 0; count < numOfCods; ++count)
//{
    byte[] codData = downloadFile(appInfo.getDescriptorURL());

//  if (codData != null)
//  {
    //Create the new cod file.
    moduleHandles = CodeModuleManager.createNewModule(codData.length, codData, codData.length);

    //Save the module
    int result = CodeModuleManager.saveNewModule(moduleHandles, true);
    log("Result code :"+result);
    //Ensure that the cod file was saved.
    if (result != CodeModuleManager.CMM_OK && result != CodeModuleManager.CMM_OK_MODULE_OVERWRITTEN)
    {
            //The cod file was not saved.
        throw new Exception("Failed to save cod."+result);
    }

    //Add the CodeModule to the CodeModuleGroup.
    cmGroup.addModule(CodeModuleManager.getModuleName(moduleHandles));  

我得到的结果= 10是CodeModuleManager.CMM_HANDLE_INVALID,现在由于下一个条件抛出异常等等,现在我发现该文件实际上已经下载但是当它尝试保存时,int result = CodeModuleManager.saveNewModule(moduleHandles, true);在这一行,我得到CMM_HANDLE_INVALID。如果有人知道这个问题,请告诉我。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您引用了官方知识库文章:

Programmat​ically install and upgrade applicatio​ns

那篇文章说如下: 注意:应用程序无法自行升级。

因此,为了实现您想要的目标,您必须创建一个安装程序应用程序,如知识库文章中所述。

这意味着您必须在程序中从公司服务器下载所需的文件,因此您可能遇到常见的网络问题。我注意到您在另一个Thread中报告了超时问题作为注释。对于领域而言,抱歉,您可能需要花一些时间来使您的网络代码正常工作。

除此之外,您在其他链接中找到的选项和信息:

How to implement auto-update feature in blackberry

在我看来,对你的选择是一个非常完整的描述。

<强>更新

我已经浏览了您提供的日志,并找出了一条似乎相关的消息:

异常:java.io.InterruptedIOException:〜120000下载URL后本地连接超时:http://myserver.link/uploads/116/MyApp_3.0.1.cod

因此,您遇到网络错误或尝试检索该鳕鱼的问题。这是一个网络问题,根本与安装程序无关。我建议你弄清楚安装程序为什么试图引用该文件以及服务器没有提供它的原因。如果URL有效,则可能必须更新MIME参数,以便服务器知道.cod文件扩展名应被视为二进制文件。

进一步更新

您对所提供的代码进行了更改,包括删除对同一应用程序的多个cod文件的支持。我是否可以建议您使用提供的安装程序和代码测试下载代码,当您开始工作时,将工作代码固定到您的应用程序中。然后,如果您遇到问题,我们可以更轻松地重新创建和/或测​​试。

建议

而不是做所有这些,可能更好的是应用程序检查它是否是最新的,如果没有,不要启动,而是启动网页的浏览器,这是OTA下载的目前的申请。然后你需要维护的只是OTA URL - 应用程序可以检查jad以查看其中的版本是否与当前版本相同。您已经编写了有效执行此部分的代码,您可以将其固定到应用程序中,然后您将不需要安装程序。只是一个想法。