首先我要说的是,我不熟悉目标c,也不是iOS开发人员。我正在开发一个本机应用程序,发现我不得不深入研究本机代码。所以,我感谢你对我的耐心,如果你对我可能或不知道的内容做出零假设,我也非常感激。 THX!
我尝试使用react-native-mail,但未能将我选择的照片附加到电子邮件中。
在排除故障时,我第一次跳进了Xcode的调试器。单步执行代码,似乎attachmentPath
类似于file:///var/mobile/...
的{{1}}被分配给变量fileData
作为类型NSData
。但是,在代码中更进一步,它变为nil
。
我不确定为什么会这样,也不知道如何解决这个问题。这是调试器会话的图像,其中3个屏幕截图并排拼接在一起。
欢迎提供所有指示,提示,指导和建议
答案 0 :(得分:0)
在第一个屏幕截图中,调试器仍在声明并分配fileData
变量的行上。这意味着该行尚未实际执行。 -dataWithContentsOfFile:
尚未被调用,因此fileData
中显示的值无意义;您所看到的只是实际分配变量之前的垃圾数据。在第二个屏幕截图中,-dataWithContentsOfFile:
方法已完成运行,并且已返回nil
。您需要做的是弄清楚您从nil
获得-dataWithContentsOfFile:
的原因。也许文件的路径不正确,或者您可能没有读取它的权限,或者您可能遇到沙盒问题。
我建议使用-dataWithContentsOfURL:options:error:
代替-dataWithContentsOfFile:
。这将通过引用返回错误(提前创建一个NSError
变量,将其分配给nil
,将指向错误的指针作为第三个参数传递给-dataWithContentsOfURL:options:error:
,然后检查如果方法返回nil
)则出错。更有可能的是,错误的内容将解释在尝试读取文件时出了什么问题。
attachmentPath
的内容描述中,我们可以看到它根本不是路径,而是包含一个URL字符串(带有方案file:
)。因此,您无法将其传递给使用路径的API。这没关系,因为基于URL的机制无论如何都是Apple建议使用的。因此,只需将字符串传递给-[NSURL URLWithString:]
(或更好,-[[NSURLComponents componentsWithString:] URL]
,因为它符合较新的RFC),只需将其转换为URL即可。所以,像:
// Get the URL string, which is *not* a path
NSString *attachmentURLString = [RCTConvert NSString:options[@"attachment"][@"path"]];
// Create a URL from the string
NSURL *attachmentURL = [[NSURLComponents componentsWithString:attachmentURLString] URL];
...
// Initialize a nil NSError
NSError *error = nil;
// Pass a pointer to the error
NSData *fileData = [NSData dataWithContentsOfURL:attachmentURL options:0 error:&error];
if (fileData == nil) {
// 'error' should now contain a non-nil value.
// Use this information to handle the error somehow
}