iOS

iOS 18

アクションボタン

https://support.apple.com/ja-jp/guide/iphone/iphe89d61d66/ios
https://support.apple.com/ja-jp/guide/iphone/iphe89d61d66/18.0/ios/18.0

デペロッパーモード

Enabling Developer Mode on a device | Apple Developer Documentation

WatchDog

サンプルコード

AppDelegate.swiftを追加する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// AppDelegate.swift

import UIKit
import os

class MyAppDelegate: NSObject {
    private let logger = Logger(subsystem: "com.hiroakit.AppPlayground1", category: "Launch")
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        logger.log("Start didFinishLaunchingWithOptions")
        sleep(25)
        logger.log("End didFinishLaunchingWithOptions")
        return true
    }
}

クラッシュレポート

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
-------------------------------------
Translated Report (Full Report Below)
-------------------------------------

Incident Identifier: 556FE78A-C58C-422B-815B-4C2D77779A0A
CrashReporter Key:   6d90d78f5c7dd0d6c190d36604deee3ba4b1bc3a
Hardware Model:      iPhone17,3
Process:             AppPlayground1 [4612]
Path:                /private/var/containers/Bundle/Application/F592CC68-C4ED-4822-8B5D-71EF7ABAEAE4/AppPlayground1.app/AppPlayground1
Identifier:          com.hiroakit.AppPlayground1
Version:             1.0 (1)
Code Type:           ARM-64 (Native)
Role:                Foreground
Parent Process:      launchd [1]
Coalition:           com.hiroakit.AppPlayground1 [2421]

Date/Time:           2025-03-02 10:28:29.0745 +0900
Launch Time:         2025-03-02 10:28:08.0605 +0900
OS Version:          iPhone OS 18.3.1 (22D72)
Release Type:        User
Baseband Version:    1.40.03
Report Version:      104

Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Termination Reason: FRONTBOARD 2343432205 
<RBSTerminateContext| domain:10 code:0x8BADF00D explanation:scene-create watchdog transgression: app<com.hiroakit.AppPlayground1(E45319F4-4216-43EF-A72C-A899B7230DFB)>:4612 exhausted real (wall clock) time allowance of 19.97 seconds
ProcessVisibility: Foreground
ProcessState: Running
WatchdogEvent: scene-create
WatchdogVisibility: Foreground
WatchdogCPUStatistics: (
"Elapsed total CPU time (seconds): 22.100 (user 11.320, system 10.780), 18% CPU",
"Elapsed application CPU time (seconds): 0.009, 0% CPU"
) reportType:CrashLog maxTerminationResistance:Interactive>

Triggered by Thread:  0

資料

ロギング

swift-log

インストール

ロギングAPIのLoggerとos_log

ロギングAPIの歴史

2005年、AppleはMac OS X 10.4 TigerでApple System Logger (ASL) を導入した。同年のWWDC 2005 Session 510 Core OS Enhancements for BSD DevelopersではApple System Loggerに触れているらしいが資料が見当たらない。

2008年、iOS 2 (iPhone OS 2) ではロギングにNSLog を用いた。

2016年、Appleは Unified Logging System という新しいロギングのシステムと新しいロギングAPI os_log をiOS 10 SDKで提供するとWWDC 2016 Session 721 Unified Logging and Activity Tracing で発表した。それまでにロギングで使われていたNSLog, asl_log_message, syslogなどはレガシーAPIと扱われた。os_logを使う場合、import os.logが必要だ。

2020年、AppleはWWDC 2020のセッション Explore logging in SwiftLogger 構造体を発表した。os_logと同様に Unified Logging System に書き込む。同セッションではLoggerを使うためにimport osをしている。

名前空間

iOS Swift Objective-C
os_log 10以降 import os.log #import <os/log.h>
Logger 14以降 import os なし

サンプル実装

サンプル実装としてボタン押下でログ出力するアプリを用意した。

XcodeでNew Project, App Playgroundを選択して、ContentView.swiftを次のコードに置き換える。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import SwiftUI
import os

struct ContentView: View {
    private let logger = Logger(subsystem: "com.hiroakit.AppPlayground1", category: "UI")

    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)

            Button("ログを出力") {
                logger.info("info: ボタンがタップされました")
                logger.log("log: ボタンがタップされました")
                logger.warning("warning: ボタンがタップされました")
                logger.error("error: ボタンがタップされました")
            }
            .padding()
        }
    }
}

ログ確認

  • コンソール.app

    Loggerでログ出力をする場合、コンソール.app (以下、コンソール) でほぼリアルタイムでログを閲覧できる。

    下図は上のサンプル実装で出力されたログをコンソールで確認している様子だ。サンプル実装ではLogger(subsystem:category:)の第一引数のsubsystemに com.hiroakit.AppPlayground1 と入力しているので、 サブシステム:com.hiroakit.AppPlayground1 とコンソールの検索バーに入力すると該当のログが表示される。


    • 手順

      1. コンソールを起動する
      2. ログを確認したい端末を選択する (下図①)
      3. 「ストリーミングを開始」をクリックする (下図②)
      4. 検索バーにキーワードを入力する
        • 入力例 サブシステム:com.hiroakit.AppPlayground1


  • logコマンド

    logコマンドがある。

    1
    2
    
    which -a log
    /usr/bin/log
    

    logコマンド (log stream) ではiPhone実機のログをリアルタイムに閲覧できない。logコマンドを使う場合はlog collectコマンドでiPhoneに蓄積されているログをlogarchiveファイルにして閲覧する。

    1
    
    sudo log collect --device-name <name>
    

    上のコマンドでsystem_logs.logarchiveファイルが作成される。このファイルをダブルクリックするとコンソールで閲覧できる。

    • logコマンドのエラー

      sudoをつけないと次のエラーが発生する

      log: Must be root to collect logs from attached device

ネットワーク速度の変更

iOS 18

速度変更の方法

  1. 設定アプリを起動する
  2. デペロッパ をタップ
  3. ネットワークリンク調節器 をタップ
    • 以前の名称は Network Link Conditioner だった
  4. 有効にする をオンにする
    • 下部で選択したプロファイルが有効となる
  5. 使い終わったら、 有効にする をオフにする

計測

fast.comで下りの回線速度を計測した。

  • ネットワークリンク調節器の 有効にする がオフの状態で、Wi-Fiで下りの回線速度は170Mbpsであった。
  • 同じWi-Fiに接続した状態でネットワークリンク調節器の 有効にする をオンにして以下のプロファイルで計測した。

プロファイルと計測結果

  • 100% Loss
    • 測定不可 (0.0Kbpsと表示される)
  • Very Bad Network
    • 160Kbps
  • 3G
    • 730Kbps
  • LTE
    • 43Mbps
  • Wi-Fi
    • 39Mbps

Xcode

ショートカットキー

Xcodeの設定画面 (Cmd + ,) でKey Bindingsタブをみるとショートカットキーは確認できる。

項目 キー 説明
File > Open Quickly… Shift + Cmd + O ファイルの絞り込みUIを表示する
Edit > Bookmark Ctrl + Shift + Cmd + ' 表示中のファイルをブックマーク
Edit > Bookmark (Line) Ctrl + Cmd + ' 表示中のファイルを特定の行でブックマーク
View > Show/Hide Code Review Option + Shift + Cmd + Enter ファイルのDiffを表示する
View > Show Quick Actions… Shift + Cmd + A アクション (コマンド) の絞り込みUIを表示する
View > Editor > Focus Ctrl + Shift + Cmd + Enter アクティブになっているエディタ以外を隠す
View > Editor > Show Document Items Ctrl + 6 プロパティ、メソッドの一覧を表示する
View > Navigators > Filter in Navigator Option + Cmd + J ナビゲーターで絞り込み
View > Debug Area > Activate Console Shift + Cmd + C コンソールにカーソルを移す
View > Debug Area > Show/Hide Debug Arean Shift + Cmd + Y デバッグ領域を表示する
View > Inspectors > History Option + Cmd + 2 ファイルのコミット履歴を表示する
Find > Find in Workspace… Shift + Cmd + F ワークスペース内を検索する検索バーにカーソルを移す
Find > Find Next in Workspace Ctrl + Cmd + G ワークスペース内で検索した結果の次の項目に移る
Find > Find Previous in Workspace Ctrl + Shift + Cmd + F ワークスペース内で検索した結果の前の項目に移る
Find > Find Selected Text in Workspace 未割り当て ワークスペース内を選択したテキストで検索する
Find > Find Selected Symbol in Workspace Ctrl + Shift + Cmd + F ワークスペース内を選択したシンボルで検索する
Find > Find Call Hierarchy Ctrl + Shift + Cmd + H 呼び出し階層を表示する
Find > Use Selection for Find Cmd + E 選択した文字列でエディタ内を検索する
Find > Select Next Occurrence Option + Cmd + E 選択した文字列が次に登場する箇所にカーソルを移す
Find > Select Previous Occurrence Option + Shift + Cmd + E 選択した文字列が前に登場する箇所にカーソルを移す
Navigate > Reveal in Project Navigator Shift + Cmd + J 表示しているファイルをプロジェクトナビゲータで示す
Navigate > Open in Next Editor Option + Cmd + , 次のエディタに切り替え
Navigate > Open in… Option + Cmd + < エディタを切り替え
Navigate > Move Focus to Next Editor Ctrl + ` 次のエディタにフォーカスを移す
Navigate > Move Focus to Editor… Cmd + J 選択したエディタにフォーカスを移す
Navigate > Jump to Selection Option + Cmd + L 選択箇所 (カーソルがある行) に移動する
Navigate > Jump to Definition Ctrl + Cmd + J 定義に移動する
Navigate > Jump to Line in Cmd + L 指定した行に移動する
Editor > Show Editor Only Cmd + Enter エディタ領域をシンプルな表示にする
Editor > Minimap Ctrl + Shift + Cmd + M エディタ領域の右側に縮尺図を表示する
Editor > Author Ctrl + Shift + Cmd + A エディタ領域の右側にコミットコメントを表示する
Editor > Code Coverage 未割り当て エディタ領域の右側にテストケースの通過回数を表示する
Editor > Selection > Select All Symbols 未割り当て カーソルが当たっているシンボルをすべてハイライトする
Editor > Selection > Split Selection By Lines 未割り当て 矩形選択後の文字入力待機状態に移行する
Editor > Selection > Balance Delimiters 未割り当て { } を範囲選択する
Editor > Structure > Re-Indent Ctrl + I コードのインデントを修正する
Editor > Structure > Add Documentation Option + Cmd + / ドキュメント (DocC ) を追加する
Editor > Code Folding > Fold Option + Cmd + ← コードを折り畳む
Editor > Code Folding > Unfold Option + Cmd + → コードを広げる
Editor > Code Folding > Unfold All 未割り当て コードをすべて広げる
Editor > Code Folding > Fold Methods & Functions Option + Shift + Cmd + ← メソッドと関数を折り畳む
Editor > Code Folding > Unfold Methods & Functions Option + Shift + Cmd + → メソッドと関数を広げる
Product > Choose Destination Ctrl + Shift + 0 エディタ領域をシンプルな表示にする
Debug > Pause Ctrl + Cmd + Y
Debug > Continue To Current Linene Ctrl + Cmd + C
Debug > Step Over F6
Debug > Step Into F7
Debug > Step Out F8
Debug > Step Over Thread Ctrl + Shift + F6
Debug > Step Into Thread Ctrl + Shift + F7


  • エディタ領域は筆者の造語
  • 未割り当て はXcodeの設定でキーを割り当てできる

デペロッパーモード

iOS 16からデペロッパーモードが導入された。

デペロッパーモードがオフの場合、Xcode (Devices and Simulators) は下図の表示をする。


UIテスト

XCUITest

手前味噌

https://github.com/hiroakit/ios-ui-testing-learn

数秒待機する

iOS 8以降なら、DispatchQueue.asyncAfter(deadline:execute:) を使う

https://developer.apple.com/documentation/dispatch/dispatchqueue/2300020-asyncafter

1
2
3
4
let exp = expectation(description: "Task")
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
    exp.fulfill()
}

iOS 10以降 (Xcode 8.3以降) なら、XCTWaiterを使う

https://developer.apple.com/documentation/xctest/xctwaiter/2806744-wait

1
2
let exp = expectation(description: "Task")
XCTWaiter().wait(for: [exp], timeout: 3)