我正在尝试制作一个 iPad/iPhone 应用程序(使用 MonoTouch),它首先检查当前版本与自定义 Web 服务报告的最新版本。如果应用程序已过期,则应从 Web 服务下载新版本的二进制文件并替换当前版本。
该应用程序将通过临时或通过企业部署分发,因此它不受 Apple 的验证或 AppStore 的版本控制系统的约束。
我正在考虑制作两个应用程序,一个引导程序和一个真正的应用程序。在 Windows 下,引导程序将使用简单的文件操作来替换真实的应用程序,但在 iOS 下我不太确定这是否可行,如果可能的话,我不知道该怎么做。
那么,问题来了:使用 MonoTouch for iOS 制作自更新应用程序的“正确”方式是什么?
谢谢。
更新
似乎我已经完成了这项工作,至少在模拟器中。
基本思想是在引导程序中实现最低限度,如 Main() 方法和 AppDelegate,然后使用反射从位于应用程序包之外的二进制文件中加载导航控制器和其他所有内容,这将受到自我更新操作。
这是引导程序代码:
主文件
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;
}
}
}
真实应用代码:
导航控制器.cs
namespace TheApp
{
[Register("NavigationController")]
public class NavigationController : UINavigationController
{
// Connect view stuff
// ...
// Constructors
// ...
void Initialize ()
{
this.PushViewController(new HomeController(), true);
}
}
}
家庭控制器.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);
}
}
}
在模拟器中,它显示“正在工作!” 标签,我只是希望在真实设备上也能正常工作。
更新 2
上述方法仅适用于模拟器,在 iOS 设备上它会在 Assembly.Load 上崩溃。