2016-10-21 1 views
0

Ich versuche, eine JSON-Datei zu laden heruntergeladen und im persistentDataPath eines iOS-Geräts gespeichert. Das Herunterladen und Speichern funktioniert super. Ich denke jedoch, dass ich große Probleme habe, die Datei zu laden. In der Tat, wenn ich versuche, das Projekt in Xcode zu kompilieren, habe ich einige Fehlermeldungen.Datei laden heruntergeladen iOS App in Unity erstellt

Zuerst hier ist mein C# -Code:

using UnityEngine; 
using System.Collections; 
using System.IO; 
using System.Net; 
using UnityEngine.UI; 

public class ReadJson : MonoBehaviour 
{ 
    public Text City; 
    public Text Temperature; 
    public Image Weather; 
    public Text WeatherUrl; 

    [System.Serializable] 
    public class CityInfo 
    { 
     public string name; 
    } 

    [System.Serializable] 
    public class CurrentCondition 
    { 
     public string date; 
     public string hour; 
     public int tmp; 
     public int wnd_spd; 
     public int wnd_gust; 
     public string wnd_dir; 
     public double pressure; 
     public int humidity; 
     public string condition; 
     public string icon; 
     public string icon_big; 
    } 

    [System.Serializable] 
    public class RootObject 
    { 
     public CityInfo city_info; 
     public CurrentCondition current_condition; 
    } 

    void Start() { 

     WebClient client = new WebClient(); 
     File.Delete(Path.Combine (Application.persistentDataPath, "myjson.json")); 
     client.DownloadFile ("http://www.myjsonurl", Path.Combine (Application.persistentDataPath, "myjson.json")); 

     TextAsset asset = Resources.Load (Path.Combine (Application.dataPath + "/Documents", "myjson")) as TextAsset; 

     RootObject m = JsonUtility.FromJson<RootObject> (asset.text); 

     City.text = m.city_info.name; 
     Temperature.text = (m.current_condition.tmp).ToString(); 

    } 
} 

Und jetzt der Xcode-Konsole:

2016-10-21 17:01:20.766001 json[1404:516674] [DYMTLInitPlatform] platform initialization successful 

2016-10-21 17:01:20.929950 json[1404:516508] -> registered mono modules 0xb95f70 
2016-10-21 17:01:21.356590 json[1404:516508] You've implemented -[<UIApplicationDelegate> application:didReceiveRemoteNotification:fetchCompletionHandler:], but you still need to add "remote-notification" to the list of your supported UIBackgroundModes in your Info.plist. 
-> applicationDidFinishLaunching() 
2016-10-21 17:01:21.452967 json[1404:516508] Metal GPU Frame Capture Enabled 
2016-10-21 17:01:21.453369 json[1404:516508] Metal API Validation Enabled 
-> applicationDidBecomeActive() 
Init: screen size 750x1334 
Initializing Metal device caps 
Initialize engine version: 5.3.4f1 (fdbb5133b820) 
UnloadTime: 1.705875 ms 
Salut/var/mobile/Containers/Data/Application/51A2490E-94EB-4904-9F2E-112AD5632A98/Documents 

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 37) 

NullReferenceException: A null value was found where an object instance was required. 


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

Setting up 1 worker threads for Enlighten. 
    Thread -> id: 19f17000 -> priority: 1 

Wenn jemand eine Idee hat. Vielen Dank im Voraus.

+0

Sie sagten, dass das große Problem das Laden der Datei ist. Dann hast du gesagt, wenn du versuchst, das Projekt in Xcode zu kompilieren, hast du einige Fehlermeldungen ... Welches ist dein Problem? Kompiliert das? Wenn es nicht kompiliert, dann hat dies nichts mit dem Laden der JSON-Datei zu tun. – Programmer

+0

Das Projekt kompiliert großartig, aber nach dem Laden der App, stürzt es mit der Anzeige der Fehlermeldung ab. Das Problem kommt also von der JSON-Datei. – Silvering

Antwort

1

Das Problem mit Ihrem Code ist auf dieser Linie:

TextAsset asset = Resources.Load(Path.Combine(Application.dataPath + "/Documents", "myjson")) as TextAsset; 

Ich glaube nicht, dass Sie verstehen, wie und wann Resources.Load zu verwenden. Wenn Sie die Funktion Resources.Load verwenden möchten, müssen Sie einen speziellen Ordner aus dem Editor erstellen. Dieser Ordner sollte <ProjectDirectory>/Assets/Resources sein. Sie können nur Sachen in diesen Ordner vom Herausgeber setzen/schreiben. Sie können es nicht nach dem Build auf iOS tun. Es wird lesen Sie nur nachdem Sie es bauen. Dieser spezielle Ordner kann dann mit der Funktion Resources.Load gelesen werden.

Ersetzen:

TextAsset asset = Resources.Load(Path.Combine(Application.dataPath + "/Documents", "myjson")) as TextAsset; 

mit

string text = File.ReadAllText(Path.Combine(Application.persistentDataPath, "myjson.json")); 
RootObject m = JsonUtility.FromJson<RootObject>(text); 
City.text = m.city_info.name; 
Temperature.text = (m.current_condition.tmp).ToString(); 

Sollte Ihr Problem lösen.

Eine andere API, die nicht verwendet werden sollte, ist WebClient. Wenn Sie keinen guten Grund haben, das zu benutzen, sollten Sie es nicht tun. Sie sollten entweder die API WWW oder UnityWebRequest (neuere und empfohlene) verwenden.

Dies ist, was Ihr Code wie ohne WebClient aussehen sollte:

void Start() 
{ 
    StartCoroutine(DownloadAndloadJson()); 
} 

IEnumerator DownloadAndloadJson() 
{ 
    string url = "http://www.myjsonurl"; 

    UnityWebRequest www = UnityWebRequest.Get(url); 
    yield return www.Send(); 

    if (www.isError) 
    { 
     Debug.Log(www.error); 
    } 
    else 
    { 
     //Sucessfully downloaded the Json File 
     Debug.Log("Json: " + www.downloadHandler.text); 

     string jsonFile = www.downloadHandler.text; 

     //Delete old json file. Don't know why but this was in your original code 
     File.Delete(Path.Combine(Application.persistentDataPath, "myjson.json")); 

     //Save the downloaded data as File 
     File.WriteAllText(Path.Combine(Application.persistentDataPath, "myjson.json"), jsonFile); 

     //Load the downloaded data 
     string text = File.ReadAllText(Path.Combine(Application.persistentDataPath, "myjson.json")); 

     Debug.Log(text); 
     RootObject m = JsonUtility.FromJson<RootObject>(text); 
     City.text = m.city_info.name; 
     Temperature.text = (m.current_condition.tmp).ToString(); 
    } 
} 

Wenn Sie 5.4 Probleme bitte zu aktualisieren, um Unity haben. Die UnityWebRequest API sollte dafür verwendet werden und es wurde in 5.3 eingeführt, aber Fehler wurden in 5.4 behoben. Sie benötigen using UnityEngine.Networking;, um UnityWebRequest zu verwenden.

+0

Vielen Dank es funktioniert einfach großartig, den Code zu ersetzen, wie Sie sagten. Danke auch für die zweite Lösung, ich werde versuchen, aber zuerst muss ich Unity aktualisieren ;-) – Silvering

+0

Sie müssen Unity nicht für die zweite Lösung aktualisieren, da dies in Unity 5.3 unterstützt wird, aber ich empfehle, zu aktualisieren, wenn ein Problem damit besteht es. Ihre aktuelle Lösung mit 'WebClient' friert Ihre App beim Herunterladen von Dateien ein. Sie werden das jetzt wahrscheinlich nicht bemerken, aber wenn die Daten groß sind, werden Sie es bemerken. Es gibt andere Gründe, wie der App-Store, der Apps verbietet, die https nicht unterstützen. Diese Version von Unity mit 'WebClient' unterstützt dies nicht, daher wird Ihre App abgelehnt. Bitte schön! – Programmer

+0

Ok ich habe gerade mit deiner zweiten Lösung getestet. Funktioniert super.Danke immer wieder. Sie haben Recht bezüglich der Bedingungen des App-Stores. Besser so. An diesem Punkt kein Problem mit Unity 5.3 – Silvering

Verwandte Themen