• iOS开发Swift-10-位置授权, cocoapods,API,天气获取,城市获取-和风天气App首页代码


     1.获取用户当前所在的位置

    在infi中点击加号,选择权限:当用户使用app的时候获取位置权限.

    填写使用位置权限的目的.

     2.获取用户的经纬度.

    ViewController:

    1. import UIKit
    2. import CoreLocation
    3. class ViewController: UIViewController, CLLocationManagerDelegate { //遵循CLLocationManagerDelegate协议
    4. //位置管理器
    5. let locationManager = CLLocationManager()
    6. override func viewDidLoad() {
    7. super.viewDidLoad()
    8. // Do any additional setup after loading the view.
    9. locationManager.requestWhenInUseAuthorization() //请求当用户正在使用app的时候允许后台得到用户位置.只会弹出来一次
    10. locationManager.delegate = self //位置管理器代理人是view controller对象.希望view controller能通过实现CLLocationManagerDelegate协议中的方法,获取到当前用户位置信息
    11. locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers //设置需要的位置精度(三公里误差精度)
    12. locationManager.requestLocation() //请求用户位置
    13. }
    14. func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { //requesLocation请求到了的话会执行这个方法
    15. let lon = locations[0].coordinate.longitude //精度.因为location可能实时变化(地图app),所以是一个数组.我们只需要使用第一个获取到的位置.
    16. let lat = locations[0].coordinate.latitude //纬度
    17. print(lon)
    18. print(lat)
    19. }
    20. func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { //requesLocation请求失败的话会执行这个方法
    21. print(error)
    22. }
    23. }

     3.通过第三方服务获取当前天气

    (1)安装cocoapods

    https://dev.qweather.com/

    在网站中可以找到,当向 https://devapi.qweather.com/v7/weather/now?[请求参数] 发送请求时,就可以得到当前天气.

    通过依赖管理工具cocoapods命令行工具进行依赖管理.在终端里对它进行下载并安装,

    在Mac的启动台上找到「终端」应用,或者在触控板上通过四指聚合来打开「启动台—终端」。

    在命令行输入

    sudo gem install cocoapods
    

    (以超级管理员的身份,安装cocoapods这个应用.)

    输入电脑开机密码.

     等待安装成功.

     这里可能出现Error installing cocoapods:
    The last version of activesupport (>= 5.0, < 8) to support your Ruby & RubyGems was 6.1.7.6. Try installing it with `gem install activesupport -v 6.1.7.6` and then running the current command again
    activesupport requires Ruby version >= 2.7.0. The current ruby version is 2.6.10.210.

    这个bug,解决方式请参照博客:https://www.cnblogs.com/lysboke/p/17678896.html

    (2)安装功能包

    在cocoapods官网https://cocoapods.org/的搜索栏搜索Alamofire.点击进入.

     用cocoapods安装Alamofire.

    在终端中输入cd空格,将项目文件夹Weather拖入到cd后面.点击回车.

     终端输入

    pod init
    

    等待.完成之后打开Weather文件夹,发现成功创建Podfile文件.

     将Podfile拖入Xcode,Podfile自动弹出.

    加入代码:

      pod 'Alamofire'
    

    保存并关闭Podfile.

     在终端输入命令安装功能包:

    pod install
    

     关闭Xcode,从Weather文件中打开Weather.xcworkspace,可以看到项目结构如下.

     4.利用和风API获取当前位置的天气信息

    注册和风天气账号.在和风天气中创建一个免费的新项目.

    https://console.qweather.com/#/apps/create-app/create

     得到key.

    编写代码得到当前经纬度下的天气数据信息.

    1. import UIKit
    2. import CoreLocation
    3. import Alamofire //引入和风API包
    4. class ViewController: UIViewController, CLLocationManagerDelegate { //遵循CLLocationManagerDelegate协议
    5. //位置管理器
    6. let locationManager = CLLocationManager()
    7. override func viewDidLoad() {
    8. super.viewDidLoad()
    9. // Do any additional setup after loading the view.
    10. locationManager.requestWhenInUseAuthorization() //请求当用户正在使用app的时候允许后台得到用户位置.只会弹出来一次
    11. locationManager.delegate = self //位置管理器代理人是view controller对象.希望view controller能通过实现CLLocationManagerDelegate协议中的方法,获取到当前用户位置信息
    12. locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers //设置需要的位置精度(三公里误差精度)
    13. locationManager.requestLocation() //请求用户位置
    14. }
    15. func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { //requesLocation请求到了的话会执行这个方法
    16. let lon = locations[0].coordinate.longitude //精度.因为location可能实时变化(地图app),所以是一个数组.我们只需要使用第一个获取到的位置.
    17. let lat = locations[0].coordinate.latitude //纬度
    18. //print(lon)
    19. //print(lat)
    20. AF.request("https://devapi.qweather.com/v7/weather/now?location=\(lon),\(lat)&key=a91848aaab484a3599a703b139dfe87b").responseJSON { response in
    21. if let data = response.value{
    22. print(data)
    23. }
    24. } //请求和风API的网址,得到当前位置的天气
    25. }
    26. func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { //requesLocation请求失败的话会执行这个方法
    27. print(error)
    28. }
    29. }

    为了在测试中使用http传输,在Info中新增一个key和Value:App Transport Security Settings,在它里边再添加一个Allow Arbitrary Loads,Value设置为Yes.

     5.解析和风API返回的JSON数据

    在Xcode中的Podfile中添加如下:

    pod 'SwiftyJSON', '~> 4.0'
    

     保存之后在终端输入:

    pod install
    

     下载之后引入JSON解析包,写入代码,测试.

    1. import UIKit
    2. import CoreLocation
    3. import Alamofire //引入和风API包
    4. import SwiftyJSON //引入解析JSON数据的包
    5. class ViewController: UIViewController, CLLocationManagerDelegate { //遵循CLLocationManagerDelegate协议
    6. //位置管理器
    7. let locationManager = CLLocationManager()
    8. override func viewDidLoad() {
    9. super.viewDidLoad()
    10. // Do any additional setup after loading the view.
    11. locationManager.requestWhenInUseAuthorization() //请求当用户正在使用app的时候允许后台得到用户位置.只会弹出来一次
    12. locationManager.delegate = self //位置管理器代理人是view controller对象.希望view controller能通过实现CLLocationManagerDelegate协议中的方法,获取到当前用户位置信息
    13. locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers //设置需要的位置精度(三公里误差精度)
    14. locationManager.requestLocation() //请求用户位置
    15. }
    16. func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { //requesLocation请求到了的话会执行这个方法
    17. let lon = locations[0].coordinate.longitude //精度.因为location可能实时变化(地图app),所以是一个数组.我们只需要使用第一个获取到的位置.
    18. let lat = locations[0].coordinate.latitude //纬度
    19. //print(lon)
    20. //print(lat)
    21. AF.request("https://devapi.qweather.com/v7/weather/now?location=\(lon),\(lat)&key=a91848aaab484a3599a703b139dfe87b").responseJSON { response in
    22. if let data = response.value{
    23. let weatherJSON = JSON(data)
    24. print(weatherJSON)
    25. }
    26. } //请求和风API的网址,得到当前位置的天气
    27. }
    28. func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { //requesLocation请求失败的话会执行这个方法
    29. print(error)
    30. }
    31. }

     启动运行:

     6.拿到天气数据并展示在界面上

    把温度拖拽到ViewController中.

     同理,将天气图标和用户当前所在的城市也拖拽到代码区.

     新建一个swift文件:

    Weather.swift:

    1. import Foundation
    2. class Weather{
    3. var temp = ""
    4. var icon = ""
    5. var city = ""
    6. }

    ViewController:

    1. import UIKit
    2. import CoreLocation
    3. import Alamofire //引入和风API包
    4. import SwiftyJSON //引入解析JSON数据的包
    5. class ViewController: UIViewController, CLLocationManagerDelegate { //遵循CLLocationManagerDelegate协议
    6. @IBOutlet weak var tempLable: UILabel!
    7. @IBOutlet weak var iconImageView: UIImageView!
    8. @IBOutlet weak var cityLable: UILabel!
    9. //位置管理器
    10. let locationManager = CLLocationManager()
    11. //Weather.swift实例化
    12. let weather = Weather()
    13. override func viewDidLoad() {
    14. super.viewDidLoad()
    15. // Do any additional setup after loading the view.
    16. locationManager.requestWhenInUseAuthorization() //请求当用户正在使用app的时候允许后台得到用户位置.只会弹出来一次
    17. locationManager.delegate = self //位置管理器代理人是view controller对象.希望view controller能通过实现CLLocationManagerDelegate协议中的方法,获取到当前用户位置信息
    18. locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers //设置需要的位置精度(三公里误差精度)
    19. locationManager.requestLocation() //请求用户位置
    20. }
    21. func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { //requesLocation请求到了的话会执行这个方法
    22. let lon = locations[0].coordinate.longitude //精度.因为location可能实时变化(地图app),所以是一个数组.我们只需要使用第一个获取到的位置.
    23. let lat = locations[0].coordinate.latitude //纬度
    24. //print(lon)
    25. //print(lat)
    26. AF.request("https://devapi.qweather.com/v7/weather/now?location=\(lon),\(lat)&key=a91848aaab484a3599a703b139dfe87b").responseJSON { response in
    27. if let data = response.value{
    28. let weatherJSON = JSON(data)
    29. //print(weatherJSON["now"]["temp"]) //或weatherJSON["now", "temp"]
    30. //print(weatherJSON["refer"]["sources"][0]) //weatherJSON["refer", "sources", 0]
    31. //MVC结构
    32. self.weather.temp = "\(weatherJSON["now"]["temp"].stringValue)˚"
    33. self.weather.icon = weatherJSON["now"]["icon"].stringValue
    34. self.tempLable.text = self.weather.temp
    35. self.iconImageView.image = UIImage(named: self.weather.icon)
    36. }
    37. } //请求和风API的网址,得到当前位置的天气
    38. }
    39. func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { //requesLocation请求失败的话会执行这个方法
    40. print(error)
    41. }
    42. }

     启动测试:

     7.获取用户当前所在的城市

    ViewController:

    1. import UIKit
    2. import CoreLocation
    3. import Alamofire //引入和风API包
    4. import SwiftyJSON //引入解析JSON数据的包
    5. class ViewController: UIViewController, CLLocationManagerDelegate { //遵循CLLocationManagerDelegate协议
    6. @IBOutlet weak var tempLable: UILabel!
    7. @IBOutlet weak var iconImageView: UIImageView!
    8. @IBOutlet weak var cityLable: UILabel!
    9. //位置管理器
    10. let locationManager = CLLocationManager()
    11. //Weather.swift实例化
    12. let weather = Weather()
    13. override func viewDidLoad() {
    14. super.viewDidLoad()
    15. // Do any additional setup after loading the view.
    16. locationManager.requestWhenInUseAuthorization() //请求当用户正在使用app的时候允许后台得到用户位置.只会弹出来一次
    17. locationManager.delegate = self //位置管理器代理人是view controller对象.希望view controller能通过实现CLLocationManagerDelegate协议中的方法,获取到当前用户位置信息
    18. locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers //设置需要的位置精度(三公里误差精度)
    19. locationManager.requestLocation() //请求用户位置
    20. }
    21. func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { //requesLocation请求到了的话会执行这个方法
    22. let lon = locations[0].coordinate.longitude //精度.因为location可能实时变化(地图app),所以是一个数组.我们只需要使用第一个获取到的位置.
    23. let lat = locations[0].coordinate.latitude //纬度
    24. //print(lon)
    25. //print(lat)
    26. AF.request("https://devapi.qweather.com/v7/weather/now?location=\(lon),\(lat)&key=a91848aaab484a3599a703b139dfe87b").responseJSON { response in
    27. if let data = response.value{
    28. let weatherJSON = JSON(data)
    29. //print(weatherJSON["now"]["temp"]) //或weatherJSON["now", "temp"]
    30. //print(weatherJSON["refer"]["sources"][0]) //weatherJSON["refer", "sources", 0]
    31. //MVC结构
    32. self.weather.temp = "\(weatherJSON["now"]["temp"].stringValue)˚"
    33. self.weather.icon = weatherJSON["now"]["icon"].stringValue
    34. self.tempLable.text = self.weather.temp
    35. self.iconImageView.image = UIImage(named: self.weather.icon)
    36. }
    37. } //请求和风API的网址,得到当前位置的天气
    38. AF.request("https://geoapi.qweather.com/v2/city/lookup?location=\(lon),\(lat)&key=a91848aaab484a3599a703b139dfe87b").responseJSON { response in
    39. if let data = response.value{
    40. let cityJSON = JSON(data)
    41. //处理数据
    42. self.weather.city = cityJSON["location", 0, "name"].stringValue
    43. //处理AI
    44. self.cityLable.text = self.weather.city
    45. }
    46. }
    47. }
    48. func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { //requesLocation请求失败的话会执行这个方法

            cityLable.text = "获取用户城市失败"

    1. }
    2. }

    启动测试:

  • 相关阅读:
    比赛获奖的武林秘籍:07 一文速通电子设计大赛,电子人必看的获奖秘籍
    QT的QCommand的do和undo介绍
    C++Builder6.0 启动参数设置,不打开默认工程,不显示启动画面
    SQL高阶语句
    算法通关村-----透彻理解动态规划
    关于#微信#的问题:win11想强制删除微信在系统托盘的图标,求帮助(操作系统-windows)
    【微信小程序】小程序支持的css选择器、小程序自适应单位rpx简介
    pgr_createTopology
    基于Vue+SpringBoot的厦门旅游电子商务预订系统 开源项目
    动手学习深度学习 04:多层感知机
  • 原文地址:https://blog.csdn.net/LYly_B/article/details/132706299