[iOS study] 練習串接第三方 API,以Google Custom Search展示mojim歌詞

練習串接Google Custom Search JSON API,以mojim歌詞網為例

如何取得 search engine ID & API key教學:

由於這次table使用到多個section,根據不同section串接不同API目標,因此我將串接語法寫在cellForRowAt indexPath 的func中

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {let cell = tableView.dequeueReusableCell(withIdentifier: "ladySongsCell", for: indexPath)//key1if let urlStr = String( "https://www.googleapis.com/customsearch/v1?cx=014436186619858147575:7btb6tfbffm&key=AIzaSyDa01sgwqqUuVzv73Gd2RBFdiqGV5192As&q=" + singerLady[indexPath.section] + "&siteSearch=mojim.com").addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed){if let url = URL(string: urlStr) {let task = URLSession.shared.dataTask(with: url) { (data, response, error) inlet decoder = JSONDecoder()if let data = data, let mojimJson = try? decoder.decode(Mojim.self, from: data){let songs = mojimJson.items[indexPath.row].titlelet songName = songs.components(separatedBy: "歌詞")DispatchQueue.main.async {cell.textLabel?.text = songName[0]}}}task.resume()}}return cell}

但在這邊串接的資料我研究不出如何儲存再利用,表格點選之後展示在下一頁的部分,我只好在該頁再次重新串接...

而資料傳遞的部分,只傳遞所選cell的section title跟row的數值:

@IBSegueAction func ladySongs(_ coder: NSCoder) -> SecondViewController? {let indexPath = self.tableView.indexPathForSelectedRowlet cellID:Int = self.tableView.indexPathForSelectedRow!.rowlet sectionA:Int = indexPath!.sectionlet controller = SecondViewController(coder: coder)controller?.number = cellIDcontroller?.singer = singerLady[sectionA]return controller}

下一頁語法:

class SecondViewController: UIViewController {var singer:String?var number:Int?@IBOutlet weak var titleLabel: UILabel!@IBOutlet weak var lyricLabel: UILabel!override func viewDidLoad() {super.viewDidLoad()// key9if let urlStr = String( "https://www.googleapis.com/customsearch/v1?cx=014436186619858147575:7btb6tfbffm&key=AIzaSyC6nxpw0jRP9c9vd_oKScmbWmSLUeN7xJw&q=" + singer! + "&siteSearch=mojim.com").addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed){if let url = URL(string: urlStr) {let task = URLSession.shared.dataTask(with: url) { (data, response, error) inlet decoder = JSONDecoder()if let data = data, let mojimJson = try? decoder.decode(Mojim.self, from: data){let song = mojimJson.items[self.number!].titlelet songName = song.components(separatedBy: "歌詞")let lyric = mojimJson.items[self.number!].snippetDispatchQueue.main.async {self.titleLabel.text = songName[0] + " " + self.singer!self.lyricLabel.text = lyric}}}task.resume()}}}}

本來還有篩選不要的部分不展示,不過cell的remove跟delete還沒有研究清楚,只好先暫時擱置這個項目。

Google search API 串接資料有數量限制,所以我在練習途中一直新增更多API key並輪替使用,才能順利測試

後來不同地方串接的,我就用不同的API key

(不過測試多次後,有些key串接數量還是會被用盡,若要變成順利使用的App,要怎麼設計我還要再想想……)

APP內建置search bar ,我本來以為用textfield即可,但是做不出來,網路上找到一篇教學才順利完成,教學參考:

但是有不少問題,其中一項是搜尋完成的表格,我無法點選,點選會同取消效果...

另外換頁後,再換回搜尋頁,不知為何會變黑畫面,總之還有很多不懂的問題,只能先告一段落展示一部分。

github:

--

--

Yolanda H.
彼得潘的 Swift iOS / Flutter App 開發教室

悠琅妲之愛梯熙緹推敲推敲潑墨坊 { iOS App | website SEO | Python | Aroma | Zumba | Chinese Poems | Tabletop game }