Diego
Diego

Reputation: 371

Error writing to IOS file system works on android & editor

Ive got a function that downloads json and the tries to save a copy on the device. It works fine on android and in the editor. Can't put my finger on it. Ipad is running IOS 10 and settings in unity are 9 upwards if that adds anything.

Below is the unity code plus the error on xcode.

MONODEVELOP

using UnityEngine;
using System.Collections;
using System;
using System.IO;
using System.Collections.Generic;
 using LitJson;


public class loadJSONHome : MonoBehaviour {

public string url;
public string url2;
private string jsonString;
public static loadJSONHome instance;
public GameObject preloader;

void Awake(){
    if(instance==null){
    instance = this;
    }

}
void Start (){
      WWW www2 = new WWW(url);
      StartCoroutine(WaitForRequest(www2));
     // preloader.SetActive(true);

 }

IEnumerator WaitForRequest(WWW www2){
  yield return www2;

  // check for errors
  if (www2.error == null)
  {
    //SAVE JSON FROM ONLINE LOCALLY
    jsonString = www2.text;

        writeStringToFile(jsonString, "FoodnDrink_Cats.json");

    writeListings();
  } else {
      Debug.Log("WWW2 Error: "+ www2.error);
  }    
}




  void writeListings(){

    WWW www3 = new WWW(url2);
      StartCoroutine(WaitForRequest2(www3));
  }

IEnumerator WaitForRequest2(WWW www3){
  yield return www3;

  // check for errors
  if (www3.error == null)
  {
    //SAVE JSON FROM ONLINE LOCALLY
    jsonString = www3.text;

        writeStringToFile(jsonString, "listings_FoodnDrink.json");

   } else {
      Debug.Log("WWW3 Error: "+ www3.error);
  }   

     //preloader.SetActive(false); 
  }











    public void writeStringToFile( string str, string filename ){
        #if !WEB_BUILD
            string path = pathForDocumentsFile( filename );
            FileStream file = new FileStream (path, FileMode.Create, FileAccess.Write);

            StreamWriter sw = new StreamWriter( file );
            sw.WriteLine( str );

            sw.Close();
            file.Close();
        #endif  
    }

    public string readStringFromFile( string filename){ //, int lineIndex )
        #if !WEB_BUILD
            string path = pathForDocumentsFile( filename );

            if (File.Exists(path))
            {
                FileStream file = new FileStream (path, FileMode.Open, FileAccess.Read);
                StreamReader sr = new StreamReader( file );

            string str = null;
            str = sr.ReadToEnd ();

            sr.Close();
            file.Close();

            return str;
        }else{
        return null;
        }
        #else
        return null;
        #endif 
    }


    public string pathForDocumentsFile( string filename ){ 
        if (Application.platform == RuntimePlatform.IPhonePlayer)
        {
            string path = Application.dataPath.Substring( 0, Application.dataPath.Length - 5 );
            path = path.Substring( 0, path.LastIndexOf( '/' ) );
            return Path.Combine( Path.Combine( path, "Documents" ), filename );
        }else if(Application.platform == RuntimePlatform.Android){
        string path = Application.persistentDataPath;   
            path = path.Substring(0, path.LastIndexOf( '/' ) ); 
            return Path.Combine (path, filename);
        }else {
            string path = Application.dataPath; 
            path = path.Substring(0, path.LastIndexOf( '/' ) );
            return Path.Combine (path, filename);
        }
    }





 }

XCODE

Location service updates are not enabled. Check LocationService.status before querying last location.

IsolatedStorageException: Could not find a part of the path "/var/containers/Bundle/Application/BC5FA0A8-9767-4689-8707-EBB7FA1886F5/Documents/FoodnDrink_Cats.json". 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.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean isAsync, Boolean anonymous) [0x00000] in :0 at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access) [0x00000] in :0 at loadJSONHome.writeStringToFile (System.String str, System.String filename) [0x00000] in :0 at loadJSONHome+c__Iterator5.MoveNext () [0x00000] in :0

(Filename: currently not available on il2cpp Line: -1)

Help appreciated.

Upvotes: 0

Views: 668

Answers (1)

Diego
Diego

Reputation: 371

I figured it out with help of a youtube video (posted at the end).

I changed the methods to store in binary data form to get around apple isolation and authorization file issues. This is also a lot cleaner.

Here's the code :

using UnityEngine;
using System.Collections;
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;


public class loadJSONHome : MonoBehaviour {

    public string url;
    public string url2;
    private string jsonString;
    public static loadJSONHome instance;
    public GameObject preloader;

    void Awake(){
        if(instance==null){
        instance = this;
        }

    }
    void Start (){
          WWW www2 = new WWW(url);
          StartCoroutine(WaitForRequest(www2));
          preloader.SetActive(true);

   }

    IEnumerator WaitForRequest(WWW www2){
      yield return www2;

      // check for errors
      if (www2.error == null)
      {
        //SAVE JSON FROM ONLINE LOCALLY
        jsonString = www2.text;

            Save(jsonString, "FoodnDrink_Cats.json");

        writeListings();
      } else {
          Debug.Log("WWW2 Error: "+ www2.error);
      }    
  }




   void writeListings(){

        WWW www3 = new WWW(url2);
          StartCoroutine(WaitForRequest2(www3));
      }

    IEnumerator WaitForRequest2(WWW www3){
      yield return www3;

      // check for errors
      if (www3.error == null)
      {
        //SAVE JSON FROM ONLINE LOCALLY
        jsonString = www3.text;

            Save(jsonString, "listings_FoodnDrink.json");

       } else {
          Debug.Log("WWW3 Error: "+ www3.error);
      }   

      preloader.SetActive(false); 
  }



    public void Save(string json, string filename){

        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Open(Application.persistentDataPath + "/" +filename, FileMode.Create);

        myFile current = new myFile();
        current.theFile = json;

        bf.Serialize(file, current);
        file.Close();


    }


    public string Load(string filename){

        if(File.Exists(Application.persistentDataPath + "/" + filename)){
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(Application.persistentDataPath + "/" + filename, FileMode.Open);
            myFile data = (myFile)bf.Deserialize(file);
            file.Close();
            string fileinfo = data.theFile;
            return fileinfo;
        }else{
            return null;
        }
    }




}

[Serializable]
class myFile {

    public string theFile;


}

Here's the Youtube Video : https://www.youtube.com/watch?v=yxziv4ISfys

Upvotes: 0

Related Questions