0

1 つのアプリ (Unity プロジェクト以外) をバックグラウンドで実行し、データを XML ファイルに書き込みたいと考えています。これは私がすでに持っているコードです。ただし、私の Unity アプリでは、ファイルを読み取ることができるように、ファイルの場所を知る必要があります。

iOS が作成した XML ファイルを自動的に保存する場所を知っている人はいますか?

4

1 に答える 1

1

質問はちょっと古いですが、誰かがガイドラインを必要とする場合に備えて、ここで答えます。

これは、新しいアプリ グループ機能を使用して、iOS8.0 以降で実行できるようになりました。この機能により、2 つ以上のアプリが 1 つの共有ディレクトリに集まることができます。これを設定するための非常に簡単な手順は次のとおりです。

  1. アプリ ID と証明書を管理する同じページで、Apple Developer エージェント アカウントに移動し、新しいアプリ グループを作成します。group.com.company.myappとしましょう
  2. データを共有するには 2 つのアプリが必要ですよね? 2 つのアプリ ID が用意されていることを確認してください。ない場合は、新しく作成してください。ここでアプリ グループを有効にできます。また、2 つのアプリ ID を作成します。たとえば、 com.company.myapp.readercom.company.myapp.writerとします。XCode がすべての構成を行うため、今のところ、アプリ グループのアプリ資格をオフのままにしておくことができます。
  3. XCode で新しいプロジェクトを作成します。プロジェクトごとに 1 つです。シングル ビュー アプリは、試すのに適したプロジェクト テンプレートです。
  4. プロジェクト設定/機能タブで「アプリグループ」機能をオンにします。使用するアプリ グループを選択することを忘れないでください。
  5. ここでは、目的の C コードを記述して、その共有フォルダー パスを取得する必要があります。( を参照NSFileManager containerURLForSecurityApplicationGroupIdentifier) UI の viewDidLoad 関数は、コード スニペットを試すのに適した場所です。
    • ライター アプリは、このパスをファイル名と連結し、そのディレクトリにファイルを書き込もうとする場合があります。このパスで任意のファイル API を使用できます。
    • リーダーアプリも同じことを行いますが、それから読み取ります。
  6. リーダー アプリがライター アプリのファイルを参照できるようになるまでテストします。(これは簡単だと言ったので、ここではすべての作業を演習として残します)

OPのシナリオに固有:

  1. わかりました、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 );
        }
    }
    
  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 プロジェクトをエクスポートした後、「アプリ グループ」機能を再度オンにすることを忘れないでください。
于 2016-08-17T11:34:19.770 に答える