そもそも可能?→普通はできない
iOSにおいて、アプリから端末のシリアル番号は取得できません。(UDIDも同様かと思います)
ただし、以下の場合はどうにかできます。
MDMで管理されたデバイスで、Enterpriseアプリ等を使用する場合
AppStoreで配布するアプリで一般公開する場合ではできません
※MDMというのは企業・学校などが社員・学生用端末を管理するための管理プラットフォームです。
予め管理する端末をMDMに登録しておきます。
Apple Business Managerとか、Apple Configuratorとかで調べると情報があるかと思います。
ちなみに、この仕組でAppleのEnterpriseアプリを配布するには結構敷居が高いです。
(厳しい審査があり、100名以上の社員数などいろいろ条件があります)
過去に、Enterpriseアプリを不正利用した会社があるので仕方ないですね。
(Enterpriseアプリを一般公開・配布していた事件)
どうするの?→アプリ管理設定プロファイル
MDMを使用し、アプリ管理設定プロファイルを用いて、任意の設定値を管理端末に投げ込むことができます。
その具体的な方法は、ご利用のMDMのHELP等に記載があるかと思います。
自分が使用しているMDMの場合は、設定値としてシリアル番号が選択できましたので、
serialという設定キーで、端末のシリアル番号を指定してプロファイルを作成し、
それを自動登録にしてしまえば、それでアプリから各端末のシリアル番号を取得できます。
他のMDMはしりませんが、もし、値をシリアル番号を指定できない場合は、端末毎に個別にシリアル番号を入れてあげる必要があるかもしれません。
恐らく自動でシリアル番号を投げる機能はどのMDMにもあるとは思いますが・・・。
アプリからどうやって取得するの?
UserDefaults(com.apple.configuration.managed)に格納されていますので、以下のように取得できます。
if let managedConf = UserDefaults.standard.object(forKey: "com.apple.configuration.managed") as? [String:Any?] {
let deviceId = (managedConf["serial"] as? String)!
// 端末のシリアル番号がdeviceIdに格納される
}
※アプリ管理設定プロファイルでキーをserial、値をシリアル番号にした場合。
それで何ができるの?
MDMで管理する端末で業務アプリなどを運用している場合、別途管理サーバーを用いて認証などを行っていると思います。
ユーザーアカウントと端末を1:1で対応させたいこともあるでしょう。
MDMでユーザーIDを投げ込んでいる場合は特に問題ないでしょうが、一般的なID/パスワードのログイン画面を表示するような場合では、1つのユーザーアカウントで複数の端末にログインできることになります。
(もちろん、その端末は管理端末なので勝手に買ってきたiPadなどは使用できませんが)
上記の方法で、ユーザーIDに紐づけてシリアル番号を保持しておき、アプリでのログイン認証時にチェックすることができます。
まあ、だから何だという話かもしれませんが、実現しようとして調べてもあまり情報がなかったので書いておきます。