Какие есть варианты для создания самообновляющегося приложения iOS с MonoTouch? - PullRequest
3 голосов
/ 04 октября 2011

Я пытаюсь создать приложение для iPad / iPhone (с MonoTouch), которое начинает с проверки текущей версии по сравнению с последней версией, о которой сообщает пользовательский веб-сервис. Если приложение устарело, оно должно загрузить двоичные файлы новой версии из веб-службы и заменить текущую.

Приложение будет распространяться либо в режиме ad-hoc, либо через корпоративное развертывание, поэтому оно не подлежит проверке Apple или системе управления версиями AppStore.

Я думал о создании двух приложений: загрузчика и реального приложения. В Windows загрузчик использовал бы простые файловые операции для замены реального приложения, но в iOS я не уверен, что это возможно, и, если возможно, я не знаю, как это сделать.

Итак, вот вопрос: , который является "правильным" способом создания самообновляющегося приложения с MonoTouch для 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);
        }
    }
}

В симуляторе отображается «Рабочая!» лейбл, я просто надеюсь работать на реальном устройстве.

<ч />

ОБНОВЛЕНИЕ 2

Вышеуказанный подход работает только в симуляторе, на устройстве iOS он падает на Assembly.Load.

Ответы [ 2 ]

6 голосов
/ 04 октября 2011

Вы не можете сделать это - по крайней мере, не заменяйте исполняемые двоичные файлы, так как пакет подписан (обновление данных не будет проблемой, если находится за пределами пакета приложения).

Однако вы все еще можете сделать( a правильный путь):

  • проверка обновлений (например, с помощью веб-службы);и
  • помогают пользователям обновлять (например, уведомлять их), предоставляя ссылки на обновления.

Это можно сделать вручную (т. е. с помощью собственного кода) или с помощью TestFlight SDK (ищите Обновления в приложении ).

2 голосов
/ 04 октября 2011

Ответ Пупу в значительной степени охватывает его.

Я хотел бы добавить, что вы все еще можете настроить функциональность приложений удаленно. Например, приложение может проверить файл конфигурации на вашем сервере, а затем разрешить или запретить доступ к некоторым функциям, в соответствии с этим файлом.

Это, конечно, означает, что любые функции, предназначенные для запланированного выпуска, должны быть уже включены.

Он не охватывает все случаи использования, но позволит вам, например, удерживать определенную функцию до тех пор, пока каждый пользователь не установит последнюю версию двоичного файла, так что всем будет предоставлен доступ к этой функции одновременно.

Другим подходом было бы перенести как можно больше функциональных возможностей в сценарии, которые можно в любое время обменивать или улучшать. Однако для начала работы потребуется гораздо больше работы.

Наконец, вы могли бы реализовать механизм, который проверяет, доступна ли новая версия и деактивирует ли большинство функций приложений (возможно, по истечении льготного периода), чтобы заставить пользователей обновиться до новой версии.

...