我試圖製作一個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上崩潰。 –