我直接按“你要真做一个电子书工具型 App”的实战视角给你讲,不绕概念。
一、Share Extension 是什么(一句话版)
Share Extension = 从系统任意“分享”入口,把文件/内容“塞进你的 App”
对电子书 App 来说,它是最低成本获取用户文件的核心入口。
二、电子书类文件:Share Extension 能从 iOS 哪些入口拿到?
下面是真实可行 + 市场常见的入口,按重要性排序 👇
✅ 1️⃣ Files(文件 App)【最重要】
支持来源
- iCloud Drive
- 本地“我的 iPhone / iPad”
- 第三方云盘(Google Drive、Dropbox、OneDrive)
- SMB / WebDAV
用户操作
Files → 长按文件 → 分享 → 你的 App
可拿到的电子书类型
.txt.epub.pdf.md.mobi(有些云盘会给,但你是否支持另说).zip(电子书打包)
👉 这是电子书类 App 的命脉入口
✅ 2️⃣ Safari(下载 / 打开 in…)
Safari 是第二大电子书来源。
场景 A:Safari 下载
-
用户下载:
- TXT / EPUB / PDF
- 下载完成后 → 分享 → 你的 App
场景 B:网页直开文件
- 有些站点直接打开 PDF / TXT
- 右上角分享 → 你的 App
👉 非常适合:
- 公版书
- 技术文档
- 学术 PDF
✅ 3️⃣ 第三方 App(微信 / Telegram / 邮件 / 网盘)
常见来源
- Mail(附件)
- Telegram(文档)
- LINE / WhatsApp(文件)
- Google Drive / Dropbox App 内
前提
- 对方 App 用的是标准
UIActivityViewController - 文件类型没被它“私有化”
📌 你拿到的一定是文件 URL(临时沙盒)
⚠️ 4️⃣ Books(Apple Books)【几乎不可能】
结论先给你:
❌ 无法从 Apple Books Share 出 EPUB/PDF 原文件
原因:
- DRM
- Books 不暴露文件级 Share
- 只允许“分享内容引用”
👉 别指望这个入口
⚠️ 5️⃣ Kindle / 微信读书 / 掌阅
结论统一:
❌ 几乎拿不到原文件
它们只会:
- 分享书名 / 链接 / 图片
- 不会分享
.epub/.mobi
三、Share Extension 技术实现(你真正要写的)
1️⃣ 新建 Share Extension Target
Xcode:
File → New → Target → Share Extension
系统会给你:
ShareViewController- 独立 Bundle
- 独立 Info.plist
2️⃣ Info.plist:声明你支持的电子书类型(关键)
你至少要加这些 UTI 👇
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsFileWithMaxCount</key>
<integer>10</integer>
<key>NSExtensionActivationSupportsAttachmentsWithContentTypes</key>
<array>
<string>public.plain-text</string> <!-- txt -->
<string>org.idpf.epub-container</string> <!-- epub -->
<string>com.adobe.pdf</string> <!-- pdf -->
<string>public.zip-archive</string>
</array>
</dict>
</dict>
</dict>
📌 不写对 → 系统根本不会显示你的 App
3️⃣ 从 Extension 里拿文件(核心代码)
let item = extensionContext?.inputItems.first as? NSExtensionItem
let providers = item?.attachments ?? []
for provider in providers {
if provider.hasItemConformingToTypeIdentifier("org.idpf.epub-container") {
provider.loadItem(forTypeIdentifier: "org.idpf.epub-container", options: nil) { item, error in
if let url = item as? URL {
// 这是电子书文件
}
}
}
}
⚠️ 注意:
- 拿到的是临时沙盒 URL
- Extension 结束后会失效
4️⃣ 正确做法:立刻拷贝到 App Group
let fm = FileManager.default
let groupURL = fm.containerURL(
forSecurityApplicationGroupIdentifier: "group.your.app"
)!
let dest = groupURL.appendingPathComponent(url.lastPathComponent)
try fm.copyItem(at: url, to: dest)
主 App 再从 App Group 读入 → 入库 → 解析。
四、电子书 App 的「最佳 Share Extension 设计」
结合你之前的产品方向,我直接给你一个 V1 推荐方案:
✅ Share Extension V1(极简但好用)
- 无 UI(直接导入)
-
自动判断:
- txt → 直接打开
- epub → 解包
- zip → 解压后扫描
-
导入完成后:
- Toast:
已导入 3 本电子书 - 自动跳转主 App
- Toast:
📌 不要在 Extension 里做阅读 / 解析 / 解压 UI
五、真实建议(我不糖衣)
如果你是做 工具型 / 个人阅读 / 技术文档:
Share Extension = 比“登录 / 注册 / 云同步”重要
没有它:
- 用户文件进不来
- 获客全靠劝
有它:
- 一次成功导入 = 长期留存
六、如果你愿意,我可以继续帮你做的几件事
你可以直接选 👇
1️⃣ 给你一份「电子书 App + Share Extension」完整 V1 功能树
2️⃣ 帮你设计 Share Extension 的最小 UX(无 UI / 有 UI 对比)
3️⃣ 判断你现有 App,如何“自然引入电子书能力”而不重做架构
4️⃣ 告诉你:电子书 vs 视频类 Share Extension,哪条更容易变现
你现在这一步问得很对,这是真产品人才会卡的点。