今天使用Xcode打包失败了。。
屏幕快照 2019-08-16 下午5.02.35.png点击“Show Logs”查看日志得到以下错误信息:
{
code = 679;
description = "ipatool failed with an exception: #<CmdSpec::NonZeroExcitException: /usr/bin/python exited with pid 54505 exit 1\nStdout:\n\nStderr:\n Traceback (most recent call last):\n File \"<string>\", line 1, in <module>\n AttributeError: 'str' object has no attribute 'decode'\n>\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:227:in `run'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:210:in `run'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:139:in `unicode_equal?'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:1758:in `block in MakeFileSystemNode'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:1758:in `each'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:1758:in `detect'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:1758:in `MakeFileSystemNode'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:1461:in `initialize'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:2355:in `new'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:2355:in `ProcessIPA'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:3009:in `<main>'";
info = {
};
level = ERROR;
type = exception;
}
可以看出来,错误信息是在ipatool脚本:
/Applications/Xcode.app/Contents/Developer/usr/bin/ipatool这个python文件中
我们找到这个文件:
屏幕快照 2019-08-16 下午5.12.04.png
然后找到第227行:
屏幕快照 2019-08-16 下午5.13.04.png确实是NonZeroExcitException错误,接下来找到210行,是调用run这个方法,没什么问题。继续找第139行,137-140行内容为:
# We still support Ruby 2.0, so we need a workaround for unicode equivalence
def unicode_equal?(other)
return CmdSpec.new(locate_tool("python"), ["-c", "import sys; import unicodedata; print(unicodedata.normalize('NFC', sys.argv[1].decode('utf-8')) == unicodedata.normalize('NFC', sys.argv[2].decode('utf-8')))", self, other]).run(0, false, true).strip == "True"
end
我们看到了一个decode函数,这个和报错内容:
AttributeError: 'str' object has no attribute 'decode'
匹配上了。我们修改一下这个Python文件,将decode改为encode之后保存,再运行,继续报错。。
{
code = 679;
description = "ipatool failed with an exception: #<CmdSpec::NonZeroExcitException: /usr/bin/python exited with pid 55146 exit 1\nStdout:\n\nStderr:\n Traceback (most recent call last):\n File \"<string>\", line 1, in <module>\n TypeError: normalize() argument 2 must be str, not bytes\n>\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:227:in `run'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:210:in `run'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:139:in `unicode_equal?'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:1758:in `block in MakeFileSystemNode'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:1758:in `each'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:1758:in `detect'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:1758:in `MakeFileSystemNode'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:1461:in `initialize'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:2355:in `new'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:2355:in `ProcessIPA'\n /Applications/Xcode.app/Contents/Developer/usr/bin/ipatool:3009:in `<main>'";
info = {
};
level = ERROR;
type = exception;
}
这次的报错是:
TypeError: normalize() argument 2 must be str, not bytes
报错不一样了,是python字符串的问题,将137-140行内容改为:
# We still support Ruby 2.0, so we need a workaround for unicode equivalence
def unicode_equal?(other)
return CmdSpec.new(locate_tool("python"), ["-c", "import sys; import unicodedata; print(unicodedata.normalize('NFC', sys.argv[1].encode('unicode_escape').decode('utf-8')) == unicodedata.normalize('NFC', sys.argv[2].encode('unicode_escape').decode('utf-8')))", self, other]).run(0, false, true).strip == "True"
end
请注意核心改动的地方是:
print(unicodedata.normalize('NFC', sys.argv[1].encode('unicode_escape').decode('utf-8')) == unicodedata.normalize('NFC', sys.argv[2].encode('unicode_escape').decode('utf-8'))
Python2.x版本中字符串默认ASCII编码,有decode方法,decode成Unicode编码;Python3.x版本中默认是Unicode编码,我是先把他转成ASCII编码,然后解码的。
效果:
屏幕快照 2019-08-19 上午10.57.27.png可以继续正常打包了~
加油~
网友评论