qq_24927779 2025-12-03 16:22 采纳率: 0%
浏览 3

如何实现快捷指令截屏,分享到自己APP share Extension扩展

通过手机自带的快捷指令截屏,然后把图片共享给自己的share Extension扩展, 系统APP快捷指令,其中有一条指令是 与App共享,当我选择这条指令后选择APP里面只有默认的备忘录、健康、提醒事项、无边际 四个APP,我想把我自己的APP加入其中,并生成iCloud链接,好在APP里面自动跳转到这个快捷指令,请问该如何实现!我需要具体的操作步骤!

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2025-12-03 16:37
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    要实现通过 iOS 系统自带的快捷指令(Shortcuts) 实现 截屏 + 通过 Share Extension 扩展分享到自己的 App,并让自己的 App 出现在“与App共享”列表中,同时生成 iCloud 链接,以便在 App 内自动跳转到该快捷指令,你需要进行以下步骤:


    一、准备工作

    1. 确保你的 App 支持 Share Extension

    • 在 Xcode 中创建一个 Share Extension(即 ShareExtension target)。
    • Info.plist 文件中配置 NSExtension 的类型为 Share
    • 确保在 App 的主 Target 中添加了 Share Extension 的依赖。

    注意: Share Extension 是 iOS 10 之后引入的,不支持 iOS 9 及更早版本。


    二、让自己的 App 显示在“与App共享”列表中

    2. 配置 Share Extension 的 Info.plist 文件

    ShareExtension/Info.plist 文件中,添加以下字段:

    <key>NSExtension</key>
    <dict>
        <key>NSExtensionPrincipalClass</key>
        <string>$(PRODUCT_MODULE_NAME).ShareViewController</string>
        <key>NSExtensionPointIdentifier</key>
        <string>com.apple.share</string>
    </dict>
    
    <key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <string>WKUTTypeImage OR WKUTTypePNG OR WKUTTypeJPEG OR WKUTTypeTIFF OR WKUTTypeGIF</string>
    </dict>
    

    这些配置告诉系统,你的 Share Extension 可以处理图像类内容(如截图),从而出现在“与App共享”列表中。


    三、在 Share Extension 中接收图片并生成 iCloud 链接

    3. 在 ShareViewController 中接收图片并上传到 iCloud

    a. 获取用户分享的内容

    ShareViewController.swift 中重写以下方法:

    override func didSelectPost() {
        guard let item = extensionContext?.inputItems.first as? NSExtensionItem,
              let attachment = item.attachments.first as? NSLabeledData else {
            return
        }
    
        // 获取图片数据
        attachment.loadItem(forType: kUTTypeImage as String, completionHandler: { (data, error) in
            if let image = data as? UIImage {
                // 处理图片,比如上传到 iCloud 或本地
                self.uploadToiCloud(image: image)
            }
        })
    }
    

    b. 将图片上传到 iCloud 并生成链接

    你可以使用 iCloud Drive APIFirebase Storage 等方式上传图片,并返回一个 URL。这里以 Firebase 为例:

    func uploadToiCloud(image: UIImage) {
        guard let imageData = image.jpegData(compressionQuality: 0.8) else { return }
    
        let storageRef = Storage.storage().reference().child("screenshots/\(UUID().uuidString).jpg")
        storageRef.putData(imageData, completion: { _, error in
            if let error = error {
                print("Upload failed: $error)")
                return
            }
    
            storageRef.downloadURL { url, _ in
                if let link = url?.absoluteString {
                    self.openAppWithLink(link: link)
                }
            }
        })
    }
    

    四、在 App 中打开快捷指令页面

    4. 生成 URL Scheme 或 Universal Link

    为了在 App 中跳转到特定的快捷指令,你有两种方式:

    方式一:自定义 URL Scheme

    Info.plist 中添加:

    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>com.yourapp.scheme</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>yourapp</string>
            </array>
        </dict>
    </array>
    

    然后在 App 中监听该 scheme:

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if url.scheme == "yourapp" {
            // 打开指定的快捷指令页面
            if let shortcutID = url.host {
                // 使用 Shortcut API 打开快捷指令
                let shortcut = Shortcut(identifier: shortcutID)
                shortcut.open()
            }
        }
        return true
    }
    

    注意: iOS 不允许直接从 App 打开快捷指令,但可以通过 Shortcut API 触发执行。

    方式二:Universal Link(推荐)

    设置 Universal Link 后,可以在 App 中直接跳转到快捷指令的网页版或自定义页面。


    五、在快捷指令中生成链接并分享到你的 App

    5. 在快捷指令中添加“打开 App”动作

    1. 打开 快捷指令 App
    2. 创建新快捷指令。
    3. 添加 “打开 App” 动作,选择你的 App。
    4. 添加 “分享” 动作,选择 “与App共享”,然后选择你的 App。
    5. 最后添加 “生成链接” 动作,将链接保存为文件或发送给用户。

    你也可以通过代码动态生成链接,让用户点击后自动跳转到你的 App。


    六、测试和调试

    6. 测试流程

    1. 在快捷指令中截屏并选择“与App共享”,确保你的 App 出现在列表中。
    2. 点击你的 App,触发 Share Extension。
    3. 检查是否成功上传图片并生成链接。
    4. 通过 URL 跳转到你的 App,并验证是否能正确打开快捷指令。

    七、完整解决方案总结(有序列表)

    1. 创建 Share Extension

      • 在 Xcode 中新建 Share Extension Target。
      • 配置 Info.plist 以支持图像类型。
    2. 实现 Share Extension 的图片接收功能

      • ShareViewController.swift 中接收图片并上传到 iCloud。
    3. 生成 iCloud 链接

      • 使用 Firebase 或 iCloud Drive 存储图片并生成下载链接。
    4. 在 App 中处理链接

      • 设置 URL Scheme 或 Universal Link,用于跳转到快捷指令。
    5. 在快捷指令中添加“与App共享”动作

      • 确保你的 App 出现在“与App共享”列表中。
    6. 测试整个流程

      • 截图 → 选择你的 App → 上传图片 → 生成链接 → App 跳转到快捷指令。

    八、示例代码片段(修改后的 ShareViewController)

    import UIKit
    import MobileCoreServices
    
    class ShareViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil)
        }
    
        override func didSelectPost() {
            guard let item = extensionContext?.inputItems.first as? NSExtensionItem,
                  let attachment = item.attachments.first as? NSLabeledData else {
                return
            }
    
            attachment.loadItem(forType: kUTTypeImage as String, completionHandler: { (data, error) in
                if let image = data as? UIImage {
                    self.uploadToiCloud(image: image)
                }
            })
        }
    
        func uploadToiCloud(image: UIImage) {
            guard let imageData = image.jpegData(compressionQuality: 0.8) else { return }
    
            let storageRef = Storage.storage().reference().child("screenshots/\(UUID().uuidString).jpg")
            storageRef.putData(imageData, completion: { _, error in
                if let error = error {
                    print("Upload failed: $error)")
                    return
                }
    
                storageRef.downloadURL { url, _ in
                    if let link = url?.absoluteString {
                        self.openAppWithLink(link: link)
                    }
                }
            })
        }
    
        func openAppWithLink(link: String) {
            if let url = URL(string: "yourapp://shortcutID") {
                UIApplication.shared.open(url, options: [:], completionHandler: nil)
            }
        }
    }
    

    九、注意事项

    • 权限问题:确保你的 App 和 Share Extension 有正确的权限。
    • iCloud 配置:如果使用 iCloud,需在 Apple Developer 中启用 iCloud 服务。
    • 快捷指令限制:iOS 不允许直接从 App 打开快捷指令,只能通过 URL Scheme 或 Universal Link 跳转。

    如果你需要进一步帮助,例如如何设置 Firebase、iCloud 或 Universal Link,请告诉我!我可以提供详细教程。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月3日