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.
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
True, il se bloque sur Assembly.Load. –