3

iPhone でアプリケーションを実行しようとするとエラーが発生します。この場合、エラーがゼロになる理由がわかりません

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '  setObjectForKey: object cannot be nil (key: device_id)'
First throw call stack: (0x183ce0f48 0x19918bf80 0x183bcc4e0 0x10006f5f0 0x1002b9ca8 0x1002b9c68 0x1002bf710 0x183c981f8 0x183c96060 0x183bc4ca0 0x18f148088 0x1892dcffc 0x1000716a0 0x1999ce8b8)
libc++abi.dylib: terminating with uncaught exception of type NSException

このエラーに関連する appdelegate.m ファイルの一部を次に示します。

// Get the users Device Model, Display Name, Token & Version Number
UIDevice *device = [UIDevice currentDevice];

NSUserDefaults *dict = [NSUserDefaults standardUserDefaults];
NSString *identifier = [dict stringForKey:@"identifier"];
NSString *deviceName = device.name;
NSString *deviceModel = device.model;
NSString *deviceSystemVersion = device.systemVersion;

// Prepare the Device Token for Registration (remove spaces and < >)
NSString *deviceToken = [[[[token description]
stringByReplacingOccurrencesOfString:@"<"withString:@""]
stringByReplacingOccurrencesOfString:@">" withString:@""]
stringByReplacingOccurrencesOfString: @" " withString: @""];

NSMutableDictionary *postDatas = [NSMutableDictionary dictionary];
[postDatas setObject:appName forKey:@"app_name"];
[postDatas setObject:appVersion forKey:@"app_version"];
[postDatas setObject:identifier forKey:@"device_uid"];
[postDatas setObject:deviceToken forKey:@"device_token"];
[postDatas setObject:deviceName forKey:@"device_name"];
[postDatas setObject:deviceModel forKey:@"device_model"];
[postDatas setObject:deviceSystemVersion forKey:@"device_version"];
[postDatas setObject:pushBadge forKey:@"push_badge"];
[postDatas setObject:pushAlert forKey:@"push_alert"];
[postDatas setObject:pushSound forKey:@"push_sound"];

Request *request = [Request alloc];
request.delegate = self;

[request postDatas:postDatas withUrl:@"push/iphone/registerdevice/"];

このメソッドは推奨されていませんか?

4

2 に答える 2

5

あなたは識別子にnilを取得しています。こんな感じでチェックしてみてください

NSString *identifier = [dict stringForKey:@"identifier"];

if([identifier length] != 0)
    [postDatas setObject:identifier forKey:@"device_uid"];
else
    [postDatas setObject:@"" forKey:@"device_uid"];
于 2015-12-02T09:33:01.773 に答える
1

nil 値を辞書に入れることはできません。クラッシュします。

本当に調査しなければならないこと: これらの nil 値はどこから来ているのか、nil 値を取得したときに何をするのが適切か? それはあなただけが決めることができるものです。Mukesh の答えは、nil の代わりに空の文字列を格納する方法です。これにより、クラッシュが回避されます。多くの場合、それは正しいことですが、常にそうとは限りません。そのため、値の 1 つが nil の場合にアプリが何をすべきかを調査し、正確にそれを行うようにします。

于 2015-12-02T10:47:55.010 に答える