使用运行 iOS 7.1 的 iPhone 5s 时,设备令牌为零

Posted

技术标签:

【中文标题】使用运行 iOS 7.1 的 iPhone 5s 时,设备令牌为零【英文标题】:Device token is nil when using iPhone 5s running iOS 7.1 【发布时间】:2014-04-09 20:59:22 【问题描述】:

我的应用被苹果审核团队拒绝。 他们给我发了一个崩溃文件,上面写着:

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000



2 CoreFoundation  0x2e8c0e40 +[NSException raise:format:] + 108
3 Foundation      0x2f1e7500 -[NSString stringByAppendingString:] + 84
4 TheApp          0x000aaa3a -[UserSignInViewController userEmail:userPassword:]     (UserSignInViewController.m:175)

使用运行 ios 7.1 的 iPhone 5s 登录应用时会发生此崩溃。

首先,我通过 AppDelegate.m 中的“didRegisterForRemoteNotificationsWithDeviceToken:”获取设备令牌(应用程序首次启动时)并将其保存为 tmp。到一个静态变量:

NSString *tmpDT = [[[NSString stringWithFormat:@"%@",deviceToken]
                    stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""];

// Set tmp device token in DataStorage

[PSDataStorage setDeviceToken:tmpDT];

当用户退出并想要登录应用程序时,会通过附加字符串创建带有参数的 URL:

//...

// get device token from DataStorage

NSString *deviceToken = [PSDataStorage getDeviceToken];

NSString *fullURL = @"https://.../.../....json?email=";
fullURL = [fullURL stringByAppendingString:userEmail];
fullURL = [fullURL stringByAppendingString:@"&pw="];
fullURL = [fullURL stringByAppendingString:userPassword];
fullURL = [fullURL stringByAppendingString:@"&client=ios"];
fullURL = [fullURL stringByAppendingString:@"&device_token="];
fullURL = [fullURL stringByAppendingString:deviceToken]; 

UserSignInViewController.m:175 引用:

fullURL = [fullURL stringByAppendingString:deviceToken]; 

似乎 deviceToken 为 nil。我也在处理这样一个案例,即用户通过以下方式禁用了 PN:

didFailToRegisterForRemoteNotificationsWithError

我真的很困惑。

我希望你们能帮助我。

【问题讨论】:

a)如果应用程序运行,并且您获得设备令牌但它为零,b)您使用 PSDataStorage 存储 nil,c) 然后应用程序再次运行。那么,如果设备令牌为零,您是否进行了检查以确保 fullURL 代码不会运行?如果不是,那么这就是你崩溃的原因。你对什么具体的事情感到困惑? 我在 iPhone4 和 iPhone5 上测试过。在开发过程中没有这样的问题。正如我所说,它只发生在 iPhone 5s 上。登录过程也只调用一次。所以 c) 是不相关的。你是对的。我将检查 deviceToken 是否为 nil。我应该在一开始就已经这样做了。但是还有一个问题:即使调用了“didRegisterForRemoteNotificationsWithDeviceToken:”,为什么 devie 令牌也应该为零? 如果您的应用在设备启动后立即运行,您可能偶尔会得到一个 nil 令牌。当我得到令牌时,我有一个小的重试算法,如果 didFailToRegisterForRemoteNotificationsWithError 被调用,我会立即重试,如果再次失败,可能等待几秒钟然后重试。我已经看到初始调用失败并且重试成功。 感谢您的回答。我不知道审核团队的流程,但也许他们会在干净的设备上测试应用程序。然而奇怪的是这不会影响 iPhone4 / 5。 顺便说一句,看看 NSString stringWithFormat - 它可以用一行替换所有这些附加。由于您的问题发生在 5S 上,您可能会遇到一个竞争条件,即一个线程正在使用尚未在另一个线程上设置的数据。一旦设备令牌可用,您应该考虑发布通知,然后执行注册 【参考方案1】:

设备令牌是NSData,如果您想在字符串中使用它,您需要将其转换为十六进制格式。尝试使用NSData+APNSToken cocoapod 将NSData 转换为NSString

【讨论】:

检查第二个代码sn -p。我正在那里做。 之前已经提到这不是从deviceToken 参数获取字符串的可靠方法。您所依赖的描述方法可能会在未来发生变化。 好的,我也会检查一下。谢谢。

以上是关于使用运行 iOS 7.1 的 iPhone 5s 时,设备令牌为零的主要内容,如果未能解决你的问题,请参考以下文章

对于相同的 iPhone 5s,iOS 模拟器在 ios 7.1 和 ios 8.2 之间具有不同的屏幕高度

XCode 6项目在ios 7.1上segue后崩溃

如何在iphone的后台获取位置[关闭]

Xcode 5.1 无法使用 Ios 7.1.1 连接到我的 Iphone 5S

iPhone 5s升级iOS 11体验 APP加载时间增加 Safari性能改善

iOS 8 代码适用于 iPhone 5s 但不适用于 iPhone 5