
 

プラットホーム: 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 に変更する。



 をクリックする。
 をクリックする。
 をクリックして、実デバイス上でアプリを実行する。
iPhone上の "Button" をクリックするたびに "1" というデータを Webアプリ (/proj/NetData) に送る。
 をクリックして、実デバイス上でアプリを実行する。
iPhone上の "Button" をクリックするたびに "1" というデータを Webアプリ (/proj/NetData) に送る。
|   | 


ボタンを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
    }
}
 | 
