2011-10-04 26 views
3

我试图制作一个iPad/iPhone应用程序(使用MonoTouch),它通过检查当前版本与自定义Web服务报告的最新版本开始。如果应用程序已过期,应从Web服务下载新版本的二进制文件并替换当前版本。使用MonoTouch制作自我更新的iOS应用程序有哪些选择?

该应用程序将通过临时或通过企业部署进行分发,因此不受Apple的验证或AppStore的版本控制系统的限制。

我正在考虑制作两个应用程序,一个引导程序和真正的应用程序。在Windows下,引导程序将使用简单的文件操作来替换实际的应用程序,但在iOS下我不太确定这是可能的,并且如果可能的话,我不知道该怎么做。

因此,这里的问题是:这是使用MonoTouch for iOS制作自我更新应用程序的“正确”方式

谢谢。


UPDATE

好像我已经得到了这个工作,至少在模拟器。

其基本思想是在引导程序中实现一个最小值,如Main()方法和AppDelegate,然后使用反射从位于应用程序包之外的二进制文件加载导航控制器和其他所有内容,将受自我更新操作。

这里的引导程序代码:

Main.cs

namespace Bootstrapper 
{ 
    public class Application 
    { 
     static void Main (string[] args) 
     { 
      UIApplication.Main (args,null,"AppDelegate"); 
     } 
    } 
} 

AppDelegate.cs

namespace Bootstrapper 
{ 
    [Register("AppDelegate")] 
    public class AppDelegate : UIApplicationDelegate 
    { 
     // Connect window and navigationController stuff 
     // ... 

     public override bool FinishedLaunching (UIApplication app, NSDictionary options) 
     { 
      Assembly asm = Assembly.LoadFile(@"/Users/sorincom/Projects/SelfUpdate/TheApp/bin/Debug/TheApp.dll"); 

      navigationController = (UINavigationController)Activator.CreateInstance(asm.GetType("TheApp.NavigationController")); 

      window.AddSubview (navigationController.View); 
      window.MakeKeyAndVisible(); 

      return true; 
     } 
    } 
} 

实际应用代码:

NavigationController.cs

namespace TheApp 
{ 
    [Register("NavigationController")] 
    public class NavigationController : UINavigationController 
    { 
     // Connect view stuff 
     // ... 

     // Constructors 
     // ... 

     void Initialize() 
     { 
      this.PushViewController(new HomeController(), true); 
     } 
    } 
} 

HomeController.cs

namespace TheApp 
{ 
    [Register("HomeController")] 
    public class HomeController : UIViewController 
    { 
     // Connect view stuff 
     // ... 

     // Constructors 
     // ... 

     void Initialize() 
     { 
      View = new UIView(); 

      var label = new UILabel(); 
      label.Frame = new System.Drawing.RectangleF(50f, 50f, 200f, 200f); 
      label.Text = "Working!"; 
      View.AddSubview(label); 
     } 
    } 
} 

在它显示的模拟器 “工作!”标签,我只是希望能够在真实设备上运行。


UPDATE 2

上述方法只能工作在模拟器,它崩溃上Assembly.Load iOS装置上。

+0

您的更新无法在iOS设备上运行,因为它无法将您正在加载的程序集进行批处理。 – poupou

+0

确实如此,它在Assembly.Load上崩溃。 –

回答

6

您不能这样做 - 至少不能替换可执行文件,因为软件包已签名(如果位于应用程序包之外,更新数据不会成为问题)。

但是你仍然可以做(一个正确的方式):

  • 检查更新(例如使用web服务);和
  • 通过提供更新链接帮助用户更新(例如通知他们)。

这可以手动完成(即由自己的代码)或通过使用TestFlight SDK(寻找应用程式更新)。

+0

谢谢@poupou,我会看看TestFlight。 –

+0

提及TestFlight的+1 :) – Toastor

2

Poupou的回答几乎涵盖了它。

但是,我想补充一点,您仍然可以在远程配置配置应用程序功能。例如,应用程序可以检查服务器上的配置文件,然后根据该文件允许或拒绝访问某些功能。

这意味着当然任何用于计划发布的功能都必须已经包含在内。

它不会涵盖所有使用情况,但它可以让您持有某个功能,直到每个用户都安装了最新的二进制文件,这样每个人都可以同时访问该功能。

另一种方法是将尽可能多的功能转换为可随时交换或增强的脚本。不过,以这种方式开始需要做更多的工作。

最后,您可以实施一种机制,检查新版本是否可用,并停用大多数应用程序功能(也许在宽限期之后),强制用户升级到新版本。

+0

感谢您的回答,@Toastor。 –

相关问题