プラットホーム: 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
}
}
|