/install ios-keyboard-limitations
iOS Keyboard Extension Limitations
When building iOS custom keyboards with voice/audio features, these are the hard limitations discovered through the PolyVoice project.
🔴 Hard Limitations (Cannot be worked around)
1. Microphone Access — DISALLOWED
Keyboard extensions cannot access the microphone.
AVAudioRecorderwill fail with permission errorSFSpeechRecognizeris unavailable- No Siri integration from keyboard context
Why: Apple security model — keyboards run in sandbox and could keylog audio.
2. Open Other Apps — BLOCKED
Keyboards cannot programmatically open the main app or any other app.
UIApplication.shared.open()returns false- URL schemes don't work (
myapp://) ExtensionContext.open()not available
Why: Prevents malicious keyboards from launching apps without user consent.
3. Memory Limit — ~50MB
Keyboard extensions have strict memory limits (~30-60MB).
- App terminated silently if exceeded
- No crash log, just disappears
- Heavy audio processing = instant death
Mitigation:
- Record at 16kHz mono (not 44.1kHz)
- Use 32kbps bitrate max
- Immediate file cleanup after processing
- 60-second max recording hard limit
4. No Persistent Storage
UserDefaults unavailable, only App Groups.
- Standard
UserDefaultsdoesn't persist - Must use
UserDefaults(suiteName: "group.com.company.app") - Requires App Group capability in both targets
5. Network Requires "Full Access"
API calls fail without user enabling "Allow Full Access" in Settings.
- User must explicitly enable: Settings → General → Keyboard → [Keyboard Name] → Allow Full Access
- Most users won't do this
- Cannot prompt or explain from keyboard UI effectively
🟡 Partial Workarounds (User friction)
The "Open App" Workaround
Goal: Let user tap a button to open main app for recording.
Attempt:
// This does NOT work
extensionContext?.open(URL(string: "myapp://record")!)
Reality: Must use UIApplication.shared.open() outside extension context, but keyboards can't call this.
The Manual Switch Pattern
What actually works (with friction):
- User taps button in keyboard → Shows alert: "Open PolyVoice to record?"
- User manually switches to main app (Home button, swipe, etc.)
- Main app detects active session (via App Groups / shared state)
- Main app auto-records on appear
- Auto-stops on silence (2 seconds)
- Auto-copies to clipboard
- User manually switches back to target app
- Keyboard auto-pastes on reappear
User flow:
Keyboard → Tap mic → [Manual: Switch to app] → App auto-records →
[Manual: Switch back] → Keyboard auto-pastes
Friction points:
- Two manual app switches
- Context switching breaks flow
- Users forget to return
- Clipboard may be overwritten
🟢 Alternative Architectures
Option 1: Share Extension (Better for Audio)
Use Share Sheet instead of keyboard.
- Full app capabilities
- Can record audio
- Can process and return text
Limitation: Not a keyboard — user must open share sheet per text field.
Option 2: Full App Mode
Don't use keyboard extension — use main app only.
- User opens app
- Records dictation
- Copies result
- Switches to target app
- Pastes manually
Benefit: No memory limits, full mic access, reliable.
Cost: More friction than keyboard.
Option 3: Siri Shortcuts Integration
Provide Siri Shortcuts for voice-to-text.
- "Hey Siri, dictate with PolyVoice"
- Returns text to current app
- Fully supported by Apple
Limitation: Not instant, requires Siri setup.
📊 Decision Matrix
| Approach | Mic Access | Memory | User Friction | Apple Approved |
|---|---|---|---|---|
| Keyboard extension | ❌ No | ⚠️ 50MB | Low (if no audio) | ✅ Yes |
| Keyboard + audio workaround | ❌ No | ⚠️ 50MB | 🔴 High | ✅ Yes |
| Share extension | ✅ Yes | ✅ Full | 🟡 Medium | ✅ Yes |
| Full app only | ✅ Yes | ✅ Full | 🟡 Medium | ✅ Yes |
| Siri Shortcuts | ✅ Yes | ✅ Full | 🟡 Medium | ✅ Yes |
🎯 Recommendation
For voice dictation/AI transcription:
- Don't build a keyboard extension — the limitations make it frustrating
- Use Share Extension — Apple-supported, full capabilities
- Or full app — simplest to build, most reliable
- Add Shortcuts — for power users who want speed
For non-audio keyboards (emoji, translation, etc.):
Keyboard extension works great. Just avoid audio features.
📚 References
- Apple's official docs: https://developer.apple.com/documentation/uikit/keyboards_and_input/creating_a_custom_keyboard
- Custom Keyboard Programming Guide (WWDC sessions)
- PolyVoice project learnings (~/Projects/polyvoice-keyboard/)
- 确保已安装 OpenClaw(本地或 Docker 部署)
- 在对话框中输入安装命令:
/install ios-keyboard-limitations - 安装完成后,直接呼叫该 Skill 的名称或使用
/ios-keyboard-limitations触发 - 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
Ios Keyboard Limitations 是什么?
iOS keyboard extension technical limitations and workarounds. Use when planning or building iOS custom keyboards with voice/audio features, dictation, or system integration needs. Covers memory limits, sandbox restrictions, microphone access, app launching, and viable alternative architectures. 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 1008 次。
如何安装 Ios Keyboard Limitations?
在 OpenClaw 或 Claude Code 对话框中运行命令「/install ios-keyboard-limitations」即可一键安装,无需额外配置。
Ios Keyboard Limitations 是免费的吗?
是的,Ios Keyboard Limitations 完全免费(开源免费),可自由下载、安装和使用。
Ios Keyboard Limitations 支持哪些平台?
Ios Keyboard Limitations 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。
谁开发了 Ios Keyboard Limitations?
由 usimic(@usimic)开发并维护,当前版本 v1.0.0。