0

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.

Diego
  • 371
  • 1
  • 3
  • 13
  • You have multiple problem in your code I believe. For the location service park, please do this: http://stackoverflow.com/a/24063578/1035008 – Yuchen Apr 17 '17 at 21:37
  • Thanks for the help. A lot if the issue debug code is just a few unused variables I need to clean up. The problem is the location services which you have helped with and the main issue is the isolated storage line. If you can help on that one from the find path function it would be appreciated. – Diego Apr 18 '17 at 07:47
  • It didn't work :( I'm going to try updating the unity version and xcode to see how it pans out – Diego Apr 18 '17 at 10:48

1 Answers1

0

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

Diego
  • 371
  • 1
  • 3
  • 13