Failure to unarchive a sprite kit particle file

Hi all,

I'm having trouble in trying to access the content of a sprite kit particle file in a way that conforms with the recent deprecation of several functions in NSKeyedArchiver.

Briefly, my project contains a file named "ParticleSmoke.sks", which I used to access easily with the following lines of code:


NSString *smokePath = [[NSBundle mainBundle] pathForResource:@"ParticleSmoke" ofType:@"sks"];

SKEmitterNode* smoke = [NSKeyedUnarchiver unarchiveObjectWithFile:smokePath];


now that the unarchiving function has been deprecated, I fail to use the (poorly documented) unarchivedObjectOfClass function. Especially, the code below returns nil.


NSString *smokePath = [[NSBundle mainBundle] pathForResource:@"ParticleSmoke" ofType:@"sks"];

NSData* smokeData = [NSData dataWithContentsOfFile:smokePath];

NSError* error=nil;

Class cls = [SKEmitterNode class];

SKEmitterNode* smoke = (SKEmitterNode*)[NSKeyedUnarchiver unarchivedObjectOfClass:cls fromData:smokeData error:&error];


Unexpectedly, the content of "error" (code 4864) was

@"NSDebugDescription" : @"value for key 'NS.objects' was of unexpected class 'NSColor'. Allowed classes are '{(\n SKKeyframeSequence,\n NSArray,\n NSNumber,\n NSMutableArray\n)}'."


Has anyone an idea to fix this issue?

Thanks for your help....

Replies

The folowing seems to work:

SKEmitterNode * ret = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSObject class] fromData: fileData error:&error];


Although security need adjustment:

2020-04-05 23:24:54.181975-0400 xxxx[82301:1899459] [general] NSSecureCoding allowed classes list contains [NSObject class], which bypasses security by allowing any Objective-C class to be implicitly decoded. Consider reducing the scope of allowed classes during decoding by listing only the classes you expect to decode, or a more specific base class than NSObject.

2020-04-05 23:24:54.186331-0400 xxxx[82301:1899459] Data has loaded successfully - Projecti


I encountered the same (pre-iOS 14) and stopped using NSKeyedUnarchiver.

I now simply use: [SKEmitterNode nodeWithFileNamed:name];
  • //  NSString *myF15MissilesParticleSystemPath = [[NSBundle mainBundle] pathForResource:@"myF15MissilesParticle" ofType:@"sks"]; //  myF15MissilesParticleSystem = [NSKeyedUnarchiver unarchiveObjectWithFile:myF15MissilesParticleSystemPath];   myF15MissilesParticleSystem = [SKEmitterNode nodeWithFileNamed:@"myF15MissilesParticle.sks"];

Add a Comment