You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 17 Live Photo无法设壁纸(报错motion not available)求助

iOS 17 Live Photo 无法设为壁纸的适配方案

问题根源

iOS 17收紧了Live Photo的元数据校验规则,你手动构造的Live Photo Info字符串格式不符合系统要求,导致系统无法识别动态属性,触发“motion not available ios 17 swift”错误。另外你提供的代码存在拼写错误:lett addtwo需修正为let addtwo。

修复方案

1. 放弃手动拼接元数据字符串

系统对Live Photo Info的格式有严格的二进制规范,自定义字符串无法通过校验。建议直接从系统拍摄的合法Live Photo中提取元数据模板,或使用系统API构造正确的元数据项。

2. 确保关键元数据字段完整

iOS 17要求Live Photo必须包含以下mdta空间的元数据:

  • Live Photo Version:固定值为"1.0"
  • Live Photo Info:需为系统认可的二进制数据,而非UTF-8字符串

3. 修正后的代码示例

替换你当前的元数据构造逻辑,参考以下实现:

// 从系统拍摄的Live Photo中提取合规元数据(推荐方式)
func getValidLivePhotoMetadata() -> [AVMetadataItem]? {
    // 这里假设你已获取到一张系统拍摄的PHAsset实例
    guard let asset = fetchSystemLivePhotoAsset() else { return nil }
    
    var validMetadata: [AVMetadataItem]?
    let semaphore = DispatchSemaphore(value: 0)
    
    let options = PHAssetResourceRequestOptions()
    PHAssetResourceManager.default().requestData(for: asset, options: options) { data in
        let tempURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("temp_live.mov")
        try? data.write(to: tempURL)
        
        let avAsset = AVURLAsset(url: tempURL)
        validMetadata = avAsset.metadata.filter { item in
            guard let key = item.key as? String else { return false }
            return item.keySpace.rawValue == "mdta" && key.contains("Live Photo")
        }
        semaphore.signal()
    }
    semaphore.wait()
    return validMetadata
}

// 直接构造合规的元数据项(需确保Live Photo Info为正确二进制数据)
func buildLivePhotoMetadata() -> [AVMetadataItem] {
    // Live Photo Version 项
    let versionItem = AVMutableMetadataItem()
    versionItem.key = "Live Photo Version" as (NSCopying & NSObjectProtocol)?
    versionItem.keySpace = AVMetadataKeySpace(rawValue: "mdta")
    versionItem.value = "1.0" as (NSCopying & NSObjectProtocol)?
    versionItem.dataType = "com.apple.metadata.datatype.UTF-8"
    
    // Live Photo Info 项:需替换为从合法Live Photo中提取的二进制值
    let infoItem = AVMutableMetadataItem()
    infoItem.key = "Live Photo Info" as (NSCopying & NSObjectProtocol)?
    infoItem.keySpace = AVMetadataKeySpace(rawValue: "mdta")
    // 示例:从系统Live Photo中获取的value和dataType
    infoItem.value = /* 此处替换为合法的二进制数据 */ as (NSCopying & NSObjectProtocol)?
    infoItem.dataType = "com.apple.metadata.datatype.raw-data"
    
    return [versionItem, infoItem]
}

// 使用时
if let validMetadata = getValidLivePhotoMetadata() {
    assetWriter?.metadata = validMetadata
}

4. 验证文件结构

确保生成的Live Photo是HEIC图片+MOV视频的标准组合,iOS 17对文件完整性的校验更严格。

注意事项

  • 不要尝试手动生成Live Photo Info的字符串内容,系统内部使用的是二进制格式,自定义字符串无法被识别。
  • 测试时先确认系统拍摄的Live Photo可以正常设为壁纸,再对比你的生成文件的元数据和结构差异。

内容的提问来源于stack exchange,提问作者Marek Roslik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:08:31