Xamarin iOS - 应用程序初始化代码在哪里?

时间:2018-03-13 19:42:35

标签: ios xamarin xamarin.ios initialization

我正在构建一个使用Ninject(一个DI框架)的Xamarin iOS应用程序。我想知道在哪里放置加载模块的代码并进行应用程序类的初始化?

  • 我会把它放在应用程序的委托类中吗?
  • Main.cs班?
  • 在我的第一个ViewController类中(这是一个菜单视图,所以它真的没有感觉)?

最佳做法是什么?我似乎无法在谷歌上找到它。

3 个答案:

答案 0 :(得分:3)

由于在UIApplication构造期间创建/初始化UIApplication runloop这一事实,我会避免使用Main入口点作为全局应用程序启动点,因为应用程序的runloop不是可用。在此阶段调用任何iOS框架成员可能会导致奇怪的应用程序行为,崩溃,文件损坏等。

此时挂起(延迟)应用程序的任何初始化代码都会导致操作系统终止您的进程,并且不会发生任何外部崩溃报告。 Apple的崩溃报告将是非常通用的SIGABRT报告。

在UIApplication构建期间也会创建UIApplicationDelegate,并在FinishedLaunching,其runloop和application:didFinishLaunchingWithOptions:之后发送UIApplicationUIApplicationDelegate)委托方法构造,但在UIWindow和根VC之前,因此使它成为首选的委托覆盖。

答案 1 :(得分:1)

FinishedLaunching AppDelegate.cs方法肯定是一个地方,但在几个应用中,我需要之前已解决的依赖项,因为它们在FinishedLaunching中使用,所以我已经习惯了把它放在App.cs的Main方法中。

以下是使用Splat.Locator进行基本DI的应用的一个非常简单的示例:

public class App
{
    private static void Main(string[] args)
    {
        // Register platform-specific dependencies.
        RegisterDependencies();

        // Launch UI.
        UIApplication.Main(args, null, "AppDelegate");
    }

    private static void RegisterDependencies()
    {
        // Akavache secure cache encryption provider.
        var encryptionProvider = new KeystoreBackedEncryptionProvider(Akavache.BlobCache.TaskpoolScheduler, CacheManager.AppName, CacheManager.CacheName);
        Locator.CurrentMutable.RegisterConstant(encryptionProvider, typeof(Akavache.IEncryptionProvider));
    }
}

答案 2 :(得分:0)

AppDelegate通常是您放置任何应用启动代码的地方