我试图制作一个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装置上。
您的更新无法在iOS设备上运行,因为它无法将您正在加载的程序集进行批处理。 – poupou
确实如此,它在Assembly.Load上崩溃。 –