2012-02-28 142 views
3

我似乎无法从钥匙串中获取价值,因为它始终返回ItemNotFound。我正在使用的代码如下:MonoTouch无法获取现有钥匙扣项目的价值

private static Guid GetID() 
    {   
     Guid returnGuid = Guid.Empty; 
     SecStatusCode code; 
     SecRecord queryRec = new SecRecord (SecKind.GenericPassword) { Service = KEYCHAIN_SERVICE, Label = KEYCHAIN_SERVICE, Account = KEYCHAIN_ACCOUNT }; 
     queryRec = SecKeyChain.QueryAsRecord (queryRec, out code); 

     if (code == SecStatusCode.Success && queryRec != null && queryRec.Generic != null) 
     { 
      returnGuid = new Guid(NSString.FromData(queryRec.Generic, NSStringEncoding.UTF8)); 
     } 

     return returnGuid; 

    } 

当我尝试设置与下面的代码返回DuplicateItem值:

private static SecStatusCode SetID (Guid setID) 
    {   
     SecStatusCode code = SecKeyChain.Add (new SecRecord (SecKind.GenericPassword) { 
      Service = KEYCHAIN_SERVICE, 
      Label = KEYCHAIN_SERVICE, 
      Account = KEYCHAIN_ACCOUNT, 
      Generic = NSData.FromString(Convert.ToString(setID), NSStringEncoding.UTF8), 
      Accessible = SecAccessible.Always 
     }); 

     return code; 
    } 

任何帮助将是巨大的!

回答

3

我将你的代码复制粘贴到Touch.Unit解决方案中,它可以在模拟器和设备上工作。

[Test] 
    public void CheckId() 
    { 
     Guid g = Guid.NewGuid(); 
     SetID (g); 
     Assert.That (g, Is.EqualTo (GetID()), "same guid"); 
    } 

我不得不改变的唯一的事是你KEYCHAIN_*常数为字符串,我保留了相同的值(即刚添加引号)。

现在,如果你执行代码第二时间,你会得到DuplicateItem错误代码,因为SetID正试图重新设置相同项目,当你查询Guid你会得到的第一个 - 导致错误。

您有两种选择,删除现有项目或更新它。例如。删除一个现有的项目...

static SecStatusCode SetID (Guid setID) 
    { 
     SecRecord queryRec = new SecRecord (SecKind.GenericPassword) { 
      Service = "KEYCHAIN_SERVICE", 
      Label = "KEYCHAIN_SERVICE", 
      Account = "KEYCHAIN_ACCOUNT" 
     }; 
     var record = new SecRecord (SecKind.GenericPassword) { 
      Service = "KEYCHAIN_SERVICE", 
      Label = "KEYCHAIN_SERVICE", 
      Account = "KEYCHAIN_ACCOUNT", 
      Generic = NSData.FromString (Convert.ToString (setID), NSStringEncoding.UTF8), 
      Accessible = SecAccessible.Always 
     }; 
     SecStatusCode code = SecKeyChain.Add (record); 
     if (code == SecStatusCode.DuplicateItem) { 
      code = SecKeyChain.Remove (queryRec); 
      if (code == SecStatusCode.Success) 
       code = SecKeyChain.Add (record); 
     } 
     return code; 
    } 

注:我从来没有得到一个ItemNotFound,而测试这一点。

+1

这真的很奇怪,我试过删除重复的密钥代码,它带着“ItemNotFound”返回,所以我不能删除它并且无法读取它。我会尝试改变我的常量,因此它寻找一个新的钥匙串,看看它修复。一旦我测试过,会更新。 – 2012-02-28 14:11:25

+0

奇怪的是它必须有一个错误的keychain,或者如果我改变我的常量,它现在工作正常,令人沮丧。我已经标记了你的正确,谢谢你的帮助。 – 2012-02-28 14:14:48