Unityにはネットワーク接続確認の機能Application.internetReachability
が存在しますが、あえてNWPathMonitorを使ったSwiftのネイティブプラグインを作ってみました。
iOSのネットワーク接続状態の検出にはReachabilityよりシンプルなNWPathMonitorを使いましょう。 - Qiita
Swift周りの処理はコチラの記事を参考にさせて頂きました。
Swift側
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
// connected
self._onCallback("1")
} else {
// No connected
self._onCallback("0")
}
}
NWPathMonitorインスタンス(monitor)を使って接続中であれば"1"
、切断中であれば"0"
を予めセットしておいたコールバックで返却します。
Objective-C++側
API_AVAILABLE(ios(12.0))
UniNWPathMonitor *_monitor;
今回NWPathMonitorを使うにあたって、iOS12以降が必須となるため、API_AVAILABLE
でiOS12以降が必須であることを宣言します。
[_monitor setCallbackOnCallback:^(NSString * value) {
UnitySendMessage("UniNWPathMonitor", "Noti", [value UTF8String]);
}];
UniNWPathMonitorに対しコールバックをセットします。
コールバックが返ってきたらUnitySendMessage
を使ってUnity側のに接続情報を返却します。
Objective-C++の記述は以前執筆したコチラの記事を参考にして頂ければと思います。
【Unity】最近のUnityでC#からSwiftを実行する最短実装 - Qiita
Unity側
Unity側ではこのような使い方になります。
UniNWPathMonitorにStartMonitorを実行しコールバックをセットするだけです。
void Start()
{
UniNWPathMonitor.StartMonitor();
UniNWPathMonitor.onChangeNetworkStatus += status =>
{
if (status == UniNWPathMonitor.NetworkStatus.satisfied)
// 接続中
else
// 切断中
};
}
実際作ったものはコチラ。WifiのオンオフをしてUnity側でコールバックを受け取っています。切り替えてUnityにコールバックが返るまで少しラグが発生するようです。
最後に
冒頭で申し上げたとおり、ぶっちゃけUnityの場合はApplication.internetReachabilityが存在するため本プラグインは不要です。※筆者が作ってみたかったから作ってみたというやつです。
自分にとっては、実際に作ってみて学びは多かったです。初めて出てきたSwiftのコールバック文法や、iOS12以降を必須にする方法など、現在勉強中のSwiftの事を知る機会が出来て良かったです。
以下に全ソースアップしているので、ご参考にどうぞ。
https://github.com/baobao/UniNWPathMonitor
開発環境
- Unity2019.4.4f1
- Xcode11.6
- iPhone6S iOS13.6