ios
Purpose
This skill handles core iOS development tasks using Apple's SDK, focusing on app lifecycle management (scene-based), permissions via NSUsageDescription in Info.plist, and adherence to Human Interface Guidelines (HIG) for UI/UX consistency.
When to Use
- Building native iOS apps with Swift or Objective-C.
- Managing app states in scene-based architectures (e.g., iOS 13+).
- Requesting user permissions like camera or location.
- Ensuring apps follow HIG for accessibility and design standards.
- Integrating iOS-specific features in cross-platform projects.
Key Capabilities
- Access iOS SDK components like UIKit and SwiftUI for UI building.
- Handle scene-based lifecycle events (e.g., sceneDidBecomeActive).
- Manage permissions by adding keys to Info.plist (e.g., NSCameraUsageDescription).
- Enforce HIG through practices like adaptive layouts and voiceover support.
- Support for Xcode tools and Apple ecosystem integration.
Usage Patterns
- Start by setting up an Xcode project: Use
xcodegenor create via Xcode UI, then add dependencies via Swift Package Manager. - For app lifecycle, implement UISceneDelegate methods in your scene manifest.
- To handle permissions, edit Info.plist directly or via Xcode's property list editor, adding strings for each usage description.
- Follow HIG by using Auto Layout constraints and testing with Accessibility Inspector.
- Test apps on simulators or devices using Xcode's build scheme: Select device, then run
xcodebuild -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 14' build.
Common Commands/API
- CLI Commands: Use
xcodebuildfor building:xcodebuild -workspace MyApp.xcworkspace -scheme MyApp clean build. For archiving:xcodebuild -scheme MyApp -configuration Release archive. - API Endpoints: Not applicable for direct endpoints; use iOS APIs like
AVCaptureDevice.requestAccess(for:.video)for camera permission. - Code Snippets:
- Request camera permission: import AVFoundation AVCaptureDevice.requestAccess(for:.video) {granted in if granted {print("Access granted")} else {print("Denied")}} - Handle scene lifecycle in SceneDelegate.swift: func sceneDidBecomeActive(_ scene: UIScene) {// Resume tasks, e.g., start timers} func sceneWillResignActive(_ scene: UIScene) {// Pause tasks} - Add permission to Info.plist (XML format): <key>NSCameraUsageDescription</key> <string>This app uses the camera for photo capture.</string>
- Config Formats: Use Info.plist for permissions (key-value pairs) or entitlements files for capabilities like iCloud (e.g.,
<key>com.apple.security.application-groups</key><string>group.com.example</string>).
Integration Notes
- Integrate with other tools by linking via Xcode: Add pods with CocoaPods (
pod install) or packages in Package.swift. - For Apple services like App Store Connect, use environment variables for API keys: Set
$APPLE_API_KEYand reference in scripts (e.g.,xcrun altool --upload-app --file MyApp.ipa --username $APPLE_USERNAME --password $APPLE_API_KEY). - When combining with Android (via mobile cluster), use shared configs but handle iOS-specific code in conditional blocks (e.g.,
#if os(iOS)in Swift). - For CI/CD, integrate with GitHub Actions: Use
actions/checkoutthen runxcodebuildin a macOS runner. - If using third-party SDKs, add them via Swift Package Manager: Edit Package.swift and resolve with
swift package resolve.
Error Handling
- For permission denials, check status with
AVAuthorizationStatus.authorizedand prompt users via UIAlertController if needed. - Handle build errors from
xcodebuildby parsing output: Look for "Command PhaseScriptExecution failed" and fix scripts; usexcodebuild -verbosefor details. - For lifecycle issues, add logging in delegate methods (e.g.,
print("Scene error: \(error)")in sceneWillEnterForeground). - Common fixes: If Info.plist keys are missing, Xcode will error on build; add them via the project editor. For HIG violations, use Xcode's accessibility audit tool and resolve warnings.
- Use try-catch for API calls: e.g.,
do {try AVAudioSession.sharedInstance().setCategory(.playAndRecord)} catch {print(error.localizedDescription)}.
Usage Examples
- Example 1: Basic App with Camera Permission Create a new Xcode project, add NSCameraUsageDescription to Info.plist, and implement permission request in ViewController.swift:
import UIKit import AVFoundation class ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad(); requestCamera()} func requestCamera() {AVCaptureDevice.requestAccess(for:.video) {granted in if granted {/* Proceed */}}}}Build and run withxcodebuild -scheme MyApp buildto test on simulator. - Example 2: Managing App Lifecycle In a scene-based app, handle state changes in SceneDelegate.swift:
import UIKit class SceneDelegate: UIResponder, UIWindowSceneDelegate {func sceneDidBecomeActive(_ scene: UIScene) {print("App active")} func sceneWillEnterForeground(_ scene: UIScene) {/* Reload data */}}Usexcodebuild testto verify lifecycle events during app testing.
Graph Relationships
- Related to: mobile (cluster), as it shares mobile development patterns.
- Connected to: android (skill), via cross-platform mobile integration.
- Links with: apple-ecosystem (tag), for broader Apple services.
- Associated with: sdk-tools (implied), for shared SDK usage in iOS context.