From 763de0f1b5a581b1bd3b1a70f870f6bfa5f9e6ef Mon Sep 17 00:00:00 2001 From: Chris Araman Date: Fri, 16 Apr 2021 20:37:34 -0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=8D=20Examine=20app=20page=20for=20ver?= =?UTF-8?q?sion=20newer=20than=20in=20search=20result?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MasKit/Controllers/MasStoreSearch.swift | 38 ++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/MasKit/Controllers/MasStoreSearch.swift b/MasKit/Controllers/MasStoreSearch.swift index 84dd94b..b0ca059 100644 --- a/MasKit/Controllers/MasStoreSearch.swift +++ b/MasKit/Controllers/MasStoreSearch.swift @@ -7,6 +7,7 @@ // import Foundation +import Version /// Manages searching the MAS catalog through the iTunes Search and Lookup APIs. public class MasStoreSearch: StoreSearch { @@ -46,11 +47,46 @@ public class MasStoreSearch: StoreSearch { } private func loadSearchResults(_ url: URL) throws -> SearchResultList { + var results: SearchResultList let data = try networkManager.loadDataSync(from: url) do { - return try JSONDecoder().decode(SearchResultList.self, from: data) + results = try JSONDecoder().decode(SearchResultList.self, from: data) } catch { throw MASError.jsonParsing(error: error as NSError) } + + // The App Store often lists a newer version available in an app's page than in + // the search results. We attempt to scrape it here. + for index in results.results.indices { + let result = results.results[index] + guard let searchVersion = Version(tolerant: result.version), + let pageUrl = URL(string: result.trackViewUrl) + else { + continue + } + + let pageData: Data + do { + pageData = try networkManager.loadDataSync(from: pageUrl) + } catch { + continue + } + + let html = String(decoding: pageData, as: UTF8.self) + let regex = try NSRegularExpression(pattern: #"\"versionDisplay\"\:\"([^\"]+)\""#) + let fullRange = NSRange(html.startIndex.. searchVersion { + results.results[index].version = pageVersion.description + } + } + + return results } }