IPアドレス取得のサンプル(Swift)
Mar 7, 2016 · oldswift2swift3
以下はSwift2の情報で古い為、注意!
Swift3版のソースはこちら
(解説はそのうちに・・・・)
iOS端末のIPアドレスを取得するサンプル。Cの関数呼び出し周りも含めてSwiftにて実装。
一応、Apple公式の方法でIPv6only環境でも動作確認済。
実装概要
アドレス取得の実装はNetworkInfo
にまとまっている。
実装の中身自体はよくあるIPアドレスの取得のコード。
サンプルでは、IPアドレスの一覧を取得してTableView
に表示している。
細かい点は実際のソースを参照のこと。
小ネタ
Cの関数呼び出し
端末内部のネットワーク情報を取得する為に、getifaddrs
やinet_ntop
などの関数を呼び出すが、
通常のCであればファイルの頭で
#include <ifaddrs.h>
#include <sys/socket.h>
#include <netinet/in.h>
とするが、SwiftなのでBridging-Header.h
を用意して、そこにinclude
を書く。
あと、ヘッダを追加した後にはビルド設定のObjective-C Bridging Header
も忘れずに変更。
デバイス
とりあえず今回は、IPアドレスを取りたいだけなので、WiFi(en0
)とCellular(pdp_ip0
)の
デバイスのみチェックしている。
Swiftの言語的なこと
defer
がとっても便利。これのおかげでリソースの解放のような後始末が必要なコードが、
とても簡単にかけるし処理漏れもなくなるので素晴らしい!
(これが無いと今回のように処理の中でエラーで返すような場合はコードが面倒になる)
ポインタが見えなくなったり、型が厳格になってC系のソースの移植が面倒に思えるけど、
- 対応する型への変換(特に
UnsafePointer
) - C++の
->
に相当するのがmemory
- 同じく
[]
に相当するのがadvancedBy
(今回は出てこないけど)
と言ったあたりを押さえておけばOKな気がする。
確かに冗長な感じは否めないが、型は書かなくても済むことが多いし、 逆に一度正しく変換しておけば後はコンパイラで型チェックが行われるのは安心できる。
この辺りのバランス感覚がSwiftは絶妙だと思う。
参考リンク
開発環境
- Xcode 7.2
- iOS 9.2
- iPhone 6+
- Mac OS 10.11.3(NAT64ネットワーク)