加载文件下载在Unity中创建的iOS应用程序

本文关键字:iOS 应用程序 创建 文件下载 Unity 加载 | 更新日期: 2023-09-27 18:14:18

我正在尝试加载下载并保存在iOS设备的persistentDataPath中的json文件。下载和保存工作很棒。然而,我认为我有大问题加载文件。事实上,当我尝试在Xcode中编译项目时,我有一些错误消息。

首先是我的c#代码:
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();
    }
}

现在xcode控制台:

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 

如果有人有一个想法。

加载文件下载在Unity中创建的iOS应用程序

代码的问题在这一行:

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

我认为你不了解如何以及何时使用Resources.Load。如果要使用Resources.Load函数,必须在Editor中创建一个特殊文件夹。这个文件夹应该在<ProjectDirectory>/Assets/Resources。您可以,只有从编辑器将内容放入/写入此文件夹。你不能在iOS平台上创造游戏。在构建之后,它变成了只读。然后可以使用Resources.Load函数读取这个特殊文件夹。

替换:

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

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();

应该能解决你的问题。

另一个不应该使用的API是WebClient。除非你有很好的理由,否则你不应该使用它。您应该使用WWWUnityWebRequest(较新的和推荐的)API。

如果没有WebClient,你的代码应该是这样的:
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();
    }
}

如果你有问题,请更新到Unity 5.4。UnityWebRequest API应该用于此,它在5.3中引入,但在5.4中修复了错误。你需要using UnityEngine.Networking;来使用UnityWebRequest