Итак, я делаю небольшие проекты для крупной игры, которые я разрабатывал, но не зная почему, каждый раз, когда я пытаюсь запустить свою игру, появляется сообщение об ошибке SIGABRT со следующим сообщением:NSInvalidUnarchiveOperationException On iOS 9.3 С SpriteKit
* Нагрузочное приложение из-за неперехваченное исключение 'NSInvalidUnarchiveOperationException', причина: «* - [NSKeyedUnarchiver decodeObjectForKey]: не может декодировать объект класса (GameScene) для ключа (корень); класс может быть определен в исходном коде или библиотеки, которая не связана»
я добавил следующее расширение для SKNode
extension SKNode {
class func unarchiveFromFile(_ file: NSString) -> SKNode? {
if let path = Bundle.main().pathForResource(file as String, ofType: "sks") {
do {
let sceneData = try Data(contentsOf: URL(fileURLWithPath: path), options: NSData.ReadingOptions.dataReadingMappedIfSafe)
let archiver = NSKeyedUnarchiver(forReadingWith: sceneData)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
let scene = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! GameScene
archiver.finishDecoding()
return scene
} catch {
print("ERROR1002")
return nil
}
} else {
print("ERROR001 - pathForResource not found")
return nil
}
}
}
Я использовал это расширение в других проектах, и все побежали как шарм, но теперь на этом.
Когда моя игра lanches, мой GameViewController.swift Файл называется и на моей viewDidLoad метод я сделать следующее:
import UIKit
import SpriteKit
import GameplayKit
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let scene = GameScene.unarchiveFromFile(currentSKSFile) as? GameScene {
// Configure the view.
let skView = self.view as! SKView
skView.showsFPS = false
skView.showsNodeCount = false
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .aspectFill
skView.presentScene(scene)
}
}
override func shouldAutorotate() -> Bool {
return true
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
if UIDevice.current().userInterfaceIdiom == .phone {
return .landscape
} else {
return .all
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
print("didReceiveMemoryWarning ERRO - GameViewController.swift")
}
override func prefersStatusBarHidden() -> Bool {
return true
}
}
Я отлажена код и он выходит из строя на следующей строке в класс расширения Я добавил:
let scene = archiver.decodeObject (forKey: NSKeyedArchiveRootObjectKey) как! GameScene
И он предлагает ошибку, описанную выше.
Я запускаю Xcode 8 Beta + iOS 10, и нет, это не из-за этого, потому что я могу запустить то же самое расширение, используемое в других проектах на таких устройствах с бета-версиями без каких-либо ошибок.
Любой намек на то, что может быть причиной этого?
С уважением - Иван