• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iOS 共享扩展未获取图像

[复制链接]
菜鸟教程小白 发表于 2022-12-13 11:41:48 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我敢肯定,一旦有人好心地为我指出正确的方向,这就变得微不足道了,所以我很抱歉问了一个愚蠢的问题。但是我一直在寻找几天我无法弄清楚我做错了什么。

场景:创建一个接收图像文件的简单共享扩展

问题:当我访问附件时,处理程序从未被调用,尽管我可以在 itemProvider 中看到“public.jpg”但我看不到数据在哪里?

我做了什么:

1) defined NSExtensionActivationSupportsImageWithMaxCount = 1 as my only activation rule
2) added CoreMedia framework to the extension
3) added the same group to both app and app extension
4) made sure both have the group (1) in the entitlement
5) made sure both are using a certificate/app id with that group enabled
6) clean and rebuild several times to no avail.

代码:

- (void)didSelectPost {
/
for (NSExtensionItem *item in self.extensionContext.inputItems) {
    for (NSItemProvider *itemProvider in item.attachments) {
        if ([itemProvider hasItemConformingToTypeIdentifierNSString *)kUTTypeImage]) {
I can hit this breakpoint --> [itemProvider loadItemForTypeIdentifierNSString *)kUTTypeImage options:nil completionHandler:^(UIImage *image, NSError *error) {
but not this one --> photo = image;
            }];
            break;
        }
    }
}
.... and so on and so forth



Best Answer-推荐答案


您还没有发布完整的代码,但我怀疑您在错误的位置调用了 completeRequestReturningItems:completionHandler::

错误:

- (void)didSelectPost {
        NSExtensionItem *item = self.extensionContext.inputItems.firstObject;
        NSItemProvider *itemProvider = item.attachments.firstObject;
        if ([itemProvider hasItemConformingToTypeIdentifierNSString *)kUTTypeImage]) {
            [itemProvider loadItemForTypeIdentifierNSString *)kUTTypeImage
                                            options:nil
                                  completionHandler:^(NSURL *url, NSError *error) {
                                      // send the image
                                  }];
        }
        // ↓ this is the wrong location ↓
        [self.extensionContext completeRequestReturningItems[] completionHandler:nil];
    }

问题是调用 completeRequestReturningItems:completionHandler: 会立即关闭 ShareViewController 并释放它。因此,包含图像的 NSItemProvider 在它可以访问图像之前也会被销毁(因为它异步加载其项目)。换句话说:您将图像发送到服务器的完成处理程序永远不会被调用,因为整个 shareViewController 已经被释放。

要解决该问题,您必须在发送图像后将对 completeRequestReturningItems:completionHandler: 的调用移动到完成处理程序的末尾。

正确:

- (void)didSelectPost {
    NSExtensionItem *item = self.extensionContext.inputItems.firstObject;
    NSItemProvider *itemProvider = item.attachments.firstObject;
    if ([itemProvider hasItemConformingToTypeIdentifierNSString *)kUTTypeImage]) {
        [itemProvider loadItemForTypeIdentifierNSString *)kUTTypeImage
                                        options:nil
                              completionHandler:^(NSURL *url, NSError *error) {
                                  // send the image
                                  [self.extensionContext completeRequestReturningItems[]         
                                                                     completionHandler:nil];
                              }];
    }
}

关于iOS 共享扩展未获取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32525448/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap