Desarchivar SKSpriteNode corrompe la SKTextura del sprite en iOS 7.1, de lo contrario

Estoy usando NSKeyedArchiver para archivar un NSMutableDictionary que contiene un NSMutableArray de SKSpriteNode subclass s. Es un juego de cartas en el que estoy guardando algunas statistics del juego y luego una variedad de sprites asociados con el juego.

Archival está funcionando bastante bien. También estoy implementando - (id)initWithCoder:(NSCoder *)aDecoder y - (void)encodeWithCoder:(NSCoder *)aCoder en mi subclass SKSpriteNode para asegurarse de que todas las properties, incluida la textura del sprite, se codifican mediante el file.

El problema es que cuando desfile los datos del juego. En iOS 8, mi NSMutableArray de SKSpriteNode descomprime perfectamente y se agrega de nuevo al juego con sus texturas y properties en contacto.

Sin embargo, en iOS 7.1, todo se desempaqueta a exception de la textura del nodo. En cambio, obtengo el error: SKTexture: Error loading image resource: "MissingResource.png" y mis sprites tienen grandes X rojas en lugar de sus texturas.

Aquí está mi código:

Archivo:

 - (void)applicationDidEnterBackground:(UIApplication *)application { SKView *view = (SKView *)self.window.rootViewController.view; if( view.scene ) { GameScene* game = (GameScene*)view.scene; NSMutableDictionary* currentGame = [[NSMutableDictionary alloc] init]; // game stats [currentGame setObject:[[Global getShanetworkingInstance] undoStack] forKey:@"undoStack"]; [currentGame setObject:[NSNumber numberWithInt:game.hints] forKey:@"remainingHints"]; [currentGame setObject:[NSNumber numberWithInt:game.undos] forKey:@"remainingUndos"]; [currentGame setObject:[NSNumber numberWithInt:[[Global getShanetworkingInstance] moves]] forKey:@"gameMoves"]; [currentGame setObject:[NSNumber numberWithInt:[[Global getShanetworkingInstance] score]] forKey:@"gameScore"]; [currentGame setObject:[NSNumber numberWithInteger:[[Global getShanetworkingInstance] elapsedTime]] forKey:@"elapsedTime"]; [currentGame setObject:[NSNumber numberWithInteger:[[Global getShanetworkingInstance] minutes]] forKey:@"minutes"]; [currentGame setObject:[NSNumber numberWithInteger:[[Global getShanetworkingInstance] startedTimeInterval]] forKey:@"startedTimeInterval"]; [currentGame setObject:[NSNumber numberWithInteger:[[Global getShanetworkingInstance] elapsedPauseTime]] forKey:@"elapsedPauseTime"]; [currentGame setObject:[NSNumber numberWithInteger:[[Global getShanetworkingInstance] lastPauseTime]] forKey:@"lastPauseTime"]; // here - game cards SKSpriteNodes [currentGame setObject:game.cards forKey:@"cards"]; // encode to disk NSData* encodedData = [NSKeyedArchiver archivedDataWithRootObject:currentGame]; [encodedData writeToFile:[Global gameDataFilePath] atomically:YES]; } } 

Sprite Coding

 - (id)initWithCoder:(NSCoder *)aDecoder { NSLog(@"%@",[aDecoder decodeObjectForKey:@"texture"]); self = [super initWithTexture:[aDecoder decodeObjectForKey:@"texture"] color:[UIColor clearColor] size:CGSizeMake(106,156)]; if(self) { self.name = [aDecoder decodeObjectForKey:@"name"]; self.theme = [aDecoder decodeObjectForKey:@"theme"]; self.suit = [aDecoder decodeObjectForKey:@"suit"]; self.value = [aDecoder decodeIntForKey:@"value"]; self.ID = [aDecoder decodeIntForKey:@"ID"]; self.locked = [aDecoder decodeBoolForKey:@"locked"]; self.faceUp = [aDecoder decodeBoolForKey:@"faceUp"]; self.black = [aDecoder decodeBoolForKey:@"black"]; self.dealCard = [aDecoder decodeBoolForKey:@"dealCard"]; self.highlighted = [aDecoder decodeBoolForKey:@"highlighted"]; self.highlightAction = [aDecoder decodeObjectForKey:@"highlightAction"]; self.inStackNode = [aDecoder decodeObjectForKey:@"inStackNode"]; self.shadowNode = [aDecoder decodeObjectForKey:@"shadowNode"]; self.highlightNode = [aDecoder decodeObjectForKey:@"highlightNode"]; self.zPosition = [aDecoder decodeFloatForKey:@"zPosition"]; [self addChild:self.shadowNode]; [self addChild:self.inStackNode]; } return self; } - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:self.theme forKey:@"theme"]; [aCoder encodeObject:self.suit forKey:@"suit"]; [aCoder encodeInt:self.value forKey:@"value"]; [aCoder encodeInt:self.ID forKey:@"ID"]; [aCoder encodeBool:self.black forKey:@"black"]; [aCoder encodeBool:self.locked forKey:@"locked"]; [aCoder encodeBool:self.faceUp forKey:@"faceUp"]; [aCoder encodeBool:self.dealCard forKey:@"dealCard"]; [aCoder encodeBool:self.highlighted forKey:@"highlighted"]; [aCoder encodeObject:self.highlightAction forKey:@"highlightAction"]; [aCoder encodeObject:self.inStackNode forKey:@"inStackNode"]; [aCoder encodeObject:self.shadowNode forKey:@"shadowNode"]; [aCoder encodeObject:self.highlightNode forKey:@"highlightNode"]; [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeFloat:self.xScale forKey:@"scale"]; [aCoder encodeFloat:self.zPosition forKey:@"zPosition"]; [aCoder encodeObject:self.texture forKey:@"texture"]; } 

El NSLog() en el método - (id)initWithCoder:(NSCoder *)aDecoder imprime la SKTexture correcta en iOS 8 e imprime la SKTexture de Missing Image en iOS 7.

¿Pensamientos?

Siguiendo mi propia pregunta, lo que opté por hacer fue almacenar el estado del juego en [NSUserDefaults standardUserDefaults] y [NSUbiquitousKeyValueStore defaultStore] para iCloud. Ahora NSMutableArray s de NSMutableDictionary s que representan los attributes de mi tarjeta en los valores pnetworkingeterminados del usuario, y luego reconstruyo mis sprites desde estos valores cuando llega el momento de revivir un juego guardado.

Todo funciona como debería ahora.