現在のバージョンとカスタムWebサービスによって報告された最新バージョンをチェックすることから始まるiPad/iPhoneアプリケーション(MonoTouchを使用)を作成しようとしています。アプリケーションが古くなっている場合は、Webサービスから新しいバージョンのバイナリをダウンロードして、現在のバイナリを置き換える必要があります。
アプリケーションはアドホックまたはエンタープライズ展開を介して配布されるため、Appleの検証やAppStoreのバージョン管理システムの対象にはなりません。
ブートストラッパーと実際のアプリケーションの2つのアプリケーションを作成することを考えていました。Windowsでは、ブートストラッパーは単純なファイル操作を使用して実際のアプリケーションを置き換えますが、iOSでは、これが可能かどうかはわかりません。可能であれば、その方法もわかりません。
それで、ここに質問があります:iOS用のMonoTouchで自己更新アプリケーションを作成するための「正しい」方法はどれですか?
ありがとう。
アップデート
少なくともシミュレーターでは、これが機能しているようです。
基本的な考え方は、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);
}
}
}
シミュレーターでは、「Working!」と表示されます。ラベル、私は実際のデバイスでも機能したいと思っています。
更新2
上記のアプローチはシミュレーターでのみ機能し、iOSデバイスではAssembly.Loadでクラッシュします。