Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UnauthorizedAccessException: Access to the path [ iOS / Unity3D ]

i need your help, so yesterday i want to port my game to iOS, this is not my first time porting it, the previous version always port sucessfully, but not now

i'm using Unity 5.3.4 and 5.3.5 with Xcode 7.3 on El Capitan, its sucessfully compile from the XCode, but all the object that i initilize and spawn at the start of the scene wont show up on the game, i dont know whats wrong with it since theres no error on Unity or XCode itself

but from the logs, i suspect its because of this

UnauthorizedAccessException: Access to the path"/var/mobile/Containers/Data/Application/280DC265-ABD8-41A3-8B87-74D09910FB24/Documentstemp.gjk" is denied. at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean anonymous, FileOptions options) [0x00000] in :0 at System.IO.StreamWriter..ctor (System.String path, Boolean append) [0x00000] in :0 at System.IO.File.CreateText (System.String path) [0x00000] in :0

its i assume because, when launch, the game will access texture/sprite from secure website using WWW method, with HTTP not HTTPS, and try to download and save it as sprite at Application.PersistentDataPath and then apply it into the game

its working fine on Android but somehow iOS wont allow to read/write the file, hench the error

heres snippet of the code i use :

IEnumerator getBillboard()
{
    WWW getBillboardlistURL = new WWW(billboardlistURL);
    yield return getBillboardlistURL;

    if (getBillboardlistURL.error != null)
    {

    }
    else
    {


        WWW imageLink = new WWW(pictLink[Mathf.FloorToInt(i / 3)]);
        yield return imageLink;
        Texture2D imageTemp = imageLink.texture;
        obj.transform.GetChild(0).GetComponent<SpriteRenderer>().sprite = Sprite.Create(imageTemp, new Rect(0, 0, imageTemp.width, imageTemp.height), new Vector2(0.5f, 0.5f));
        obj.name = namaProduk[Mathf.FloorToInt(i / 3)];

                print("BILLBOARD ONLINE");

        /// ======= WRITE BILLBOARD NAME TO FILE AND SAVE IT =======



        /// ======================= END ============================


        var bytes = imageLink.texture.EncodeToPNG();

        //print(Application.dataPath);

        //cek file
        if(redownloadImage)
                {
                    File.WriteAllBytes(Application.persistentDataPath + "/vendorBillboard/" + namaProduk[Mathf.FloorToInt(i / 3)] + ".png", bytes);
                    print("REDOWNLOAD SEMUA TEXTURE!");
                }

                obj.SetActive(false);
                billboardPool.Add(obj);
            }
        }

    }
}

is there workaround or fix for this?

thank you in advance

like image 921
Solid_Metal Avatar asked Mar 11 '23 23:03

Solid_Metal


1 Answers

Looking at the exception and comparing it to your code, I don't think the code your provided is where the error is occurring... for 2 reasons:

  1. The exception says "UnauthorizedAccessException: Access to the path"/var/mobile/Containers/Data/Application/280DC265-ABD8-41A3-8B87-74D09910FB24/Documentstemp.gjk" is denied". However, in your code you have /vendorBillboard/ in your path. Notice /vendorBillboard/ is not in the path in the exception.

  2. At the end of the exception it states the problem is in System.IO.File.CreateText (System.String path), however, you have used System.IO.File.WriteAllBytes() in your code.

I'm guessing you are creating a text file "somewhere else" and you are using Application.dataPath there instead of Application.persistentDataPath.

like image 160
Needleski Avatar answered Mar 15 '23 23:03

Needleski