スポンサーリンク
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 }
現場からは以上です。
∠(`・ω・´)
スポンサーリンク