【问题标题】:issue with keychain and updates from app store钥匙串问题和应用商店的更新
【发布时间】:2012-07-07 23:51:34
【问题描述】:

我遇到了一个非常令人沮丧的错误。我已经通过首先安装以前的版本 (1.0.1) 然后运行版本 (1.0.2) 来测试应用程序升级。一切正常。我提交了应用程序,然后我遇到了人们在升级时遇到崩溃的问题。我尝试做同样的事情,安装 1.0.1,然后在应用商店安装二进制文件,然后它崩溃了。我查看了控制台和崩溃日志,我得到了这个:

Jul  7 08:07:45 unknown MyApp[1429] <Warning>: KeychainUtils keychainValueForKey: - Error finding keychain value for key. Status code = -25300
Jul  7 08:07:45 unknown MyApp[1429] <Warning>: AccountSession readUserDataFromDisk - Error finding keychain value for key /var/mobile/Applications/997B32E7-6FFC-4696-9CAA-129BADE2FE64/Documents/instagram_json
Jul  7 08:07:45 unknown MyApp[1429] <Warning>: UISegmentedControlStyleBezeled is deprecated. Please use a different style.
Jul  7 08:07:45 unknown MyApp[1429] <Error>: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: username)'
    *** First throw call stack:
    (0x33ee688f 0x367e7259 0x33ee6789 0x33ee67ab 0x33e5368b 0x14fd99 0x152319 0x1530bb 0x170299 0x3270ec59 0x32711817 0x354e7dfb 0x354e7cd0)
Jul  7 08:07:45 unknown UIKitApplication:com.firesnakelabs.pinstagram[0x14e4][1429] <Notice>: terminate called throwing an exception
> 

更新:

我想我知道问题出在哪里,升级时它正在寻找的文件路径位于:

/var/mobile/Applications/997B32E7-6FFC-4696-9CAA-129BADE2FE64/Documents/instagram_json

在升级 (v1.0.1) 之前,钥匙串的文件路径位于:

/var/mobile/Applications/CEE344F7-4FE1-4455-BD6D-A4D6EAA4F5FE/Documents/instagram_json

因此它在钥匙串上找不到钥匙 现在这是我确定文件路径的方法:

- (NSString *)filePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@_json", self.identifier]];
    return filePath;
}

我只是走我找到的第一条路。那么如何让路径在升级前后或一直保持一致呢?

我基本上使用filePath作为钥匙串名称:

[attributesDictionary setObject:filePath forKey:(id)kSecAttrAccount]; // Use the key as the account name

【问题讨论】:

    标签: iphone objective-c ios ipad keychain


    【解决方案1】:

    您的问题并不完全清楚,但听起来其中一个构建是临时分布式构建,另一个是应用商店签名的二进制文件。如果是这种情况,两者将具有不同的钥匙串值。钥匙串链接到应用的签名,这两种机制不同。

    【讨论】:

    • 啊..我明白了..那么我该如何测试这种情况呢?如何使用应用商店签名的二进制文件进行测试?
    • 我做了两件事:我使用临时版本测试升级。这是最简单的。我做的另一件事是保留已批准的二进制文件以供开发人员发布,然后在发布之前将其与促销代码一起下载。促销代码不服从开发者持有。
    • 所以您是说您不会立即发布该应用程序,而是在发布它进行测试之前使用促销代码下载它?但是,我如何从应用商店获取以前的版本?
    • 第一个是的。在您发布新版本之前,旧版本在应用商店中可用。像往常一样下载它。
    • FWIW,我认为我的 cmets 能够使用促销来测试开发人员持有的应用程序是错误的。这个想法在您第一次发布具有遥远未来发布日期的应用程序时有效:您可以在发布日期之前为应用程序生成促销,并且使用促销不会遵守发布日期限制。但是,您不能使用该方法测试开发者保留的版本:在您释放保留之前,您无法生成促销,并且之前版本的任何促销只需下载之前的版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多