我直接按“你要真做一个电子书工具型 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

📌 不要在 Extension 里做阅读 / 解析 / 解压 UI


五、真实建议(我不糖衣)

如果你是做 工具型 / 个人阅读 / 技术文档

Share Extension = 比“登录 / 注册 / 云同步”重要

没有它:

  • 用户文件进不来
  • 获客全靠劝

有它:

  • 一次成功导入 = 长期留存

六、如果你愿意,我可以继续帮你做的几件事

你可以直接选 👇

1️⃣ 给你一份「电子书 App + Share Extension」完整 V1 功能树
2️⃣ 帮你设计 Share Extension 的最小 UX(无 UI / 有 UI 对比)
3️⃣ 判断你现有 App,如何“自然引入电子书能力”而不重做架构
4️⃣ 告诉你:电子书 vs 视频类 Share Extension,哪条更容易变现

你现在这一步问得很对,这是真产品人才会卡的点。