iOS

epoc timeをUserDefaultsに保存する場合は32bit端末に要注意!

iOS見出し

iOSで自動更新型の月額課金などを実装する場合、UserDefaultsに、有効期限を保存したりしますね。

こんな感じで。

UserDefaults.standard.set(expires, forKey: "USERDEFAULT_EXPIRES")
UserDefaults.standard.synchronize()

この値を取り出す時に要注意です!

以下の感じで、「integerで」取り出すと

let expires = UserDefaults.standard.integer(forKey: "USERDEFAULT_EXPIRES")

iPhone5s以降の64bit端末だと、Int型が自動でInt64になるので問題ありませんが、iPhone5c以前の端末の場合32bitなので、expiresで来ているミリ秒の有効期限が桁あふれを起こしてしまいます。

2018/8/17は
1,534,464,000,000

Int32のmaxは
2,147,483,647
全然足りない….

Int64のmaxは
9,223,372,036,854,775,807
安心の包容力。

最悪の場合、月額課金してもらったユーザーさんの端末は起動しなくなるという恐ろしい事態に。

なので、32bit端末用に、必ず「objectで取り出してInt64へのキャスト」をしましょう!

var expires: Int64 = 0
// 値がセットされていない場合nilのInt64キャストで落ちるのでチェック
if let expiresObj = UserDefaults.standard.object(forKey: "USERDEFAULT_EXPIRES") {
  expires = expiresObj as! Int64
}

 

現場からは以上です。
∠(`・ω・´)