Search code examples
swiftmacosimagesprite-kitscreensaver

SpriteKit in screensaver can't find images


I am making a screensaver in Swift using SpriteKit. While testing screensaver in app, all the textures load properly. As soon as I make .saver and load it in System Preferences, SpriteKit shows that images are not found.

I used (imageNamed: ""), so I tried using

var imageURL = Bundle.main.url(forResource: "gradient", withExtension: "png")
let imageGradient = NSImage(contentsOf: imageURL!)!

,but I got the same result. SpriteKit can't access images when built into .saver file, but works perfectly when ran through the app.

I have included images in bundle, in assets, in Target's Copy Bundle Resources/Development Assets/Resource Tags.

You can clone the project from here: https://github.com/Nazar-Bibik/SavePortal


Solution

  • I have looked into this project: https://github.com/leebradley/nyan-screensaver And I found how to properly do it:

    1. You need to put images into bundle, not xcassets ( put it with .swift files )
    2. Instead of using image name use the following
    let sourceBundle = Bundle(for: MainSwiftFile.self)
    let imagePath = sourceBundle.path(forResource: "picture-name", ofType: "png")!
    neededTextures = SKTexture(imageNamed: imagePath)
    

    You need to provide the name of the .swift file with your principal class ( principle class in info.plist file ). The rest is simple - forResource is a file name, ofType is a file extension and instead of passing usual name in imageNamed: you provide String of path to file. "imagePath" is of a String type.