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
相关产品推荐
相关产品推荐

