Xamarin Forms如何访问iOS及Android项目中自定义的p12格式证书文件
问题根因
你当前使用的Environment.SpecialFolder.LocalApplicationData指向的是应用运行时可读写的沙盒数据目录,而放在项目Resources文件夹下的p12属于安装包内置的捆绑资源,两类文件存储路径完全独立,所以直接拼接路径读取必然返回不存在。项目内置的捆绑资源需要调用各平台专属的资源API读取,具体方案如下:
Android 平台操作步骤
- 将p12证书放入Android项目的
Resources/raw目录,无该目录可手动新建 - 证书文件命名仅支持小写字母、数字、下划线,不允许大写和特殊字符,可将证书重命名为
merchant_test_certificate_1234679304.p12 - 读取示例代码:
// 获取资源ID int resId = Resources.GetIdentifier("merchant_test_certificate_1234679304", "raw", PackageName); if (resId == 0) { // 资源未找到,检查命名和存放路径 return; } // 读取资源为流 using Stream certStream = Resources.OpenRawResource(resId); // 转换为字节数组备用 byte[] certBuffer = new byte[certStream.Length]; certStream.Read(certBuffer, 0, certBuffer.Length);
如果是MAUI项目,可通过Platform.CurrentActivity获取当前Activity实例后调用上述Resources相关方法。
iOS 平台操作步骤
- 将p12证书放入iOS项目的
Resources目录,右键文件打开属性面板,设置生成操作为BundleResource - 读取示例代码:
// 获取资源路径 string certPath = NSBundle.MainBundle.PathForResource("Merchant_TestCertificate_1234679304", "p12"); if (string.IsNullOrEmpty(certPath)) { // 资源未找到,检查生成操作配置和文件名 return; } // 直接读取为字节数组 byte[] certBuffer = File.ReadAllBytes(certPath);
可选:转存到本地沙盒方便后续访问
如果需要多次读取证书,可在第一次读取后将文件写入LocalApplicationData目录,之后就可以用你原有的代码直接访问:
string localPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Merchant_TestCertificate_1234679304.p12"); // 第一次读取资源后写入本地 File.WriteAllBytes(localPath, certBuffer); // 后续可直接判断本地文件是否存在 bool doesExist = File.Exists(localPath);
内容的提问来源于stack exchange,提问作者Nabil Akhlaque
相关产品推荐
相关产品推荐

