前提
swiftの本を一冊読み本の通りにクイズアプリを作成し、次にswiftUIのチュートリアルを終えました。
今までローカル上で動作させていたため、サーバーと連携することに触れていませんでした。
この度、サーバー連携の第一歩として、まずはチュートリアルのソースコードを色々変更し、挙動を試していました。
大まかな質問
-下記のSwiftUIのチュートリアルでは、ローカル上にあるjsonファイルを読み込んでいます
https://developer.apple.com/tutorials/swiftui/working-with-ui-controls
-ここで、レンタルサーバーにアップロードしてあるjsonファイルを読み込むようにコードを変更したいです。
-内容が誤っていた際に、外部サーバーのjsonファイルを変更すれば手軽に内容を書き換えることができるために、そのように変更したいと考えております。
実現したいこと
- レンタルサーバーにアップロードしてある「landmarkData.json」ファイルを読み込む
- 読み取る際はHTTP(アップロード先:http://abc.com/landmarkData.jsonとします)
チュートリアルのソースコード
下記のソースコードでローカル上の「landmarkData.json」を読み込んでいます
該当のソースコード名は「ModelData.swift」です
ModelData.swift
1import Foundation 2import Combine 3 4final class ModelData: ObservableObject { 5 @Published var landmarks: [Landmark] = load("landmarkData.json") 6 var hikes: [Hike] = load("hikeData.json") 7 @Published var profile = Profile.default 8 9 var features: [Landmark] { 10 landmarks.filter { $0.isFeatured } 11 } 12 13 var categories: [String: [Landmark]] { 14 Dictionary( 15 grouping: landmarks, 16 by: { $0.category.rawValue } 17 ) 18 } 19} 20 21func load<T: Decodable>(_ filename: String) -> T { 22 let data: Data 23 24 guard let file = Bundle.main.url(forResource: filename, withExtension: nil) 25 else { 26 fatalError("Couldn't find \(filename) in main bundle.") 27 } 28 29 do { 30 data = try Data(contentsOf: file) 31 } catch { 32 fatalError("Couldn't load \(filename) from main bundle:\n\(error)") 33 } 34 35 do { 36 let decoder = JSONDecoder() 37 return try decoder.decode(T.self, from: data) 38 } catch { 39 fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)") 40 } 41}
試したこと
-ソースコードを変更
ModelData.swiftの5行目
1 @Published var landmarks: [Landmark] = load("http://abc.com/landmarkData.json")
-ATSを無効化
デフォルトでHTTP通信がブロックされているのでは?と考え、下記のサイトのように設定しました
(https://ios-docs.dev/app-transport-security/)
-「json from url swift」と調べて出てきたやり方をやってみたが他のswiftファイルと整合性が合わずエラー多発...
ここまでご覧いただきありがとうございます。
是非とも回答いただけるととても嬉しいです。よろしくお願いします。
あなたの回答
tips
プレビュー