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

iOS端SendBird问题:无法接收相机拍摄照片但可接收图库图片

解决SendBird相机拍摄图片无法触发消息回调的问题

我之前也碰到过一模一样的坑!核心问题出在相机模式下UIImagePickerControllerReferenceURL为空,导致你生成的文件名无效,SendBird处理这类消息时出现异常,最终消息没发出去,自然收不到didReceiveMessage回调。

问题分析

当sourceType是UIImagePickerControllerSourceTypeCamera时,系统返回的info字典里没有UIImagePickerControllerReferenceURL这个键,你用[imagePath lastPathComponent]拿到的imageName会是空字符串或nil。SendBird对无效文件名的文件消息处理有隐性限制,会导致发送流程静默失败。

修正后的代码

我调整了文件名生成逻辑,同时补全了错误排查的关键日志,你可以直接替换使用:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    [picker dismissViewControllerAnimated:YES completion:nil];
    
    // 1. 先校验原始图片是否获取成功
    UIImage *originalImage = info[UIImagePickerControllerOriginalImage];
    if (!originalImage) {
        NSLog(@"Failed to capture or select image");
        return;
    }
    
    // 2. 转换图片为JPEG数据,避免空数据
    NSData *imageFileData = UIImageJPEGRepresentation(originalImage, 0.5);
    if (!imageFileData) {
        NSLog(@"Failed to convert image to JPEG format");
        return;
    }
    
    // 3. 分场景生成有效文件名
    NSString *imageName;
    NSURL *imagePath = info[UIImagePickerControllerReferenceURL];
    if (imagePath) {
        // 相册选图:使用原文件名称
        imageName = imagePath.lastPathComponent;
    } else {
        // 相机拍照:用时间戳生成唯一文件名
        NSString *timestamp = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
        imageName = [NSString stringWithFormat:@"camera_shot_%@.jpg", timestamp];
    }
    
    // 4. 发送文件消息,同时添加错误回调日志
    [self.currentChannel sendFileMessageWithBinaryData:imageFileData 
                                              filename:imageName 
                                                  type:@"image/jpg" 
                                                  size:imageFileData.length 
                                                  data:nil 
                                      completionHandler:^(SBDFileMessage * _Nullable fileMessage, SBDError * _Nullable error) {
        if (error) {
            // 重点!这里的错误日志能帮你快速定位发送失败原因
            NSLog(@"Send file message error: %@", error.localizedDescription);
            return;
        }
        NSLog(@"Image message sent successfully, URL: %@", fileMessage.url);
    }];
}

额外注意事项

  • 务必不要忽略completionHandler里的错误回调!之前你留空了这个回调,相机模式下发送失败时完全无法排查问题,加个日志能帮你快速定位各类发送异常。
  • 相机模式下info字典的键和相册模式不同,比如还可以通过UIImagePickerControllerMediaMetadata获取拍照的元数据,但文件名必须自行生成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:07:31