Я пытаюсь создать приложение для iPad / iPhone (с MonoTouch), которое начинает с проверки текущей версии по сравнению с последней версией, о которой сообщает пользовательский веб-сервис. Если приложение устарело, оно должно загрузить двоичные файлы новой версии из веб-службы и заменить текущую.
Приложение будет распространяться либо в режиме ad-hoc, либо через корпоративное развертывание, поэтому оно не подлежит проверке Apple или системе управления версиями AppStore.
Я думал о создании двух приложений: загрузчика и реального приложения. В Windows загрузчик использовал бы простые файловые операции для замены реального приложения, но в iOS я не уверен, что это возможно, и, если возможно, я не знаю, как это сделать.
Итак, вот вопрос: , который является "правильным" способом создания самообновляющегося приложения с MonoTouch для 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);
}
}
}
В симуляторе отображается «Рабочая!» лейбл, я просто надеюсь работать на реальном устройстве.
<ч />
ОБНОВЛЕНИЕ 2
Вышеуказанный подход работает только в симуляторе, на устройстве iOS он падает на Assembly.Load.