2011-10-04 57 views
3

我試圖製作一個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裝置上。

+0

您的更新無法在iOS設備上運行,因爲它無法將您正在加載的程序集進行批處理。 – poupou

+0

確實如此,它在Assembly.Load上崩潰。 –

回答

6

您不能這樣做 - 至少不能替換可執行文件,因爲軟件包已簽名(如果位於應用程序包之外,更新數據不會成爲問題)。

但是你仍然可以做(一個正確的方式):

  • 檢查更新(例如使用web服務);和
  • 通過提供更新鏈接幫助用戶更新(例如通知他們)。

這可以手動完成(即由自己的代碼)或通過使用TestFlight SDK(尋找應用程式更新)。

+0

謝謝@poupou,我會看看TestFlight。 –

+0

提及TestFlight的+1 :) – Toastor

2

Poupou的回答幾乎涵蓋了它。

但是,我想補充一點,您仍然可以在遠程配置配置應用程序功能。例如,應用程序可以檢查服務器上的配置文件,然後根據該文件允許或拒絕訪問某些功能。

這意味着當然任何用於計劃發佈的功能都必須已經包含在內。

它不會涵蓋所有使用情況,但它可以讓您持有某個功能,直到每個用戶都安裝了最新的二進制文件,這樣每個人都可以同時訪問該功能。

另一種方法是將盡可能多的功能轉換爲可隨時交換或增強的腳本。不過,以這種方式開始需要做更多的工作。

最後,您可以實施一種機制,檢查新版本是否可用,並停用大多數應用程序功能(也許在寬限期之後),強制用戶升級到新版本。

+0

感謝您的回答,@Toastor。 –

相關問題