【问题标题】:NSURLIsExcludedFromBackupKey crashes before iOS 5.1NSURLIsExcludedFromBackupKey 在 iOS 5.1 之前崩溃
【发布时间】:2012-05-25 00:33:24
【问题描述】:

像许多 iOS 开发人员一样,我在使用 NSURLIsExcludedFromBackupKey 时遇到了应用程序在 5.1 之前的系统上崩溃的问题。

很好地描述了如何评估此线程上此密钥的存在:

Use NSURLIsExcludedFromBackupKey without crashing on iOS 5.0

samvermette's cmets 中的一个说 iOS 模拟器中存在错误。

尽管如此,我在 Release 版本中遇到了同样的问题,即使在 2 个单独的应用程序中也是如此。 经过一番调查,我发现应用程序甚至在调用 main() 方法之前就崩溃了。这暗示我这与

NSString * const NSURLIsExcludedFromBackupKey;

应用程序启动时的评估。

我不是该领域的专家,但我发现,如果代码中出现对 const 值的任何引用(即使它实际上并未在运行时访问),则此 const 将在非常应用程序中进行评估发射。而这只会导致我们许多人都经历过的崩溃。

我想请你帮忙。也许您知道如何“弱”引用 const 值,或者可能有特定的编译器标志。 (使用 Apple LLVM 3.1)。

提前致谢。

请不要直接输入这个常量的值,在这种情况下是@"NSURLIsExcludedFromBackupKey"。我知道这种解决方法,这个故事的原因是找到一个通用的解决方案。

【问题讨论】:

标签: iphone objective-c ios crash icloud


【解决方案1】:

您可以在系统 上使用此代码

#include <sys/xattr.h>

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    const char* filePath = [[URL path] fileSystemRepresentation];

    const char* attrName = "com.apple.MobileBackup";
    u_int8_t attrValue = 1;

    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
    return result == 0;
}

阅读更多here

编辑

如果您只是询问如何检查外部常量的可用性,您可以将其地址与 NULL 或 nil 进行比较。这就是 recommended way 的做法。

if (&NSURLIsExcludedFromBackupKey) {
    // The const is available
}

【讨论】:

  • 请仔细阅读这里的问题。问题不在于如何在 iOS 5.1 之前将文件排除在 iCloud 上备份。
  • 感谢您的帮助,但这不是问题。正如我所描述的(并链接到其他故事),我知道此问题的已知解决方案。我描述的问题更多是关于应用程序启动时的常量评估,这会导致应用程序在启动时崩溃。 (发布版本)
  • 那么这是一个错误,我建议你提交一个 rdar。评估常量的地址不应导致崩溃。我没有看到您描述的将 5.1 作为 Base SDK 和 4.x/5.0 部署目标运行的问题。
  • 你必须在 iOS 5.1 之前运行它。我提出了错误 ID# 11494591。
  • 请注意,产生错误的唯一方法是制作一个存档(在发布中)并将其安装在手机上。 ...或将其提交到应用商店,然后在您的应用上查看愤怒的 cmets。
【解决方案2】:

我找到了解决方案,感谢https://stackoverflow.com/a/9620714/127493

NSString * const NSURLIsExcludedFromBackupKey;

不是弱链接,即使 Base SDK 设置为 iOS 5.1,不像 SDK Compatibility Guide 所说的那样。

诀窍是使用这个 const 的结果。
如果我这样做了

NSLog(@"%@", NSURLIsExcludedFromBackupKey);

结果是@"NSURLIsExcludedFromBackupKey"

所以我的结果代码是

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

NSError * error = nil;
BOOL success;
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.1")) {
    success = [storeURL setResourceValue:[NSNumber numberWithBool:YES] forKey:@"NSURLIsExcludedFromBackupKey" error:&error];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多