Unity接入心知天气,获取当前城市天气状况

本文档介绍了如何在Unity中利用心知天气API动态获取并显示当前城市的天气信息,包括天气图片、温度和城市名。通过获取公网IP、查询城市ID和天气信息,实现了天气显示功能。遇到的问题是当公网IP为IPv6时,可能出现错误,解决方案是更换获取公网IP的URL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、效果图 

二、注册心知天气

心知天气 - 登录

注册完成申请免费版API

 获取APIKey

文档地址:查看你的 API密钥 · 语雀 (yuque.com) 

图片下载地址:天气现象代码说明 | 心知天气文档 (seniverse.com) 

在unity新建Resources文件夹,将图片导入(因为代码会根据返回的图片名称在这个文件夹下查找图片,注意要把图片处理成精灵格式Sprite)

二、 代码实现

思路:

1.获取本地公网IP   http://icanhazip.com/

2.根据IP查询城市(心知天气提供接口,需要申请key)

https://api.seniverse.com/v3/location/search.json?key=私钥&q=城市

3.根据城市查询天气(心知天气提供接口,需要申请key)

https://api.seniverse.com/v3/weather/now.json?key=私钥&location={0}&language=zh-Hans&unit=c城市id

 json插件可以使用LitJson.dll或者Newtonsoft.Json,这里我用的是Newtonsoft.Json

下载地址: 提取码 syq1

LitJson.dll https://pan.baidu.com/share/init?surl=evpFU9FnL3KeP29_nVQlTQ

Newtonsoft.Json  https://pan.baidu.com/s/1fiRwL2qcepzgxOUwcTs1fQ

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
//using LitJson;

/// <summary>
/// 城市天气
/// </summary>
public class CityWeather : MonoBehaviour
{
    public Image imgWeather;    //天气图片
    public Text textWeather;    //天气
    public Text textTemperature;//温度
    public Text textCity;       //城市

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

    IEnumerator GetRuntimeWeather()
    {
        //1.获取本地公网IP
        UnityWebRequest wwwWebIp = UnityWebRequest.Get(@"http://icanhazip.com/");
        yield return wwwWebIp.SendWebRequest();
        if (wwwWebIp.isNetworkError || wwwWebIp.isHttpError)
        {
            yield break;
        }

        //2.根据IP查询城市(心知天气提供接口,需要申请key)***这里别忘记修改
        string urlQueryCity = "https://api.seniverse.com/v3/location/search.json?key=私钥&q=" + wwwWebIp.downloadHandler.text;
        UnityWebRequest wwwQueryCity = UnityWebRequest.Get(urlQueryCity);
        yield return wwwQueryCity.SendWebRequest();
        if (wwwQueryCity.isNetworkError || wwwQueryCity.isHttpError)
        {
            yield break;
        }

        JObject cityData = JsonConvert.DeserializeObject<JObject>(wwwQueryCity.downloadHandler.text);
        string cityId = cityData["results"][0]["id"].ToString();
        textCity.text = cityData["results"][0]["name"].ToString(); //城市

        //3.根据城市查询天气(心知天气提供接口,需要申请key)***这里别忘记修改
        string urlWeather = string.Format("https://api.seniverse.com/v3/weather/now.json?key=私钥&location={0}&language=zh-Hans&unit=c", cityId);
        UnityWebRequest wwwWeather = UnityWebRequest.Get(urlWeather);
        yield return wwwWeather.SendWebRequest();

        if (wwwWeather.isNetworkError || wwwWeather.isHttpError)
        {
            Debug.Log(wwwWeather.error);
        }

        //4.解析天气
        try
        {
            JObject weatherData = JsonConvert.DeserializeObject<JObject>(wwwWeather.downloadHandler.text);
            string spriteName = string.Format("Weather/{0}@2x", weatherData["results"][0]["now"]["code"].ToString());

            //天气文字
            textWeather.text = weatherData["results"][0]["now"]["text"].ToString();


            //图片,可以在心知天气上下载
            imgWeather.sprite = Resources.Load<Sprite>(spriteName);
            //Debug.Log(spriteName);

            //温度
            textTemperature.text = string.Format("{0} °C", weatherData["results"][0]["now"]["temperature"].ToString());
        }
        catch (System.Exception ex)
        {
            Debug.Log(ex.Message);
        }
    }
}


/*
 * 返回的Json天气格式
 * {
	"results": [{
		"location": {
			"id": "WX4FBXXFKE4F",
			"name": "北京",
			"country": "CN",
			"path": "北京,北京,中国",
			"timezone": "Asia/Shanghai",
			"timezone_offset": "+08:00"
		},
		"now": {
			"text": "晴",
			"code": "0",
			"temperature": "-10"
		},
		"last_update": "2021-01-08T09:20:00+08:00"
	}]
}
 */

三、问题解决 

经过几个朋友的测试,如果在运行中 textWeather.text = weatherData["results"][0]["now"]["text"].ToString();这句话出现超出数组索引问题,大概率是第一步获取公网ip的原因,在网页中访问 http://icanhazip.com/这个地址,返回的是

(IPV6地址),而不是(IPV4地址)这种格式的地址的话,就会出错。
 

原因: 可能是你的路由器支持IPV6导致。

win+R 输入cmd 打开控制台应用窗口,输入ipconfig 查看,看看是否ipV6不存在(注意不是本地IPV6)

 不支持ipV6使用 http://icanhazip.com/这个地址是没问题的

解决办法:

更换获取公网ip

分享一些获取公网ip的url地址_IP大侠的博客-CSDN博客_外网url

 

<think>好的,我现在要帮用户解决在鸿蒙开发中接入心知天气API的问题。首先,我需要回顾用户提供的引用内容,看看有没有相关的示例或方法。用户之前提到了Python、微信小程序、Android和Unity接入方法,但鸿蒙可能有所不同。 首先,用户提供的引用3中有Python调用API的例子,里面提到了请求的URL和参数。鸿蒙开发通常使用Java或ArkTS,所以需要将Python的示例转换成对应的语言。引用4中的Android示例使用了Handler来更新UI,这可能在鸿蒙中也有类似的机制,比如使用EventHandler或TaskDispatcher来处理异步任务和UI更新。 接下来,我需要考虑鸿蒙的网络请求框架。鸿蒙的API可能和Android的有所不同,但通常会有HTTP客户端库。例如,使用@ohos.net.http模块来发送GET请求。用户提到的引用3中的params结构需要正确设置,包括key、location等参数,这应该和心知天气的文档一致。 然后,数据解析部分。心知天气返回的是JSON数据,鸿蒙中可能需要使用JSONObject或其他解析库来处理。引用4中的Android代码用到了Bundle和Handler,鸿蒙可能使用类似的消息机制,比如通过EventBus或者直接在主线程中更新UI。 另外,引用4提到在线程中不能直接更新UI,鸿蒙同样有这样的限制,需要使用异步处理。比如,使用TaskDispatcher将网络请求放在IO线程,然后在UI线程中更新组件。 用户可能需要具体的代码示例,比如如何发送HTTP请求、解析数据,并更新UI组件。此外,权限配置也很重要,鸿蒙需要在config.json中声明网络权限,这点需要提醒用户。 最后,生成相关问题,帮助用户深入理解,比如如何进行异步处理、参数设置或错误处理等。需要确保回答结构清晰,步骤明确,代码正确,并参考之前的引用内容中的关键点,比如API参数和UI更新机制。</think>### 鸿蒙开发接入心知天气API教程 #### 一、准备工作 1. 注册心知天气账号并获取API密钥(Key) 2. 在鸿蒙工程`config.json`中添加网络权限: ```json "reqPermissions": [ {"name": "ohos.permission.INTERNET"} ] ``` #### 二、核心实现步骤 1. **网络请求封装**(使用ArkTS语法): ```typescript import http from '@ohos.net.http'; async function getWeather(location: string) { let httpRequest = http.createHttp(); let url = "https://api.seniverse.com/v3/weather/now.json"; let params = { "key": "你的API_KEY", "location": location, "language": "zh-Hans", "unit": "c" }; try { let response = await httpRequest.request(url, { method: http.RequestMethod.GET, extraData: params }); let result = JSON.parse(response.result.toString()); return result.results[0].now; } catch (err) { console.error("API请求失败:" + JSON.stringify(err)); } } ``` 2. **UI数据绑定**(示例组件): ```typescript @Entry @Component struct WeatherPage { @State temperature: string = '--' @State conditions: string = '加载中...' build() { Column() { Text(this.conditions).fontSize(20) Text(`${this.temperature}℃`).fontSize(32) } .onAppear(() => { this.loadWeather(); }) } async loadWeather() { let weatherData = await getWeather('北京'); this.temperature = weatherData.temperature; this.conditions = weatherData.text; } } ``` #### 三、注意事项 1. **异步处理**:鸿蒙禁止主线程直接进行网络操作,必须使用`async/await`或Promise[^4] 2. **错误处理**:需捕获`HTTP 401`(Key无效)、`404`(地址错误)等常见状态码 3. **数据解析**:心知天气返回结构为多层嵌套JSON,需注意`results[0].now`层级[^3] #### 四、扩展优化建议 1. 添加定位功能(需申请`ohos.permission.LOCATION`权限) 2. 使用`@ohos.data.storage`实现天气数据缓存 3. 根据`weather_code`字段匹配本地天气图标资源[^5]
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值