0

我有一个在 Android 中正常运行的完整游戏,并且已经在 Play 商店上发布。现在我想在 iTunes 上提交它。当我开始为 iOS 构建相同的项目时,我得到了这个奇怪的错误 -

IOException: Sharing violation on path /Users/abhi/Projects/Unity/XCode Proj/Hammer Inc/Unity-iPhone.xcodeproj/project.pbxproj
System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean anonymous, FileOptions options) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.IO/FileStream.cs:320)
System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share)
(wrapper remoting-invoke-with-check) System.IO.FileStream:.ctor (string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare)
System.IO.File.OpenRead (System.String path) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.IO/File.cs:363)
System.IO.StreamReader..ctor (System.String path, System.Text.Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.IO/StreamReader.cs:167)
System.IO.StreamReader..ctor (System.String path)
(wrapper remoting-invoke-with-check) System.IO.StreamReader:.ctor (string)
System.IO.File.OpenText (System.String path) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.IO/File.cs:368)
System.IO.File.ReadAllLines (System.String path) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.IO/File.cs:560)
AdColonyPostProcessBuild.updateXcodeProject (System.String pbxProjectFilePath, System.String thirdPartyFrameworkDirectoryPath, .Framework[] frameworksToAdd) (at Assets/Editor/AdColonyPostProcessBuild.cs:356)
AdColonyPostProcessBuild.OnPostProcessBuild (BuildTarget target, System.String path) (at Assets/Editor/AdColonyPostProcessBuild.cs:340)
UnityEditor.HostView:OnGUI()

我收到了这个错误,因为我在使用 GPG 插件时遇到了一些问题,并且如此所述,我删除了与 Google Play 游戏相关的文件和文件夹,因为我计划在 iOS 中使用 Game Center。

我目前在同一个项目中使用 Native-X、Adcolony、Revmob(我知道这太多了,但这是由于选择合适网络的实验所致)。我不确定哪个插件导致冲突。

我尝试删除 AdColonyPostProcessBuild.cs 文件,但它给出了以下错误 -

KeyNotFoundException: The given key was not present in the dictionary.
System.Collections.Generic.Dictionary`2[TKey,TValue].get_Item (.TKey
key) (at
/Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/
corlib/System.Collections.Generic/Dictionary.cs:150)
UnityEditor.XCodeEditor.PBXResolver.ResolveName (System.String guid) (at
Assets/Editor/iOS/PBX Editor/PBXParser.cs:49)
UnityEditor.XCodeEditor.PBXResolver.ResolveName (System.String guid) (at
Assets/Editor/iOS/PBX Editor/PBXParser.cs:53)
UnityEditor.XCodeEditor.PBXParser.GUIDComment (System.String guid,
System.Text.StringBuilder builder) (at Assets/Editor/iOS/PBX
Editor/PBXParser.cs:218)
UnityEditor.XCodeEditor.PBXParser.SerializeString (System.String
aString, System.Text.StringBuilder builder, Boolean useQuotes, Boolean
readable) (at Assets/Editor/iOS/PBX Editor/PBXParser.cs:546)
UnityEditor.XCodeEditor.PBXParser.SerializeDictionary
(System.Collections.Generic.Dictionary`2 dictionary,
System.Text.StringBuilder builder, Boolean readable, Int32 indent) (at
Assets/Editor/iOS/PBX Editor/PBXParser.cs:481)
UnityEditor.XCodeEditor.PBXParser.SerializeValue (System.Object value,
System.Text.StringBuilder builder, Boolean readable, Int32 indent) (at
Assets/Editor/iOS/PBX Editor/PBXParser.cs:439)
UnityEditor.XCodeEditor.PBXParser.SerializeDictionary
(System.Collections.Generic.Dictionary`2 dictionary,
System.Text.StringBuilder builder, Boolean readable, Int32 indent) (at
Assets/Editor/iOS/PBX Editor/PBXParser.cs:489)
UnityEditor.XCodeEditor.PBXParser.SerializeValue (System.Object value,
System.Text.StringBuilder builder, Boolean readable, Int32 indent) (at
Assets/Editor/iOS/PBX Editor/PBXParser.cs:439)
UnityEditor.XCodeEditor.PBXParser.Encode
(UnityEditor.XCodeEditor.PBXDictionary pbxData, Boolean readable) (at
Assets/Editor/iOS/PBX Editor/PBXParser.cs:177)
UnityEditor.XCodeEditor.XCProject.CreateNewProject
(UnityEditor.XCodeEditor.PBXDictionary result, System.String path) (at
Assets/Editor/iOS/XCProject.cs:620)
UnityEditor.XCodeEditor.XCProject.Save () (at
Assets/Editor/iOS/XCProject.cs:645) XCodePostProcess.OnPostProcessBuild
(BuildTarget target, System.String path) (at
Assets/Editor/iOS/XCodePostProcess.cs:35) UnityEditor.HostView:OnGUI()

以前有没有人遇到过这个问题并找到任何解决方案?我不想从项目中删除每个 SDK 并重新开始构建它。

4

2 回答 2

2

我看你有几个问题。这听起来很糟糕。但是,我绝对愿意提供帮助。

发生了什么:

关于您提供的第一个错误,它似乎在读取 Unity 为 iOS 构建过程创建的 pbxproj 文件时遇到问题。

通常,在为 iOS 构建时,Unity 将创建一个 .pbxproj 文件以及其他 XCode 项,然后将其放置在您指定的目标构建目录中。之后,它会触发开发人员已经挂钩的任何后期处理构建逻辑。

AdColony 的 AdColonyPostProcessBuild.cs 文件一般打算在后处理构建逻辑的最后运行,因为我们依赖于解析 .pbxproj 文件本身,然后逐行添加信息。我们更喜欢最后这样做的原因是因为这个问题的当前解决方案不一定能促进我们需要的所有配置,但其他开发人员使用它。

第一个错误看起来像是访问冲突问题,AdColonyPostProcessBuild 无法访问 .pbxproj 文件,因此它可以读取所有行。正因为如此,它抛出了这里看到的 IOException:

IOException:在路径 /Users/abhi/Projects/Unity/XCode Proj/Hammer Inc/Unity-iPhone.xcodeproj/project.pbxproj 上共享冲突

System.IO.File.ReadAllLines(System.String 路径)(位于 /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.IO/File.cs:560)AdColonyPostProcessBuild。 updateXcodeProject (System.String pbxProjectFilePath, System.String thirdPartyFrameworkDirectoryPath, .Framework[] frameworksToAdd) (在 Assets/Editor/AdColonyPostProcessBuild.cs:356)

这让我想到了下一点。

您列出的第二个错误是由称为“XCode Editor For Unity”的替代后期处理构建逻辑引起的。

你可以在这里找到它:

https://github.com/dcariola/XCodeEditor-for-Unity

此解决方案是称为 mod_pbxproj 的解决方案的 C# 实现,其他开发人员已选择此解决方案。但是,当将它与 AdColony 结合使用时,如果在 AdColonyPostProcessBuild.cs 运行之后执行 Unity 的 XCode 编辑器,它通常会中断。

这是因为在运行 AdColonyPostProcessBuild.cs 时,用于 Unity 解析的 XCode 编辑器的某些信息已被复制并被读取两次。

AdColony 已将我们的后期处理逻辑配置为最后运行,依赖于在 XCode Editor For Unity 运行后解析信息的能力。

建议的解决方案

您提供的信息非常有帮助,但很难确定为什么会出现这些信息。

如果您可以列出您正在使用的任何其他插件,这些插件具有适用于 iOS 构建的后期处理构建,并且您还可以提供任何关于它们的优先级或构建时出现顺序的指示,那么将有助于此过程。

之后,我在您的错误输出中看到的行号似乎与我们当前可用包中 AdColonyPostProcessBuild.cs 文件的当前版本有点不一致。

我首先建议转到此链接,下载当前包,然后重新导入 AdColonyPostProcessBuild.cs https://github.com/AdColony/AdColony-Unity-SDK

如果这不能解决问题,我将打开 AdColonyPostProcessBuild.cs 文件并将其优先级更改为较低,最好是最后一个要运行的后期处理构建项目。您可以通过将第 302 行上的数字“200”更改为一个很大的数字,例如“1000”来做到这一点。

如果这不能解决您的问题,我将需要更多地了解您的环境配置,例如您正在使用的其他插件,以及您与默认 AdColonyPostProcessBuild.cs 文件的偏差。

问候!

AdColony 支持

于 2014-09-05T20:39:06.253 回答
1

这个问题对我来说是因为我使用 Facebook SDK 和 Adcolony 的 SDK。Facebook 代码打开了一个 streamReader,当 Adcolony 脚本运行时会产生错误。更改 Assets\Facebook\Editor\iOS\third_party\XCodeEditor-for-Unity\XCProject.cs 中的行

来自(第 76-77 行):

projectFileInfo = new FileInfo(Path.Combine(this.filePath, "project.pbxproj"));
string contents = projectFileInfo.OpenText().ReadToEnd();

至:

projectFileInfo = new FileInfo(Path.Combine(this.filePath, "project.pbxproj"));
StreamReader sr = projectFileInfo.OpenText();
string contents = sr.ReadToEnd();
sr.Close();

(归功于此处的答案:“IOException:在使用 Facebook Unity SDK 5.1 在 Mac OS X 上构建 Unity 项目时在路径上共享违规”

于 2014-10-02T14:12:56.433 回答