在iOS设备上编写XML文件,并在同一设备上从中读取Unity

时间:2013-09-25 08:54:27

标签: ios xml unity3d

我想在后台运行一个应用程序(非Unity项目)并将一些数据写入XML文件。这是我已有的代码。但是,对于我的Unity应用程序,我需要知道文件的位置,以便我可以阅读它。

有谁知道iOS自动保存它创建的XML文件的位置?

1 个答案:

答案 0 :(得分:1)

这个问题有点旧,但我会在这里回答,以防有人需要指南。

现在很有可能在iOS8.0 +中使用新的App Group功能。此功能允许2个或更多应用程序在一个共享目录中相遇。这是设置它的非常简短的步骤:

  1. 进入Apple Developer代理帐户,在管理应用ID和证书的同一页面中,创建新的应用组。让我们说 group.com.company.myapp
  2. 我们需要2个应用才能正确分享数据?确保您已准备好2个应用ID,如果您没有,请创建新的ID。在这里,您可以启用应用组同时创建2个应用ID,让我们说 com.company.myapp.reader com.company.myapp.writer 。 (可以是任何一个,你实际上不必像这样嵌套这个名字)你可以暂时取消应用程序组的app权利,因为XCode会为我们做所有的配置。
  3. 在XCode上创建一个新项目,每个项目一个,单个视图应用程序是一个很好的项目模板。
  4. 开启"应用程序组"项目设置/功能选项卡上的功能。不要忘记选择要使用的应用程序组。
  5. 在这里,您必须编写一些Objective-C代码来获取该共享文件夹路径。 (请参阅NSFileManager containerURLForSecurityApplicationGroupIdentifier)UI的viewDidLoad函数是尝试使用代码段的好地方。
    • Writer应用程序可以将此路径与文件名连接,并尝试将某个文件写入该目录,您可以使用此路径中的任何文件API。
    • 阅读器应用程序执行相同操作但从中读取。
  6. 测试,直到您可以让读者应用程序查看编写器应用程序的文件。 (我将把所有的工作留在这里作为练习,正如我所说的那样简短)
  7. 特定于OP场景:

    1. 好的,你想在Unity3D中使用这个功能。看起来没有内置的统一API或任何资产商店,所以你必须编写自己的iOS原生插件。如果您不熟悉,请阅读一些文档。统一方面的C#存根可以是:

      using UnityEngine;
      using System.Collections;
      using System.Runtime.InteropServices;
      
      public static class AppGroupPlugin
      {
      
          /* Interface to native implementation */
      
          #region Native Link
          #if UNITY_EDITOR
      
          private static string _GetSharedFolderPath( string groupIdentifier )
          {
              // Handle dummy folder in editor mode
              string path = System.IO.Path.Combine( System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop), groupIdentifier );
              if( !System.IO.Directory.Exists( path ) )
                  System.IO.Directory.CreateDirectory( path );
      
              return path;
          }
      
          #elif UNITY_IOS
      
          [DllImport ("__Internal")]
          private static extern string _GetSharedFolderPath( string groupIdentifier );
      
          #endif
          #endregion
      
          public static string GetSharedFolderPath( string groupIdentifier )
          {
              return _GetSharedFolderPath( groupIdentifier );
          }
      }
      
    2. 只需让Objective-C返回那个共享路径。我已经测试过,在获得此路径后,您可以在任何System.IO.File操作上使用此路径来读取写入文件,就好像它们是普通文件夹一样。这可以只是一个位于Plugins / iOS文件夹中的.m文件。

      char* MakeNSStringCopy (NSString* ns)
      {
          if (ns == nil)
              return NULL;
      
          const char* string = [ns UTF8String];
      
          char* res = (char*)malloc(strlen(string) + 1);
          strcpy(res, string);
          return res;
      }
      
      NSString* _GetSharedFolderPathInternal( NSString* groupIdentifier )
      {
          NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:groupIdentifier];
          if( containerURL != nil )
          {
              //NSLog( @"Path to share content is %@", [containerURL path] );
          }
          else
          {
              NSLog( @"Fail to call NSFileManager sharing" );
          }
      
          return [containerURL path];
      }
      
      // Unity script extern function shall call this function, interop NSString back to C-string, 
      // which then scripting engine will convert it to C# string to your script side.
      const char* _GetSharedFolderPath( const char* groupIdentifier )
      {
          NSString* baseurl = _GetSharedFolderPathInternal( CreateNSString( groupIdentifier ) );
          return MakeNSStringCopy( baseurl );
      }
      
    3. 从Unity导出XCode项目后,不要忘记打开" App Group"能力了。