首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 串接鳳凰新聞 API 入門資源與實作方向

     編輯:程式設計綜合問答

問題背景

初學 iOS,老師要求串接鳳凰新聞 API 做 App,拿到 API 文件卻無從下手。

學習路徑建議

  1. 確認 API 格式:通常為 RESTful JSON(或 XML)。取得 Base URL、端點、參數、回傳結構、認證方式(API Key/OAuth)。
  2. 掌握 iOS 網路請求基礎:
    • URLSession (原生,iOS 7+):dataTask(with:completionHandler:)。
    • 第三方庫:Alamofire (Swift)、AFNetworking (Obj-C) —— 鏈式語法、自動序列化、攔截器。
  3. JSON 解析:Codable (Swift 4+) 定義模型結構體,JSONDecoder 一行解碼。
  4. 非同步更新 UI:主執行緒 DispatchQueue.main.async { self.tableView.reloadData() }。
  5. 錯誤處理與重試:網路失敗、解析失敗、Token 過期刷新。

最小可行程式碼

// Model
struct NewsItem: Codable {
    let title: String
    let summary: String
    let imageUrl: String
    let publishTime: Date
    let link: String
}
struct ApiResponse: Codable {
    let code: Int
    let data: [NewsItem]
    let message: String
}

// Service
class NewsService {
    static let shared = NewsService()
    private let baseURL = "https://api.ifeng.com" // 範例,請替換真實文件
    private let session = URLSession.shared

    func fetchLatest(completion: @escaping (Result<[NewsItem], Error>) -> Void) {
        guard let url = URL(string: "\(baseURL)/news/latest") else { return }
        var request = URLRequest(url: url)
        request.setValue("YOUR_API_KEY", forHTTPHeaderField: "Authorization") // 若需

        session.dataTask(with: request) { data, resp, err in
            if let err = err { completion(.failure(err)); return }
            guard let data = data else { completion(.failure(NSError())); return }
            do {
                let res = try JSONDecoder().decode(ApiResponse.self, from: data)
                completion(.success(res.data))
            } catch { completion(.failure(error)) }
        }.resume()
    }
}

// ViewController
class NewsViewController: UITableViewController {
    var items: [NewsItem] = []
    override func viewDidLoad() {
        super.viewDidLoad()
        NewsService.shared.fetchLatest { [weak self] result in
            DispatchQueue.main.async {
                switch result {
                case .success(let list): self?.items = list; self?.tableView.reloadData()
                case .failure(let e): print("錯誤:\(e)")
                }
            }
        }
    }
    override func tableView(_ tv: UITableView, numberOfRowsInSection s: Int) -> Int { items.count }
    override func tableView(_ tv: UITableView, cellForRowAt ip: IndexPath) -> UITableViewCell {
        let cell = tv.dequeueReusableCell(withIdentifier: "Cell", for: ip)
        cell.textLabel?.text = items[ip.row].title
        return cell
    }
}

推薦學習資源

常見坑

問題解決
HTTP 載入被阻擋 (ATS)Info.plist 加 NSAppTransportSecurity → NSAllowsArbitraryLoads = YES (僅開發),生產需 HTTPS。
JSON 欄位名不符用 CodingKeys 映射:enum CodingKeys: String, CodingKey { case imageUrl = "img_url" }。
日期格式非標準let decoder = JSONDecoder(); decoder.dateDecodingStrategy = .formatted(formatter)。
圖片載入慢/閃爍用 Kingfisher / SDWebImage 非同步快取載入。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved