由于无法重现的崩溃,Apple 拒绝了应用程序

Posted

技术标签:

【中文标题】由于无法重现的崩溃,Apple 拒绝了应用程序【英文标题】:Apple rejected app due to a crash which is not reproducing 【发布时间】:2012-05-07 23:49:32 【问题描述】:

Apple 提供了崩溃日志,其中解释了遇到的异常和原因如下:

异常类型:EXC_CRASH (SIGABRT) 异常代码:0x00000000、0x00000000 崩溃的线程:0 应用特定信息: * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFData dataUsingEncoding:]:无法识别的选择器发送到实例 0x1b4c20”

以下是在符号化崩溃日志后突出显示为崩溃原因的代码行

NSXMLParser *moveParser = [[NSXMLParser alloc] initWithData:[str_response dataUsingEncoding:NSUTF8StringEncoding]];

[[UAirship shared] registerDeviceToken:[deviceToken dataUsingEncoding:NSUTF8StringEncoding] withAlias:myAlias];

Apple 已在 ios 5.1 版 iPhone 4 和 iPad 3G 上审查了此应用程序,每次都发生崩溃。而我们无法在任何平台上重现崩溃。 我们尝试在 iPhone4、iOS 5.1 的 iPhone 3GS、iOS 5.0 的 iPhone 3GS、iOS 4.3.2 的 iPhone 3GS 上进行调试,但没有产生崩溃。

谁能告诉我我使用的代码有什么问题?

这是编写这些行的代码块。

NSString *str_response=(NSString *)[dic objectForKey:SuccessKey];
NSXMLParser *moveParser = [[NSXMLParser alloc] initWithData:[str_response dataUsingEncoding:NSUTF8StringEncoding]];
moveParser.delegate = self;
[moveParser parse];
[moveParser release];

NSString *deviceToken=[[NSUserDefaults standardUserDefaults] objectForKey:@"devToken"];
[[UAirship shared] registerDeviceToken:[deviceToken dataUsingEncoding:NSUTF8StringEncoding] withAlias:myAlias];

【问题讨论】:

不确定是否有帮助,但这一行:-[__NSCFData dataUsingEncoding:]: unrecognized selector 建议您在已经是 NSData 对象的对象上调用“dataUsingEncoding:”。我会检查是否有某种方式可能发生这种情况。 “deviceToken”和“str_response”应该是字符串,对吧?他们被分配到哪里?他们能在某个时候成为 NSData 吗? 只是一个愚蠢的问题,但它发生在我身上一次,您是否尝试使用发布版本重现此问题? 是的,我已经尝试过 Adhoc/release 构建和调试构建,但无法重现。 【参考方案1】:

这可能与plist(用户默认容器)有关。如果未设置standardUserDefaults 中的devToken(为空或不存在plist 文件),您尝试注册deviceToken,它可能是NIL。尝试删除 Preferences 文件夹中的所有 plist,您可能会重现崩溃。

要解决这个问题,您应该检查deviceToken 是否为NIL。如果不是:registerDeviceToken,否则创建空令牌等。

【讨论】:

我尝试在设备令牌字符串和 str_response 字符串中显式传递 nil,但它没有崩溃。【参考方案2】:

我认为,这是一个明显的内存泄漏问题@** deviceToken**。同意@septi 的描述。

在明确提到的异常中,'NSInvalidArgumentException',原因:'-[__NSCFData dataUsingEncoding:]:发送了无法识别的选择器并且 deviceToken 可能正在存储空值,这会产生问题。

【讨论】:

同意 iApple 但它应该被复制。问题是我们无法重现该问题。 @Hassan:尝试注释掉[moveParser release];这条线可能有问题,并且不确定再次加注。【参考方案3】:

也许你的字符串str_response由于自动释放不在内存中

NSString *str_response= ([dic objectForKey:SuccessKey] : [[NSString alloc] initWithFormat:@"%@",[dic objectForKey:SuccessKey]] autorelease]  ?  "" );

NSXMLParser *moveParser = [[NSXMLParser alloc] initWithData:[str_response dataUsingEncoding:NSUTF8StringEncoding]];

moveParser.delegate = self;

BOOL isParsed = [moveParser parse];

if (isParsed) 

else 

    // Parsing fail



[moveParser release];

【讨论】:

以上是关于由于无法重现的崩溃,Apple 拒绝了应用程序的主要内容,如果未能解决你的问题,请参考以下文章

由于不可重现的错误,使用 Flutter 制作的 iOS 应用程序被拒绝

iOS崩溃报告分析

由于应用程序在启动时崩溃,Phonegap ios 应用程序被拒绝

无法重现的 webcore 崩溃

Apple在应用程序中拒绝了facebook登录应用程序

应用审查小组的 EXC_BREAKPOINT (SIGTRAP)。不可重现