プラットホーム: iOS Application: App
ViewController.swift |
// // ViewController.swift // URLSession // // Created by Yoshihisa Nitta on 2024/09/23. // import UIKit class ViewController: UIViewController { @IBAction func tapButton(_ sender: Any) { let url = URL(string: "http://localhost:8080")! let request = URLRequest(url: url) let session = URLSession.shared session.dataTask(with: request) { (data, response, error) in if error == nil, let data = data, let response = response as? HTTPURLResponse { print("Content-Type: \(response.allHeaderFields["Content-Type"] ?? "")") print("statusCode: \(response.statusCode)") let s = String(data: data, encoding: String.Encoding.utf8) ?? "" print(s) //self.myLabel.text = s } }.resume() } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } } |
同一マシン上に tomcat が動作している場合は、Xcode のConsole に結果が表示される。 Webサーバに正しくアクセスできた場合は status code として 200 が返される。
Console |
Content-Type: text/html;charset=UTF-8 statusCode: 200 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Apache Tomcat/9.0.94</title> ...(略)... |
同一ネットワークでなくても構わないが、問題の切り分けを簡単にするために、同一の Wifi 親機に接続することを強く勧める。
IP Address を確認する |
$ ifconfig |
iOS デバイスを最初に接続した時は、かなり大量のデータを Mac に吸い上げるため、認識されるまでに時間がかかる。 {2度目以降は、すぐに認識されて 'Connected' を表示され、実行デバイスとして選択できるようになる。
この例ではWebサーバのIP アドレスが 192.168.11.11 である場合である。 IPアドレスを自分の環境に合わせて変更すること。
"http://localhost:8080"
→ "http://
192.168.11.11:8080/proj/NetData?data=1"
ViewController.swift の変更点。IP Address 192.168.11.11 は各自の環境に合わせること。 |
*** ViewController.swift Mon Sep 23 11:46:04 2024 --- ViewController2.swift Mon Sep 23 14:42:23 2024 *************** *** 10,16 **** class ViewController: UIViewController { @IBAction func tapButton(_ sender: Any) { ! let url = URL(string: "http://localhost:8080")! let request = URLRequest(url: url) let session = URLSession.shared session.dataTask(with: request) { (data, response, error) in --- 10,16 ---- class ViewController: UIViewController { @IBAction func tapButton(_ sender: Any) { ! let url = URL(string: "http://192.168.11.11:8080/proj/NetData?data=1")! let request = URLRequest(url: url) let session = URLSession.shared session.dataTask(with: request) { (data, response, error) in |
iOS 9 (2016) 以降は、iOS のアプリの Web アクセスは https を使うことが推奨され、基本的に http アクセスはできなくなった。 今回は開発用でもあり、簡単のため、危険性を理解した上で ATS を無効化し、 http アクセスを使うことにする。 具体的には Info.plist に次のエントリを追加する。
App Transport Security Settings
> Allow Arbitrary Loads
キーを追加して、値を YES
に設定する。
App Transport Security Settings
と入力する。
入力途中で候補が示されるので選択すればよい。Allow Arbitrary Loads
を作成する。App Transport Security Seeings
> Allow Arbitrary Loads
キーの値を YES
に変更する。
![]() |
ボタンを6個に増やしたプロジェクトは以下の通り。
URLSession3 の ViewController.swift |
// // ViewController.swift // URLSession // // Created by Yoshihisa Nitta on 2024/09/23. // import UIKit class ViewController: UIViewController { @IBAction func tapUp(_ sender: Any) { wget(1) } @IBAction func tapLeft(_ sender: Any) { wget(2) } @IBAction func tapDown(_ sender: Any) { wget(3) } @IBAction func tapRight(_ sender: Any) { wget(4) } @IBAction func tapFire(_ sender: Any) { wget(5) } @IBAction func tapJump(_ sender: Any) { wget(6) } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } func wget(_ v: Int) -> Bool { var url = URL(string: "http://172.17.136.190:8080/proj/NetData?data=\(v)")! let request = URLRequest(url: url) let session = URLSession.shared session.dataTask(with: request) { (data, response, error) in if error == nil, let data = data, let response = response as? HTTPURLResponse { print("Content-Type: \(response.allHeaderFields["Content-Type"] ?? "")") print("statusCode: \(response.statusCode)") let s = String(data: data, encoding: String.Encoding.utf8) ?? "" print(s) } }.resume() return true } } |