1 つのアプリ (Unity プロジェクト以外) をバックグラウンドで実行し、データを XML ファイルに書き込みたいと考えています。これは私がすでに持っているコードです。ただし、私の Unity アプリでは、ファイルを読み取ることができるように、ファイルの場所を知る必要があります。
iOS が作成した XML ファイルを自動的に保存する場所を知っている人はいますか?
質問はちょっと古いですが、誰かがガイドラインを必要とする場合に備えて、ここで答えます。
これは、新しいアプリ グループ機能を使用して、iOS8.0 以降で実行できるようになりました。この機能により、2 つ以上のアプリが 1 つの共有ディレクトリに集まることができます。これを設定するための非常に簡単な手順は次のとおりです。
NSFileManager containerURLForSecurityApplicationGroupIdentifier
) UI の viewDidLoad 関数は、コード スニペットを試すのに適した場所です。
わかりました、Unity3D でこの機能が必要でした。組み込みの unity の API やアセット ストアがないように見えるため、独自の iOS ネイティブ プラグインを作成する必要があります。よくわからない場合は、ドキュメントを読んでください。Unity 側の 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 );
}
}
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 );
}