Back to skills
SKILL.md
Ios Security
ASecurityHere’s a quick-start iOS security example that covers secure token storage, biometric unlock, and protected file writes: ```swift import Foundation import LocalAuthentication import Security enum SecureStore { static func saveToken(_ token: String, account: String = "authToken") throws { let data = Data(token.utf8) let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: account, kSecValueData as String: data ] SecItemDelete(query as CFDictionary)...
- 549 stars
- 0 votes
- 0 copies
- 2 views
- Added September 5, 2026
Works with
Security analysis
100/100Pro scans all 12 files and shows the line behind each finding
npx -y skills add HoangNguyen0403/agent-skills-standard --skill ios-security --agent claude-codeAre you the author of Ios Security?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/hoangnguyen0403-ios-security-313131d1)Here’s a quick-start iOS security example that covers secure token storage, biometric unlock, and protected file writes:
```swift
import Foundation
import LocalAuthentication
import Security
enum SecureStore {
static func saveToken(_ token: String, account: String = "authToken") throws {
let data = Data(token.utf8)
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: account,
kSecValueData as String: data
]
SecItemDelete(query as CFDictionary)
let status = SecItemAdd(query as CFDictionary, nil)
guard status == errSecSuccess else {
throw NSError(domain: NSOSStatusErrorDomain, code: Int(status))
}
}
static func readToken(account: String = "authToken") throws -> String {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: account,
kSecReturnData as String: true,
kSecMatchLimit as String: kSecMatchLimitOne
]
var item: CFTypeRef?
let status = SecItemCopyMatching(query as CFDictionary, &item)
guard status == errSecSuccess,
let data = item as? Data,
let token = String(data: data, encoding: .utf8) else {
throw NSError(domain: NSOSStatusErrorDomain, code: Int(status))
}
return token
}
}
func authenticateUser(completion: @escaping (Bool) -> Void) {
let context = LAContext()
var error: NSError?
guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
completion(false)
return
}
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,
localizedReason: "Unlock your secure session") { success, authError in
if let laError = authError as? LAError {
switch laError.code {
case .userCancel, .authenticationFailed:
completion(false)
default:
completion(false)
}
return
}
completion(success)
}
}
func saveProtectedFile(_ data: Data, to url: URL) throws {
try data.write(to: url, options: .completeFileProtection)
}
```
Use this as the baseline:
- Store tokens and PII in Keychain with `SecItemAdd` / `SecItemCopyMatching`, not `UserDefaults`
- Gate sensitive actions with `LAContext` and check `canEvaluatePolicy` first
- Write sensitive files with `.completeFileProtection`
- Keep App Transport Security enabled
- Avoid logging tokens or PII in release builds
- Add certificate pinning for production network traffic
Files in this skill
- eval-1.baseline.md
- eval-1.with-skill.md
- eval-2.baseline.md
- eval-2.with-skill.md
- eval-3.baseline.md
- eval-3.with-skill.md
- trigger-1.md
- trigger-2.md
- trigger-3.md
- trigger-4.md
- trigger-5.md
Attribution
Comments
Loading comments…