由于清单 pass.json 字符串格式,.pkpass 创建失败?

Posted

技术标签:

【中文标题】由于清单 pass.json 字符串格式,.pkpass 创建失败?【英文标题】:.pkpass create fail because of manifest pass.json string format? 【发布时间】:2016-12-01 09:31:39 【问题描述】:

这是一个很奇怪的问题。

我使用C#创建了一个pass.json并将其保存到memoryStream,它工作正常。之后,我创建了 manifest.json SHA1 数据,其中包括那个 pass.json,manifest.json 的字符串就像这样,它是完全正确的。

"icon.png":     "9423bd00e2b01c59a3265c38b5062fac7da0752d",
 "icon@2x.png": "4d1db55bdaca70b685c013529a1c0dcbd7046524",
 "logo.png":     "ee5b053e63dbfe3b78378c15d163331d68a0ede8",
 "logo@2x.png": "2f9e3a55bded1163620719a4d6c1ad496ed40c17",
 "pass.json":    "fd68bf77757d3057263a9aca0e5110ddd933934a"

生成pkpass作为我的手机后,打不开。我将 pass.json SHA1 代码更改为“fd68bf77757d3057263a9aca0e5110ddd933934a”而不使用值来保存它,它可以工作

编码如下:

// This version run success
var strPass = javascriptSerialize(details);
var sw = new StreamWriter(assetsFolder + @"pass.json");
sw.Write(strPass);
sw.Close();
manifest.passjson = GetSha1Hash(assetsFolder + manifest.GetAssetBoardingPass(libPkPass_object_boardingPass.JsonObjects.AssetTypes.passjson));

//manifest.passjson = "2f9e3a55bded1163620719a4d6c1ad496ed40c17"
// end

// This version run fail
var strPass = JavascriptSerialize(details);
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(strPass);
writer.Write(s);
writer.Flush();
stream.Position = 0;
var a = GetSha1HashMemory(passStream);
    private static string GetSha1HashMemory(Stream passStream)
    

        //var bs = new BufferedStream(passStream);
        using (SHA1Managed sha = new SHA1Managed())
        
            byte[] checksum = sha.ComputeHash(passStream);
            string sendCheckSum = BitConverter.ToString(checksum)
                .Replace("-", string.Empty);
            return sendCheckSum.ToString().ToLower();
        
    
manifest.passjson = a;

//manifest.passjson = "2f9e3a55bded1163620719a4d6c1ad496ed40c17" (same data )
//end

这是怎么回事??????我可以找出任何字符串错误的问题。 pkpass 提供在here (sendspace)。

谁能告诉我哪里出了问题?

非常感谢!

【问题讨论】:

【参考方案1】:

两个错误:ComputeHash(Stream)使用Stream

ComputeHash(Stream) : ComputeHash流只使用System.IO.Stream,不使用MemoryStream,改成ComputeHash(bytes[])即可处理

使用流:我尝试将流传递给其他函数,这不是一个很好的例子,流需要创建一个新的流,它可能会替换您计算机流中的一些字节。在这种情况下,我只需要调用这个函数就会打开一个新的,它会修复

                StringBuilder formatted;
                using (var sha1 = new SHA1Managed())
                
                    //var bytePass = ReadFully(passStream);
                    var bytePass = passStream.ToArray();
                    var hash = sha1.ComputeHash(bytePass);
                    formatted = new StringBuilder(2 * hash.Length);
                    foreach (var b in hash)
                    
                        formatted.AppendFormat("0:X2", b);
                    
                
                manifest.passjson = formatted.ToString().ToLower();

【讨论】:

以上是关于由于清单 pass.json 字符串格式,.pkpass 创建失败?的主要内容,如果未能解决你的问题,请参考以下文章

资源清单

Kubernetes——yaml资源清单

购物清单

Ansible之YAML,Inventory(主机清单)介绍

剑客Ansible拔剑--YAML语言与Inventory主机清单

由于这个原因,在.net世界中使用了清单