3

J'essaye de faire une application iPad/iPhone (avec MonoTouch) qui commence par vérifier la version actuelle par rapport à la dernière version rapportée par un service web personnalisé. Si l'application est obsolète, téléchargez les fichiers binaires de la nouvelle version depuis le service Web et remplacez le fichier en cours.Quelles sont les options pour créer une application iOS à mise à jour automatique avec MonoTouch?

L'application serait distribuée soit de manière ad-hoc, soit via un déploiement d'entreprise, de sorte qu'elle ne soit pas soumise à la validation d'Apple ou au système de gestion des versions de l'AppStore.

Je pensais faire deux applications, un bootstrapper et l'application réelle. Sous Windows, le programme d'amorçage utiliserait des opérations de fichiers simples pour remplacer l'application réelle mais sous iOS je ne suis pas sûr que ce soit possible et, si possible, je ne sais pas comment le faire. Donc, voici la question: qui est la "bonne" façon de faire une application de mise à jour automatique avec MonoTouch pour iOS?

Merci.


MISE À JOUR

On dirait que j'ai ce travail, au moins dans le simulateur. L'idée de base est d'implémenter un strict minimum dans le bootstrapper, comme la méthode Main(), et AppDelegate, puis utiliser la réflexion pour charger le contrôleur de navigation et tout le reste à partir d'un fichier binaire situé à l'extérieur du serait soumis à des opérations d'auto-mise à jour.

Voici le code bootstrapper:

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; 
     } 
    } 
} 

Code Real Application:

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); 
     } 
    } 
} 

Dans le simulateur, il affiche le "travail!" étiquette, j'espère juste fonctionner sur le vrai appareil aussi bien.


MISE A JOUR 2

L'approche ci-dessus ne fonctionne que dans le simulateur, sur l'appareil iOS, il se bloque sur Assembly.Load.

+0

Votre mise à jour ne fonctionnera pas sur les appareils iOS car elle ne sera pas en mesure de JITER l'assemblage que vous chargez. – poupou

+0

True, il se bloque sur Assembly.Load. –

Répondre

6

Vous ne pouvez pas faire cela - au moins ne pas remplacer les binaires exécutables depuis la signature du paquet (la mise à jour des données ne serait pas un problème, si elle se trouve en dehors du paquet d'application).

Cependant, vous pouvez toujours le faire (un droit chemin):

  • vérifie les mises à jour (par exemple en utilisant un service Web); et
  • aider les utilisateurs à mettre à jour (par exemple les informer) en fournissant des liens vers des mises à jour.

Cela peut être fait manuellement (à savoir par votre propre code) ou en utilisant le SDK TestFlight (cherchez In-App Mises à jour).

+0

Merci @poupou, je vais jeter un oeil à TestFlight. –

+0

+1 pour avoir mentionné TestFlight :) – Toastor

2

La réponse de Poupou couvre à peu près tout.

Je voudrais ajouter cependant que vous pouvez toujours configurer la fonctionnalité des applications à distance. Par exemple, l'application peut rechercher un fichier de configuration sur votre serveur, puis autoriser ou refuser l'accès à certaines fonctionnalités, en fonction de ce fichier.

Cela signifie bien sûr que toute fonctionnalité prévue pour une version planifiée doit déjà être incluse.

Il ne couvrira pas tous les cas d'utilisation, mais il vous permettra, par exemple, de maintenir une certaine fonctionnalité jusqu'à ce que chaque utilisateur ait installé le dernier binaire, afin que tout le monde ait accès à cette fonctionnalité en même temps .

Une autre approche consisterait à déplacer autant de fonctionnalités que possible dans des scripts, qui pourraient être échangés ou améliorés à tout moment. Cependant, beaucoup plus de travail serait nécessaire pour commencer de cette façon. Enfin, vous pouvez implémenter un mécanisme qui vérifie si une nouvelle version est disponible et qui désactive la plupart des fonctionnalités des applications (après une période de grâce, peut-être), pour forcer les utilisateurs à passer à la nouvelle version.

+0

Merci d'avoir répondu, @Toastor. –

Questions connexes