C# 在Xamarin.Android/Xamarin.iOS中使用Akavache

C# 在Xamarin.Android/Xamarin.iOS中使用Akavache,c#,xamarin.ios,xamarin.android,xamarin,C#,Xamarin.ios,Xamarin.android,Xamarin,我已经成功地为Windows桌面、.NET 4.5 WPF项目工作,但是当我尝试为Xamarin(iOS和Android)目标构建它时,BlobCachesingleton没有正确初始化BlobCache.Secure为空。(我已经尝试过SQLite和“香草”版本) 老实说,我觉得Akavache的示例/文档有点单薄。我不是被动的用户,我发现Paul的很多代码都非常不透明 我只是想为一个跨平台的应用程序做一些非常简单、安全的应用程序状态缓存 // where we store the user'

我已经成功地为Windows桌面、.NET 4.5 WPF项目工作,但是当我尝试为Xamarin(iOS和Android)目标构建它时,
BlobCache
singleton没有正确初始化
BlobCache.Secure
为空。(我已经尝试过SQLite和“香草”版本)

老实说,我觉得Akavache的示例/文档有点单薄。我不是被动的用户,我发现Paul的很多代码都非常不透明

我只是想为一个跨平台的应用程序做一些非常简单、安全的应用程序状态缓存

// where we store the user's application state
BlobCache.ApplicationName = "myApp";
BlobCache.EnsureInitialized();

public AppState State
{
    get
    {
        return _appState;
    }
    set
    {
        _appState = value;
    }
}

public void Load()
{
    try
    {
        State = BlobCache.Secure.GetObjectAsync<AppState>.FirstOrDefault();
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.ToString());
        State = new AppState();
    }           
}

public void Save()
{
    try
    {           
        BlobCache.Secure.InsertObject("AppState", State);
    }
    catch(Exception ex)
    {
        Debug.WriteLine(ex.ToString());
    }
}
//存储用户应用程序状态的位置
BlobCache.ApplicationName=“myApp”;
BlobCache.ensureReinitialized();
公共应用程序状态
{
得到
{
返回appState;
}
设置
{
_appState=值;
}
}
公共空荷载()
{
尝试
{
State=BlobCache.Secure.GetObjectAsync.FirstOrDefault();
}
捕获(例外情况除外)
{
Debug.WriteLine(例如ToString());
State=新的AppState();
}           
}
公共作废保存()
{
尝试
{           
BlobCache.Secure.InsertObject(“AppState”,State);
}
捕获(例外情况除外)
{
Debug.WriteLine(例如ToString());
}
}

所以,我最近才发现,你现在必须在Xamarin上玩一些愚蠢的把戏。我将把这些添加到文档中(或者在Android的情况下,只需修复bug)

沙马林 在iOS上,
Type.GetType()
不会加载程序集,这与任何其他平台不同。因此,您必须在AppDelegate中运行以下愚蠢的代码:

var r = new ModernDependencyResolver();
(new ReactiveUI.Registrations()).Register((f,t) => r.Register(f, t));
(new ReactiveUI.Cocoa.Registrations()).Register((f,t) => r.Register(f, t));
(new ReactiveUI.Mobile.Registrations()).Register((f,t) => r.Register(f, t));

RxApp.DependencyResolver = r;
(new Akavache.Registrations()).Register(r.Register);
(new Akavache.Mobile.Registrations()).Register(r.Register);
(new Akavache.Sqlite3.Registrations()).Register(r.Register);
通常,此代码自动运行™.

泽马林,安卓 在Xamarin.Android上注册很好,但由于我怀疑Akavache中有一个bug,您可能必须注册AutoSuspend(即使您不使用它)

  • 在所有活动中,声明
    AutoSuspendActivityHelper autoSuspendHelper
  • 在构造函数中,添加:

    autoSuspendHelper = new AutoSuspendActivityHelper(this);
    autoSuspendHelper.OnCreate(bundle);
    
  • 覆盖暂停时的
    OnPause
    OnResume
    和保存时的
    OnSaveInstanceState
    并调用相应的
    autoSuspendHelper
    方法,即:

    autoSuspendHelper.OnPause();
    
  • 更多的麻烦?
    请让我知道,或者发电子邮件给我paul@github.com或在网站上提交问题。我已经发布了一个带有Akavache的生产应用程序,可以在iOS和Android上运行,它肯定可以工作,但我意识到这可能有点棘手™ 让工作顺利进行。

    保罗是谁?但是,当我查看“移动”解决方案的
    注册文件时,我不是Akavache用户。与“便携式”和桌面版相比,它没有为ISecureBlobCache注册任何内容,而这两种版本都有。这可能就是问题所在。paulcbetts是作者。谢谢你的提示,我会看看是否能让“便携”版本正常工作。不要使用
    FirstOrDefault
    ,使用
    wait
    并将你的方法标记为异步,就像自述文件中的代码一样