This skill should be used when the user asks to "setup Core Data", "implement data persistence", "save user preferences", "secure credentials with Keychain", "manage file storage", "setup CloudKit sync", or needs guidance on iOS data storage patterns and architecture.
From ios-dev-toolkitnpx claudepluginhub nbkm8y5/claude-plugins --plugin ios-dev-toolkitThis skill uses the workspace's default tool permissions.
references/persistence-patterns.mdreferences/sample-app-guide.mdscripts/generate_coredata_stack.pyscripts/generate_file_system_manager.pyscripts/generate_keychain_service.pyscripts/generate_userdefaults_wrapper.pySearches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Guides implementation of event-driven hooks in Claude Code plugins using prompt-based validation and bash commands for PreToolUse, Stop, and session events.
Generate production-ready data persistence infrastructure for iOS applications. Provides type-safe storage managers for UserDefaults, Core Data, Keychain, and file system operations with proper architecture, error handling, and SwiftUI integration.
# Generate UserDefaults wrapper
python scripts/generate_userdefaults_wrapper.py ./Sources [Domain]
# Generate Core Data stack
python scripts/generate_coredata_stack.py ./Sources [ModelName] [BundleID] [EntityName]
# Generate Keychain service
python scripts/generate_keychain_service.py ./Sources [BundleID] [Domain]
# Generate File System manager
python scripts/generate_file_system_manager.py ./Sources [Domain]
Examples:
# For a mortgage calculator app
python scripts/generate_userdefaults_wrapper.py ./Sources Mortgage
python scripts/generate_coredata_stack.py ./Sources MortgageApp com.example.mortgage Calculation
python scripts/generate_keychain_service.py ./Sources com.example.mortgage Mortgage
python scripts/generate_file_system_manager.py ./Sources Mortgage
Use this skill when you need to:
Use the decision tree to choose the right storage:
Is data sensitive (passwords, tokens, keys)?
├─ YES → Use Keychain (generate_keychain_service.py)
└─ NO → Continue
Is data simple (settings, flags, small values)?
├─ YES → Use UserDefaults (generate_userdefaults_wrapper.py)
└─ NO → Continue
Is data structured with relationships?
├─ YES → Use Core Data (generate_coredata_stack.py)
└─ NO → Continue
Is data file-based (PDFs, images, exports)?
├─ YES → Use File System (generate_file_system_manager.py)
└─ NO → Consider Core Data
Need multi-device sync?
└─ YES → Core Data + CloudKit
generate_userdefaults_wrapper.py)Purpose: Type-safe UserDefaults wrapper with Combine support
Generates:
Parameters:
output_path: Directory to create the file (required)domain: Application domain (optional, default: "App")Output: UserPreferences.swift
Features:
generate_coredata_stack.py)Purpose: Complete Core Data stack with proper lifecycle management
Generates:
Parameters:
output_path: Directory to create files (required)model_name: Name of Core Data model (optional, default: "Model")bundle_id: Bundle identifier for CloudKit (optional, default: "com.example.app")entity_name: Initial entity name (optional, default: "Item")Output:
CoreDataStack.swift{ModelName}.xcdatamodeld/ directory structureFeatures:
generate_keychain_service.py)Purpose: Secure credential storage with type-safe API
Generates:
Parameters:
output_path: Directory to create the file (required)bundle_id: Bundle identifier for keychain service (optional, default: "com.example.app")domain: Application domain (optional, default: "App")Output: KeychainService.swift
Features:
generate_file_system_manager.py)Purpose: Document and file operations manager
Generates:
Parameters:
output_path: Directory to create the file (required)domain: Application domain (optional, default: "App")Output: FileSystemManager.swift
Features:
Step 1: Analyze Your Data Storage Needs
Identify what data needs to be persisted:
Step 2: Generate Required Storage Managers
# Generate all storage components
cd /path/to/your/project
# User preferences
python scripts/generate_userdefaults_wrapper.py ./Sources YourDomain
# Structured data
python scripts/generate_coredata_stack.py ./Sources YourModel com.yourcompany.app MainEntity
# Secure storage
python scripts/generate_keychain_service.py ./Sources com.yourcompany.app YourDomain
# File management
python scripts/generate_file_system_manager.py ./Sources YourDomain
Step 3: Design Your Core Data Model (if using Core Data)
YourModel.xcdatamodeld in XcodeStep 4: Initialize Storage in App
@main
struct YourApp: App {
let coreDataStack = CoreDataStack.shared
let preferences = UserPreferences.shared
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.managedObjectContext, coreDataStack.viewContext)
.environmentObject(preferences)
}
}
}
Step 5: Implement Domain Logic
Create repositories and view models that use the generated managers:
// Repository pattern for Core Data
final class DataRepository {
private let context: NSManagedObjectContext
init(context: NSManagedObjectContext = CoreDataStack.shared.viewContext) {
self.context = context
}
func save(_ item: ItemData) -> Item {
let entity = Item(context: context)
// Map data to entity
try? context.save()
return entity
}
func fetchAll() -> [Item] {
let request = Item.fetchRequest()
return (try? context.fetch(request)) ?? []
}
}
Step 6: Integrate with SwiftUI
Use the storage managers in your views:
struct SettingsView: View {
@ObservedObject var prefs = UserPreferences.shared
var body: some View {
Form {
Toggle("Feature Enabled", isOn: $prefs.featureEnabled)
}
}
}
struct DataListView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Item.date, ascending: false)]
)
private var items: FetchedResults<Item>
var body: some View {
List(items) { item in
Text(item.name ?? "")
}
}
}
Read references/persistence-patterns.md for:
Read references/mortgage-calculator-guide.md for:
These references provide detailed patterns, examples, and best practices. Load them when implementing specific features or troubleshooting persistence issues.
SwiftUI Component Library (Skill #7)
PDF Generation & Export (Skill #5)
iOS Testing Suite Generator (Skill #4)
iOS Build CI/CD (Skill #6)
// Generated with generate_userdefaults_wrapper.py
@ObservedObject var prefs = UserPreferences.shared
// In SwiftUI
Toggle("Feature", isOn: $prefs.featureEnabled)
// In code
if UserPreferences.shared.featureEnabled {
// Do something
}
// Create repository
let repo = DataRepository()
// Save
let item = repo.save(itemData)
// Fetch
let items = repo.fetchAll()
// Delete
repo.delete(item)
// Generated with generate_keychain_service.py
let keychain = KeychainService.shared
// Save token
try? keychain.save("token", forKey: "authToken")
// Retrieve
if let token = try? keychain.retrieveString(forKey: "authToken") {
// Use token
}
// Check auth status
if keychain.isAuthenticated {
// User is logged in
}
// Generated with generate_file_system_manager.py
let fileManager = FileSystemManager.shared
// Save file
fileManager.save(data, to: "export.pdf", in: fileManager.documentsDirectory)
// Load file
if let data = fileManager.loadData(from: "export.pdf") {
// Use data
}
// List files
let files = fileManager.contentsOfDirectory(at: fileManager.documentsDirectory)
All generated code includes testing support:
// In-memory Core Data for tests
let testStack = CoreDataStack.preview
// Mock keychain
class MockKeychain: KeychainService {
var storage: [String: Data] = [:]
// Override methods
}
// Test file system
class TestFileSystem: FileSystemManager {
override var documentsDirectory: URL {
FileManager.default.temporaryDirectory
}
}
To enable CloudKit sync in Core Data:
enableCloudSync = true before accessing persistent containerCoreDataStack.shared.enableCloudSync = true
let container = CoreDataStack.shared.persistentContainer // Will use CloudKit
UserDefaults.standard.synchronize() if neededAfter running all scripts, you'll have:
YourProject/
├── Sources/
│ ├── UserPreferences.swift # Type-safe preferences
│ ├── CoreDataStack.swift # Complete Core Data setup
│ ├── YourModel.xcdatamodeld/ # Data model
│ ├── KeychainService.swift # Secure credential storage
│ └── FileSystemManager.swift # File operations
All files are:
Your data persistence infrastructure is now complete and production-ready! 🎉