Reputation: 371
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
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