Xcode 12.5.1中FirebaseSessions Swift类型转换错误求助
iOS集成Firebase时的UnsafeRawPointer类型转换错误解决方法
问题描述
按教程将Firebase集成到React Native iOS应用后,编译时出现类型转换错误,错误指向SessionStartEvent.swift中的pb_istream_from_buffer调用,具体错误信息:
Cannot convert value of type 'UnsafeRawPointer' to expected argument type 'UnsafePointer<pb_byte_t>?' (aka 'Optional
')
相关代码片段
Podfile配置
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' platform :ios, min_ios_version_supported prepare_react_native_project! flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled linkage = ENV['USE_FRAMEWORKS'] if linkage != nil Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green use_frameworks! :linkage => linkage.to_sym end target 'stllrmobile' do config = use_native_modules! use_frameworks! :linkage => :static #$RNFirebaseAsStaticFramework = true flags = get_default_flags() use_react_native!( :path => config[:reactNativePath], :hermes_enabled => flags[:hermes_enabled], :fabric_enabled => flags[:fabric_enabled], #:flipper_configuration => flipper_config, :app_path => "#{Pod::Config.instance.installation_root}/.." ) target 'stllrmobileTests' do inherit! :complete end post_install do |installer| react_native_post_install( installer, :mac_catalyst_enabled => false ) __apply_Xcode_12_5_M1_post_install_workaround(installer) end end
出错的Swift代码(SessionStartEvent.swift)
func encodeDecodeEvent() -> firebase_appquality_sessions_SessionEvent { let transportBytes = self.transportBytes() var proto = firebase_appquality_sessions_SessionEvent() var fields = firebase_appquality_sessions_SessionEvent_fields let bytes = (transportBytes as NSData).bytes var istream: pb_istream_t = pb_istream_from_buffer(bytes, transportBytes.count) if !pb_decode(&istream, &fields.0, &proto) { let errorMessage = FIRSESPBGetError(istream) if errorMessage.count > 0 { Logger.logError("Session Event failed to decode transportBytes: \(errorMessage)") } } return proto }
错误发生在这一行:
var istream: pb_istream_t = pb_istream_from_buffer(bytes, transportBytes.count)
解决方法
1. 修复Swift代码的类型转换
(transportBytes as NSData).bytes返回的是UnsafeRawPointer,而pb_istream_from_buffer需要的是UnsafePointer<pb_byte_t>,需显式转换类型:
替换原有的let bytes = ...行:
let bytes = (transportBytes as NSData).bytes.assumingMemoryBound(to: pb_byte_t.self) var istream: pb_istream_t = pb_istream_from_buffer(bytes, transportBytes.count)
或者使用Swift原生Data的安全API(更推荐):
func encodeDecodeEvent() -> firebase_appquality_sessions_SessionEvent { let transportBytes = self.transportBytes() var proto = firebase_appquality_sessions_SessionEvent() var fields = firebase_appquality_sessions_SessionEvent_fields var istream: pb_istream_t = pb_istream_from_buffer(nil, 0) transportBytes.withUnsafeBytes { buffer in guard let baseAddress = buffer.baseAddress else { Logger.logError("Failed to get buffer address for session event") return } let bytes = baseAddress.assumingMemoryBound(to: pb_byte_t.self) istream = pb_istream_from_buffer(bytes, transportBytes.count) } if !pb_decode(&istream, &fields.0, &proto) { let errorMessage = FIRSESPBGetError(istream) if errorMessage.count > 0 { Logger.logError("Session Event failed to decode transportBytes: \(errorMessage)") } } return proto }
2. 调整Podfile配置
取消$RNFirebaseAsStaticFramework = true的注释,确保Firebase框架以静态方式链接:
# 取消注释这一行 $RNFirebaseAsStaticFramework = true
然后重新执行pod安装:
cd ios && pod install --repo-update
3. 清理缓存并重新编译
- 在Xcode中按下
Cmd+Shift+K清理项目缓存 - 删除DerivedData目录(可通过Xcode偏好设置 -> 位置 找到路径后手动删除)
- 重新运行项目
内容的提问来源于stack exchange,提问作者user3054529
相关产品推荐
相关产品推荐

