iOS应用扩展的最大内存预算

yws3nbqq  于 2023-05-08  发布在  iOS
关注(0)|答案(3)|浏览(213)

根据Apple的App Extension Programming Guide:
运行应用扩展的内存限制明显低于前台应用的内存限制。在这两个平台上,系统可能会主动终止扩展,因为用户希望返回到主机应用程序中的主要目标。某些扩展的内存限制可能低于其他扩展:例如,小部件必须特别高效,因为用户可能同时打开多个小部件。
应用扩展有非常严格的内存限制,并且各不相同.
每种类型的应用程序扩展的最大内存预算是多少?
我可以像iOS App ios app maximum memory budget一样测试它们吗?

4xrmg8kj

4xrmg8kj1#

我刚刚在iPad Pro 9.7上遇到了一个崩溃消息:

Thread 1: EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=120 MB, unused=0x0)

因此,在2GB iOS设备上为120 MB,但请注意,限制因扩展类型而异

示例:

苹果确认网络扩展的内存限制为5-6MB,从iOS 10 Beta 2提高到15MB。这些限制不适用于某些应用程序(请参阅Psiphon3 ticket)。
测试VPN(网络扩展的NEPacketTunnelProvider)产生以下错误:

Thread 1: EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=15 MB, unused=0x0)
oo7oh9g9

oo7oh9g92#

在我的例子中,我试图在UIImageView中显示5500 x 3000 px的图像,它在iPhone SE上崩溃(EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=120 MB, unused=0x0)),但在模拟器上没有。
运行内存配置文件有助于找出问题。在分配给UIImageView.image之前缩小图像已修复此问题。

6ioyuze2

6ioyuze23#

我试图通过扩展从共享图像创建缩略图,并看到当从NSItemProvider提供的url加载UIImage,然后通过以下方式创建缩略图时:

UIGraphicsImageRenderer(bounds: thumbnailBounds).image { context in
   image.draw(in: thumbnailBounds)
}

对于较大的图像,会导致扩展(> 120 MB)上的内存溢出。对我来说,解决方案是在直接从url创建UIImage之前对图像进行降采样,以合理的像素大小为我的应用程序,这样它就可以通过共享扩展进行管理,而不会导致内存溢出。

private func resizeForUpload(_ imageURL: URL) -> UIImage? {
    let imageSourceOptions = [kCGImageSourceShouldCache: false] as CFDictionary
    let maxDimensionInPixels: CGFloat = 2000
    let downsampleOptions = [kCGImageSourceCreateThumbnailFromImageAlways: true,
                                     kCGImageSourceShouldCacheImmediately: true,
                               kCGImageSourceCreateThumbnailWithTransform: true,
                                      kCGImageSourceThumbnailMaxPixelSize: maxDimensionInPixels] as CFDictionary
    
    guard let imageSource = CGImageSourceCreateWithURL(imageURL as CFURL, imageSourceOptions), let downsampledImage =  CGImageSourceCreateThumbnailAtIndex(imageSource, 0, downsampleOptions) else {
        return nil
    }
    
    return UIImage(cgImage: downsampledImage)
}

这是使用private func resizeForUpload(_ imageURL: URL) -> UIImage?的方法

if itemProvider.hasItemConformingToTypeIdentifier(SystemUTType.image) {
        itemProvider.loadItem(forTypeIdentifier: SystemUTType.image, options: nil) { secureCoding, error in
            if let url = secureCoding as? URL,
               let image = self.resizeForUpload(url) {
                // The iOS Photos app comes here.
                completion(image, nil)
            } else if let image = secureCoding as? UIImage {
                // The iOS screenshot editor comes here.
                // The iOS Notes app comes here.
                completion(image, nil)
            } else if let data = secureCoding as? Data,
                       let image = UIImage(data: data) {
                completion(image, nil)
            } else {
                completion(nil, error)
            }
        }

相关问题