iOS

和暦だとローカルプッシュが来なくなった件

使わない人は存在にすら気づいていないかもしれない「和暦」

iOSでは
設定アプリ > 一般 > 言語と地域 > 暦法
から変更できます。

タイ仏暦ってなんぞ?

 

暦法を変えることで、対応しているアプリでは表記が平成になります。

ふぅ〜〜んと聞き流すような内容ですが、ローカルプッシュ通知を使う場合、この和暦が大きく影響して来るので気をつけて下さい!

 

和暦がローカルプッシュに影響する?

ローカルプッシュ通知は、サーバーを使わず、アプリだけでプッシュ通知ができる機能でiOS10以降ではUIUserNotificationがdeprecatedになり、UNUserNotificationCenterに変わりました。

プッシュ通知をする日時はDateComponentsクラスのパラメータ、year, month, day, hour, minuteに指定して渡す、とてもシンプルな仕組みです。

が!

ここに罠がありました。

DateComponentsのパラメータ「year」が
iPhoneの暦法が西暦の場合は西暦を、和暦の場合は和暦をセットしないといけないんです。

つまりiPhoneは和暦設定なのに、yearに2019なんて指定しちゃうと、平成2019年( 西暦4050年!! )になるまでローカルプッシュが発動しません

 

対処法

日付を処理する場合は暦法が影響しないDate型で処理します。
そしてDateComponentsに変換する場合は

let dateComponent = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .weekday], from: timerDate)

とすると、「Calendar.current」の所で、自動的に、yearの中にiPhoneで設定した暦法の値(西暦? or 和暦? or タイ仏暦(なにこれ?))が入るようにいい感じに処理してくれます。

逆にiPhoneの設定にかかわらず西暦が欲しい(和暦が欲しい)という場合は

// 西暦
let dateComponent = Calendar(identifier: .gregorian).dateComponents([.year, .month, .day, .hour, .minute, .weekday], from: timerDate)

// 和暦
let dateComponent = Calendar(identifier: .japanese).dateComponents([.year, .month, .day, .hour, .minute, .weekday], from: timerDate)

とCalendarのコンストラクタの引数に明示的に暦法の種類を指定すればOKです。

 

 

twitterでも個人開発情報をつぶやいていますので、フォローをお願いします。

 

Brgfx – jp.freepik.com によって作成された background ベクトル