我正在尝试使用Xcode上的基本SenTest框架来测试读取和更改钥匙串的代码.代码在设备上工作正常,但是当我开始测试时,每次我想用SecItemDelete/ SecItemAdd/ etc 触摸钥匙串时都会出现这些错误.
The operation couldn’t be completed. (OSStatus error -34018 - client has neither application-identifier nor keychain-access-groups entitlements)
我iOS Team Provisioning Profile: *为构建目标和测试目标配备了通配符配置文件().
这些(未经证实的)堆栈溢出答案:
从钥匙串中读取结果为errSecItemNotFound 25300
假设我每次使用钥匙串时都需要一个与我的应用程序标识符匹配的配置文件,但这可能不对,或者我会在测试目标之外得到相同的错误.
更深入地挖掘(未经证实的)答案:
SecItemAdd和SecItemCopyMatching返回错误代码-34018(errSecMissingEntitlement)
意味着钥匙链中可能存在一个错误,更普遍的Security.framework是,坦率地说这是一个可怕的错误.
我的问题是; 有没有人只有当他们在测试目标上时才会遇到OSStatus错误-34018 ?这似乎是我所看到的行为.
编辑:添加JorgeDeCorte在下面的答案中使用的答案.
如果问题在您的单元测试目标中退出,则此线程似乎包含解决方案.
https://devforums.apple.com/message/917498#917498
基本上,您必须通过在测试目标中添加以下作为运行脚本来对.xcttest文件夹进行编码.
codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"在设备上测试我的钥匙串时,我收到了很多-34018错误,并设法解决了这个问题.
如果您的测试目标中不存在该问题,则可能不是解决方案.
所以我猜解决方案是:强制签署您的测试目标.
我在一个只在SenTestCase对象中测试时似乎崩溃的函数遇到了麻烦.
我要做的是从NSData对象获取base64-Encoded String(实际上是一个序列化的JSON字典).
在下面的代码中实际发生的是NSJSONSerialization创建一个NSConcreteData对象然后崩溃 [dataFromDictionary base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]
返回的崩溃是test failure: -[NSConcreteData base64EncodedStringWithOptions:]: unrecognized selector sent to instance.
(in my SenTestCase implementation)
-(NSString *)paramsAsString {
NSDictionary *storedParams = @{@"stringKeyTest":@"testValueString", @"dictionaryKeyTest":@{@"testDictKey":@"testDictValue"}, @"numberKeyTest":@1 };
NSError *error = nil;
BOOL paramCheck = [NSJSONSerialization isValidJSONObject:storedParams];
//paramCheck is true
NSData *dataFromDictionary = [NSJSONSerialization dataWithJSONObject:storedParams options:0 error:&error];
//dataFromDictionary is actually NSConcreteData
NSString *stringFromData = [dataFromDictionary base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
//should stringify NSData, actually crashes
return stringFromData; //never reached
}
Run Code Online (Sandbox Code Playgroud)
我一直在谷歌搜索和堆栈溢出,我的测试目标可能有一个依赖项或标头丢失.我只是无法理解那是什么.这些都不是基金会框架功能吗?
在-all-load和-ObjC标志也都在目标设定,发生同样的错误.
更新: 在写这篇文章时,我找到了这个bug的解决方案.保留这篇帖子给后人,以防我找到了一个不理想的解决方案.
原来SenTest是一个红鲱鱼.导致问题的实际原因是构建目标(在测试模拟器中为6.1,在我的开发设备上为7.0)实际上无法访问新制作的公共iOS 7的方法.
我在文档中遇到了这个 …
我有一个我想调试的方法:
-(void)doAThingWithObject:(BaseDataObject *)dataObject //called VERY often
Run Code Online (Sandbox Code Playgroud)
我在这个方法中有一个Xcode断点,我只希望在BaseDataObject的某个子类上断点,所以我添加一个带有条件的断点来检查该类:
[dataObject isKindOfClass:[SubClassOfBaseDataObject class]]
但是,这样做会导致解析错误!
Stopped due to an error evaluating condition of breakpoint 11.1: "[dataObject isKindOfClass:[SubClassOfBaseDataObject class]]"
Couldn't parse conditional expression:
error: no known method '+class'; cast the message send to the method's return type
error: 1 errors parsing expression
Run Code Online (Sandbox Code Playgroud)
我已确保导入文件中的所有类,但调试器不知道我在条件中引用了哪个类.
但是,在断点之前的方法内创建所述Class的临时变量:
Class subClassCheck = [SubClassOfBaseDataObject class];
Run Code Online (Sandbox Code Playgroud)
并更新断点条件以引用临时变量:
[dataObject isKindOfClass:subClassCheck]
Run Code Online (Sandbox Code Playgroud)
没有错误.
对于断点条件,我有点新手,有人可以解释为什么我的第一种方法不起作用吗?