It seems that what this method is doing is actually replacing the user dictionary with a different one. To keep it in the spirit of its name (adding a custom key to the user data), it should add/replace the key inside the user dictionary rather than replacing the entire dictionary with a new one containing only that key.

Actually, this could be made even more useful if it were:

    - (void) setObject:(id) object forKey:(NSString*) key inUserDataInCrashReportWithID:(NSString*) reportID

Where "object" is a JSON serializable type.
If the user data dictionary doesn't exist, it is created. If it does, the object gets added to it.
If the key doesn't exist, it is created. If it does exist, it is replaced.

Also, since "user" and "user at crash" variants get merged by KSCrashReportStore when you load a report, you don't even need to handle both in this code. Just stuff it in "user" and let the report store do the merging work later.