Swift Share 扩展,ALAsset 为 nil

Posted

技术标签:

【中文标题】Swift Share 扩展,ALAsset 为 nil【英文标题】:Swift Share extension, ALAsset is nil 【发布时间】:2014-11-25 12:28:41 【问题描述】:

我想获得一些关于我将与共享扩展程序共享的图像的额外信息。我可以从 url 创建 UIImage,但是当我想获得 ALAsset 时,我得到了 nil。有人遇到过这个问题吗?

itemProvider!.loadItemForTypeIdentifier(String(kUTTypeImage), options: nil, completionHandler:  (decoder: NSSecureCoding!, error: NSError!) -> Void in
if ALAssetsLibrary.authorizationStatus() == ALAuthorizationStatus.Authorized 

                    if let url = decoder as? NSURL 
                        ALAssetsLibrary().assetForURL(url, resultBlock:  (myasset:ALAsset!) -> Void in

                            println(url)
                            println(fm.fileExistsAtPath(url.path!))
                            println(myasset)
                            let location = myasset?.valueForProperty(ALAssetPropertyLocation) as CLLocation?
                            let date = myasset?.valueForProperty(ALAssetPropertyDate) as NSDate?
                            self.extensionContext?.completeRequestReturningItems([AnyObject](), completionHandler: nil)

                        , failureBlock:  (myerror:NSError!) -> Void in


                        )
                    
                

输出是

file:///var/mobile/Media/DCIM/102APPLE/IMG_2977.JPG
true
nil

【问题讨论】:

我也遇到过同样的问题(使用objective-c)。它击中了结果块,但里面的资产为零。我觉得新的 ios 8 照片框架可能需要用于这个框架。希望不会。 【参考方案1】:

当务之急是您正在传递 file url 来代替此行的 asset url:ALAssetsLibrary().assetForURL(url, resultBlock: (myasset:ALAsset!) -> Void in。 共享扩展将 url 返回到 iphone 文件系统上的路径...形式为:file:///....。这些与 ALAsset 在 assetForURL 方法中所需的 url 不同。

不幸的是,虽然这使代码更正确,但它仍然不能解决问题。我花了一些时间使用许多不同的方法。通过AssetsLibrary 将新图像写入磁盘,并且给定的文件路径将在完成后返回一个资产 url,这将成功运行 - 尽管您显然不希望相机胶卷中出现重复的照片。 (注意:无法删除 ALAsset)。您可能会保留文件路径并在完成后删除新图像,​​但这是一种非常混乱的方法。

鉴于这些限制,我最终重写了我的方法。

【讨论】:

你是对的,我现在看到资产 url 的格式为 assets-library://asset/asset.JPG?id=00000000-0000-0000-0000-0000000006BD&ext=JPG 我想我根据我的 url 找不到这个 url :( 我花了很长时间尝试将文件 URL 转换为资产 URL。据我所知,这是不可能的。我什至认为相反的情况是不可能的(资产 URL 到文件 URL)。这似乎是 Apple 沙盒资产访问...可能是出于安全原因。

以上是关于Swift Share 扩展,ALAsset 为 nil的主要内容,如果未能解决你的问题,请参考以下文章

在 Share Extension (Swift) 中处理 NSItemProvider 数据类型

从文件 URL 中检索 ALAsset 或 PHAsset

swift中的Facebook Native Share对话框

带有 ALAsset 缩略图的低清晰度

在 Swift 1.2 中使用assetForURL

ALAsset 将资源转换为 NSData