iOS13のダークモード対応について

iOS13でダークモード対応らしいです。

iOS13がリリースされた暁に自分が作ったアプリがダーク色にならなかったら恥ずかしいですね。

 

ということでネットで調べて対応してみました。codeで直接色指定をしていなければ、ほとんどの場合、story board上で変更できます。

この際にsystem colorを使うのがミソです。今まで色々とcustom colorを使っていたのですが、この際簡単にダークモードに対応させるためappleが指定するsystem colorに変更しました。

 

ハマりポイントは、おそらくViewや部品などをstory board上で重ねてレイアウトしていると思うのですが、どのViewのbackgroud colorでsystem colorを指定するかですね。

story board上でlightモードとdarkモードの切り替えは出来ますが、最低でもシュミレーターで確かめないと思ったとおりの色にはならないです。

 

あと私だけかもしれませんが、UITextViewでハマりました。これをsystem colorに変更しても変わらない。半日ぐらい悩んだあと、ふとUITextViewをhtmlモードで利用していることを思い出し、以下のコードを追加することでダークモードに対応することができました。

 

    // iOS13 ダークモード対応

    if (@available(iOS 13.0, *)) {

        if(self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark){

            [attributedString addAttribute:NSForegroundColorAttributeName

                                     value:[UIColor whiteColor]

                                     range:NSMakeRange(0, [attributedString length])];

 

        }else{

            [attributedString addAttribute:NSForegroundColorAttributeName

                                     value:[UIColor blackColor]

                                     range:NSMakeRange(0, [attributedString length])];

        }

    }

 

その他、諸々ありましたが、ほぼほぼ対応できたと思います。

Parse.comのプッシュ通知がおかしい

あるアプリ(iPhone, Android)で来年早々終了するParseを使ってプッシュ通知を実装しています。

昨日から1日に1回1500人程度、最大8回ぐらいプッシュ通知を送っています。不定期ですが、プッシュ通知はだいたいうまく動作していたのですが、昨日はiPhoneだけ全く通知されない事象が2回ありました。

自前のサーバーからParse提供のAPIを使って送信指示を出しているのですが、うまくいくときと、いかないときがあります。そのため、2回目の不通知が発生したときに、ParseのConsoleから直接送ってみたところ、うまく行きました。

今まで実績があって動いていたのに解せないです。約半年でなくなるサービスなので仕方ないかもしれないですけど、ちょっと勘弁ですね。。。

Firebae FCMに既存のAPNs tokenを移行できる(かも)

Parse.comの移行先として、Firebaseを検討しています。

Firebaseは色んな機能があり魅力的なのですが、Parseにあるデバイストークンを移行できないって聞いていたので、残念に思ってました。

しかし、Firebaseのドキュメントを漁っていたところ、デバイストークンをインポートできそうな機能を見つけました。 Server Reference  |  Instance ID  |  Google Developers

ちなみに未検証です。Androidのトークンも移行できそう。

FirebaseのFCM(プッシュ通知)をcurlで実行してもiPhoneアプリにNotificationがでない

FCM Server経由でiPhoneアプリAndroidアプリにtopicを利用したpush通知を送りたくて、curlで確認したところかなりハマってしまったのでメモとして残しておきます。

前提として、両アプリともFirebase Cloud Messaging(FCM)を組み込んでいて、Firebase ConsoleからNotificationsが送れるものとします。

Androidアプリはさすがにすんなり動作したのですが、iPhoneアプリは半日ぐらい悩みました。。。

以下が動作したパターンです。

 curl --header "Authorization: key=$api_key" \
     --header Content-Type:"application/json" \
     https://fcm.googleapis.com/fcm/send \
     -d "{\"to\": \"/topics/info\",\"priority\":\"high\",\"content_available\":true,\"notification\": {\"body\": \"お知らせ\",\"badge\": \"1\"}}"

私の間違ったポイントは以下です。 * api_keyはFirebase Settings -> CLOUD MESSAGING -> Server key を利用する。でないと認証で失敗する。 * priorityをhighにする (iPhoneで必要) * content_availableをtrueする (最終的に必要かどうか分からない) * notificationにbodyを指定する(これがないとiPhoneに表示されない。最後までハマった)

何かのお役に立てれば幸いです

既存プロジェクトにFirebaseを取り込む

すでにiPhoneアプリAndroidアプリがあり、Androidアプリ側はGoogle Developer ConsoleでGoogleMapsなどのAPI KEYを発行しているという前提。私の場合、iPhoneアプリにはGoogle系のサービスは利用していない。

おそらく以下の手順でしないと、うまくいかない気がする。

  1. Android版から始める。そのため、既存のGoogleプロジェクトを新規のFirebaseプロジェクトとしてインポートする
  2. 同じプロジェクト内にIPhoneアプリを新規作成する
  3. そうしないと、iPhoneAndroidの同時プッシュができない

まだ上記は試していないのでうまくいくかわからない。

でも、私の場合、最初にiPhone版を作ったのでFirebaseに新規プロジェクトを作り、その後、同一プロジェクト内にAndroid版を作った。しかし、MapsのKEYが違うとか、今まで動いていたAnalyticsが動作しなくなったため、おそらく上記の手順じゃないとマズイのかもしれない。