Fixing errordomainnscocoaerrordomainerrormessagekunde-inte-hitta-den-angivna-genvagen-errorcode4
Ever hit a wall with that pesky errordomainnscocoaerrordomainerrormessagekunde-inte-hitta-den-angivna-genvagen-errorcode4 error? Trust me, you're not alone. This frustrating iOS and macOS development roadblock stops projects dead in their tracks, leaving even seasoned developers scratching their heads.
Let's crack this code together. The error message—written in Swedish, not French, as some sources incorrectly claim—translates to “could not find the specified shortcut.” I'll walk you through why this happens and how to fix it.

What Triggers NSCocoaErrorDomain Error Code 4?
The errordomainnscocoaerrordomainerrormessagekunde-inte-hitta-den-angivna-genvagen-errorcode4 error occurs when your application attempts to access a file that isn't where it's supposed to be. Error code 4 means explicitly NSFileNoSuchFileError in the NSCocoaErrorDomain—Apple's way of saying “file not found.”
Here's what it looks like in your console:
Error Domain=NSCocoaErrorDomain Code=4 “kunde inte hitta den angivna genvägen.”
This error doesn't just appear randomly. Your app is looking for a specific resource and hitting a dead end. But why?

Common Causes of NSCocoaErrorDomain Error Code 4

1. The Vanishing File Act
Files move. Files get deleted. When that happens without your app knowing, boom—errordomainnscocoaerrordomainerrormessagekunde-inte-hitta-den-angivna-genvagen-errorcode4 appears. Here's a typical scenario:
swift
// Problematic code
let filePath = “/Users/developer/Documents/mySpecialFile.txt”
do {
let content = try String(contentsOfFile: filePath)
// Process content
} catch {
print(“Error: \(error)”) // NSCocoaErrorDomain Code=4 appears here
}
The problem? That hardcoded path will break when the file moves or someone uses a different device.
2. Path Typos and Syntax Errors
One tiny typo can trigger our troublesome errordomainnscocoaerrordomainerrormessagekunde-inte-hitta-den-angivna-genvagen-errorcode4 error. Missing a slash, using the wrong case, or misspelling a directory name means your perfect code looks in the wrong place.
swift
// Problematic code with typo
let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let filePath = documentDirectory.appendingPathComponent(“MyFiles/inportantData.json”) // “inportant” instead of “important”
One letter off, and your app crashes with our favorite error.
3. Permission Problems
Sometimes the file exists exactly where you're looking, but your app lacks permission to access it. This happens often with sandboxed applications or when trying to access system directories.
swift
// Code attempting to access restricted location
let systemPath = “/Library/Preferences/SystemConfiguration/preferences.plist”
do {
let data = try Data(contentsOf: URL(fileURLWithPath: systemPath))
// Process data
} catch {
print(“Access error: \(error)”) // You'll get errordomainnscocoaerrordomainerrormessagekunde-inte-hitta-den-angivna-genvagen-errorcode4
}
4. Bundle Resource Misconfigurations
You might have added resources to your project but forgot to include them in your target's “Copy Bundle Resources” build phase. A classic rookie mistake that leads to our error.
Diagnosis Steps: Finding the Root Cause
Before jumping to solutions, let's pinpoint exactly why you see errordomainnscocoaerrordomainerrormessagekunde-inte-hitta-den-angivna-genvagen-errorcode4. Follow this systematic approach:

- Verify the exact file path the code is trying to access:
swift
// Add this debugging code
let filePath = // your file path logic here
let fileExists = FileManager.default.fileExists(atPath: filePath)
print(“Looking for file at: \(filePath)”)
print(“File exists: \(fileExists)”)
- Check the file's existence directly in Finder or using Terminal:
bash
# In Terminal
ls -la /path/to/your/file
- Examine permissions by checking file attributes:
swift
// Swift code to check file permissions
do {
let attributes = try FileManager.default.attributesOfItem(atPath: filePath)
print(“File attributes: \(attributes)”)
} catch {
print(“Error getting attributes: \(error)”)
}
- Enable verbose logging to track file system operations:
swift
// Add at app start
os_log(“App started file access monitoring”, log: OSLog(subsystem: “com.yourapp”, category: “FileAccess”), type: .info)
// Before accessing files
os_log(“Attempting to access file at %{public}@”, log: OSLog(subsystem: “com.yourapp”, category: “FileAccess”), type: .debug, filePath)
Solutions: Banishing the Error for Good

Now that we understand errordomainnscocoaerrordomainerrormessagekunde-inte-hitta-den-angivna-genvagen-errorcode4, let's fix it permanently with these battle-tested solutions:
Solution 1: Use Relative Paths and FileManager
Hardcoded paths are a recipe for disaster. Instead, use FileManager to build paths dynamically:
swift
// GOOD: Dynamic path resolution
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let filePath = documentsDirectory.appendingPathComponent(“config.json”)
do {
let data = try Data(contentsOf: filePath)
// Process data
} catch {
// Handle error gracefully
if (error as NSError).domain == NSCocoaErrorDomain && (error as NSError).code == 4 {
// Create default config if missing
let defaultConfig = [“setting”: “default”]
let defaultData = try! JSONSerialization.data(withJSONObject: defaultConfig)
try? defaultData.write(to: filePath)
// Now try again with the newly created file
} else {
// Handle other errors
}
}
Solution 2: Bundle Resources Done Right
For app resources, use the bundle's resource accessors:
swift
// GOOD: Proper bundle resource access
if let configURL = Bundle.main.url(forResource: “config”, withExtension: “json”) {
do {
let data = try Data(contentsOf: configURL)
// Process bundle resource
} catch {
print(“Error loading bundle resource: \(error)”)
}
} else {
print(“Bundle resource not found”)
// Handle missing resource gracefully
}
Solution 3: Implement Robust Error Recovery
Don't just catch errors—recover from them intelligently:
swift
// Complete error handling solution
class ConfigManager {
let configFileName = “appConfig.json”
func loadConfig() -> [String: Any] {
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let configURL = documentsDirectory.appendingPathComponent(configFileName)
// Try loading from documents directory
if let config = try? loadConfigFromURL(configURL) {
return config
}
// Fall back to bundle
if let bundleURL = Bundle.main.url(forResource: “defaultConfig”, withExtension: “json”),
let config = try? loadConfigFromURL(bundleURL) {
// Save for future use
try? saveConfig(config, to: configURL)
return config
}
// Last resort – create minimal working config
let defaultConfig: [String: Any] = [“created”: “dynamically”, “timestamp”: Date().timeIntervalSince1970]
try? saveConfig(defaultConfig, to: configURL)
return defaultConfig
}
private func loadConfigFromURL(_ url: URL) throws -> [String: Any] {
let data = try Data(contentsOf: url)
guard let config = try JSONSerialization.jsonObject(with: data) as? [String: Any] else {
throw NSError(domain: “ConfigError”, code: 1, userInfo: [NSLocalizedDescriptionKey: “Invalid JSON format”])
}
return config
}
private func saveConfig(_ config: [String: Any], to url: URL) throws {
let data = try JSONSerialization.data(withJSONObject: config)
try data.write(to: url)
}
}
Solution 4: Proper Permission Handling
For apps requiring file access permissions:
swift
// iOS permission request example
func requestDocumentsAccess() {
let documentPicker = UIDocumentPickerViewController(documentTypes: [“public.data”], in: .open)
documentPicker.delegate = self
presentingViewController?.present(documentPicker, animated: true)
}
// Document picker delegate method
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
guard let selectedFileURL = urls.first else { return }
// Secure access to the file URL
let shouldStopAccessing = selectedFileURL.startAccessingSecurityScopedResource()
defer {
if shouldStopAccessing {
selectedFileURL.stopAccessingSecurityScopedResource()
}
}
// Now you can access the file without errordomainnscocoaerrordomainerrormessagekunde-inte-hitta-den-angivna-genvagen-errorcode4
do {
let data = try Data(contentsOf: selectedFileURL)
// Process the data
} catch {
print(“Error accessing file: \(error)”)
}
}
Prevention vs. Recovery: A Strategic Comparison

Prevention Technique | Recovery Strategy |
Use FileManager for dynamic paths | Create missing files on demand with defaults |
Verify resources included in the bundle | Fall back to bundled defaults when user files missing |
Check file existence before access | Implement multi-tier fallback mechanisms |
Use proper security-scoped bookmarks | Guide users to restore access via straightforward UI |
Avoid hardcoded absolute paths | Log detailed error info for troubleshooting |
Real-Life Implementation: A Complete Solution
Here's a production-ready class that handles file access while preventing the dreaded errordomainnscocoaerrordomainerrormessagekunde-inte-hitta-den-angivna-genvagen-errorcode4 error:
swift
import Foundation
import os.log
class SecureFileManager {
static let shared = SecureFileManager()
private let fileLogger = OSLog(subsystem: “com.yourapp.fileaccess”, category: “FileOperations”)
/// Safely reads data from a file, with multiple fallback mechanisms
/// – Parameters:
/// – fileName: Name of the file to read
/// – directory: Directory to look in (.documents, .caches, etc)
/// – createIfMissing: Whether to create the file with default content if missing
/// – defaultContent: Default content to use if file needs to be created
/// – Returns: File data if available, nil if all attempts fail
func safelyReadFile(named fileName: String,
in directory: FileManager.SearchPathDirectory = .documentDirectory,
createIfMissing: Bool = true,
defaultContent: Data? = nil) -> Data? {
// Get the directory URL
guard let directoryURL = FileManager.default.urls(for: directory, in: .userDomainMask).first else {
os_log(“Failed to access %{public}@ directory”, log: fileLogger, type: .error, String(describing: directory))
return nil
}
let fileURL = directoryURL.appendingPathComponent(fileName)
os_log(“Attempting to read file at: %{public}@”, log: fileLogger, type: .debug, fileURL.path)
// Check if file exists
let fileExists = FileManager.default.fileExists(atPath: fileURL.path)
os_log(“File exists: %{public}@”, log: fileLogger, type: .debug, String(describing: fileExists))
if fileExists {
do {
// Attempt to read existing file
let data = try Data(contentsOf: fileURL)
os_log(“Successfully read file: %{public}@”, log: fileLogger, type: .info, fileName)
return data
} catch {
os_log(“Error reading existing file: %{public}@”, log: fileLogger, type: .error, error.localizedDescription)
// If file exists but can't be read, it might be corrupted – delete it
try? FileManager.default.removeItem(at: fileURL)
os_log(“Removed potentially corrupted file”, log: fileLogger, type: .info)
// Continue to creation logic below if createIfMissing is true
}
}
// File doesn't exist or was corrupted – create it if requested
if createIfMissing, let defaultContent = defaultContent {
do {
// Create containing directory if needed
let directory = fileURL.deletingLastPathComponent()
if !FileManager.default.fileExists(atPath: directory.path) {
try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true)
}
// Write default content
try defaultContent.write(to: fileURL)
os_log(“Created new file with default content: %{public}@”, log: fileLogger, type: .info, fileName)
return defaultContent
} catch {
os_log(“Failed to create missing file: %{public}@”, log: fileLogger, type: .error, error.localizedDescription)
return nil
}
}
// Final fallback – check bundle
if let bundleURL = Bundle.main.url(forResource: fileName.components(separatedBy: “.”).first,
withExtension: fileName.components(separatedBy: “.”).last) {
do {
let bundleData = try Data(contentsOf: bundleURL)
os_log(“Using bundle resource as fallback: %{public}@”, log: fileLogger, type: .info, fileName)
// Save to expected location for future use if createIfMissing
if createIfMissing {
try? bundleData.write(to: fileURL)
}
return bundleData
} catch {
os_log(“Error reading bundle resource: %{public}@”, log: fileLogger, type: .error, error.localizedDescription)
}
}
return nil
}
}
// Usage example
let jsonData = SecureFileManager.shared.safelyReadFile(
named: “settings.json”,
createIfMissing: true,
defaultContent: “””
{“version”: 1, “firstRun”: true}
“””.data(using: .utf8)
)
Fixing errordomainnscocoaerrordomainerrormessagekunde-inte-hitta-den-angivna-genvagen-errorcode4 in Real Apps

Let's apply these principles to a real-world scenario. Imagine you're building a document editing app that stores user documents in the app's document directory:
- Implement proper path construction:
swift
// In your Document class
func documentURL(fileName: String) -> URL {
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
return documentsDirectory.appendingPathComponent(fileName)
}
- Add robust existence checking:
swift
func documentExists(fileName: String) -> Bool {
return FileManager.default.fileExists(atPath: documentURL(fileName: fileName).path)
}
- Create proper error recovery:
swift
func openDocument(named fileName: String) -> Document? {
let url = documentURL(fileName: fileName)
if !documentExists(fileName: fileName) {
// Document doesn't exist – check backups
if let backedUpDoc = checkBackupForDocument(fileName) {
return backedUpDoc
}
// No backup – create new
return createNewDocument(fileName: fileName)
}
// Normal open path
do {
let data = try Data(contentsOf: url)
return try Document(data: data, fileName: fileName)
} catch {
logError(“Failed to open document: \(error)”)
// Error recovery
if (error as NSError).domain == NSCocoaErrorDomain, (error as NSError).code == 4 {
// File disappeared between our check and attempt to open
return createNewDocument(fileName: fileName)
}
return nil
}
}
Key Takeaways
The errordomainnscocoaerrordomainerrormessagekunde-inte-hitta-den-angivna-genvagen-errorcode4 error boils down to a missing file scenario. Fix it by following these critical best practices:
- Never use hardcoded absolute paths
- Always check file existence before attempting access
- Implement robust fallback mechanisms
- Log detailed error information for troubleshooting
- Handle permissions properly, especially for user-selected files
By applying these techniques, you'll not only fix this error but also make your entire app more robust against file system issues.

Jim's passion for Apple products ignited in 2007 when Steve Jobs introduced the first iPhone. This was a canon event in his life. Noticing a lack of iPad-focused content that is easy to understand even for “tech-noob”, he decided to create Tabletmonkeys in 2011.
Jim continues to share his expertise and passion for tablets, helping his audience as much as he can with his motto “One Swipe at a Time!”