全国の道の駅を検索 - RS Station for Android v1.6.0 リリース

  • 投稿:
  • 更新:2020年3月 4日
  • by
  • in

s_rss_20200304.png

iOS版に続き、Android版もダークテーマに対応しました。
既に公開されているのでプレイストアにてダウンロード可能です。


国土交通省から、2020年(2019年度)の新駅も発表されており、前回データ整理した後でオープンした駅もいくつかあるので、そろそろデータを更新する時期です。
この作業結構面倒で… やろうやろうと思いつつもなかなか着手できません…
3月中にはなんとかやろうかと思ってます。

タイド&天気ウィジット - SurfTideDeltaWidget v1.2.0 公開されました

  • 投稿:
  • 更新:2020年3月 4日
  • by
  • in

s_stdw_001.png

公開に手間取っていましたが本日公開されました。
Android版のSurfTideΔはウィジェットが別アプリとなっるので以下よりインストールして下さい。
このバージョンよりダークテーマに対応しているので、アピアランスを切り替えるとウィジェットも自動で変更されます。変更に少しタイムラグがあるので、即時変更したい場合はウィジェットをタップしてみて下さい。


手間取ってたのは、アップロードしたアプリのアイコンと、Store公開用のメタデータに設定したアイコンが微妙に違っていて(WIDGETの文字が有るか無いかの差異)それでGoogleよりストップがかかっていました…
もともと SurfTideΔ のオマケみたいなアプリだったので、同じアイコンにしていたのがマズかったみたいです。
いきなりの配信停止通知でビックリしましたが、Googleの担当とコンタクトをとって解決です。

見つかっちゃったらアウトみたいな感じですかねぇ??
最近はアップデートの度に審査が入るようなので発覚したのかも知れません。
ともあれ、無事に公開できてなによりです。

全国の道の駅を検索 - RS Station for Android ダークテーマ

  • 投稿:
  • 更新:2020年3月 3日
  • by
  • in

s_Screenshot_1583232052.png

RS Station for Android も、まもなくダークテーマ対応版をリリースします。
ほぼ完了していて、現在最終ベータ版のアップロード待ちで、それでテストOKならリリースです。

iOS版では既に削除した近隣施設の検索機能ですが、Android版もPlacePickerが既にサービス終了となっています。現在のバージョンではかろうじて動いているけど、使えなくなるのは時間の問題だから、次にリリースするバージョンで削除しました。

これで最後のダークテーマの対応アプリとなります。iOSで3本、Androidで新規も含めると5本、全部で8本のアプリにダークモード(ダークテーマ)を実装しました。
さすがに、開発者がダークモードになりそうです(笑)

全国の道の駅を検索 - RS Station for iOS v1.6.0 リリース

  • 投稿:
  • 更新:2020年3月 3日
  • by
  • in

s_Simulator Screen Shot - iPhone 11 Pro - 2020-03-02 at 06.30.43.png

ダークモードに対応した「RS Station for iOS v1.6.0」をリリースしました。
すでにAppStoreで公開済なので適時アップデートできます。

前回報告した通りで、このバージョンよりGoogle maps(PlacePicker)を利用した近隣の施設を表示する機能が削除されています。(iOS版のみ)

全国の道の駅を検索 - RS Station for iOS ダークモード対応中

  • 投稿:
  • 更新:2020年3月 3日
  • by
  • in

s_Simulator Screen Shot - iPhone 11 Pro - 2020-02-29 at 10.50.34.png

さて、これでダークモード(ダークテーマ)対応アプリもiOS/Androidあわせて6本目です。いい加減同じような作業で飽きてきましたが、残りはこのアプリのAndroid版の1本のみです。 ってことで、iOS版については現在最終確認中なので近々公開できます。

それで1つ残念なお知らせです。
Google maps(PlacePicker)を利用して近隣の施設を表示する機能ですが、Googleでサービスが終了となり利用出来なくなりました。このバージョンではこの機能は削除しています。
Android版についてはそのまま利用できます。
Android版もサービス終了となっているので、次のv1.6.0で機能削除となります。

iOSダークモード対応でのTIPSというかメモを1つ。
特定のViewのレイヤーを角丸のボーダーをつけたりしてるのですが、XCODEのstoryboardのプロパティでボーダーやら角丸やらを設定することがあるかと思います。
これらプロパティも最終的にはレイヤーに作画されるので、アピアランスを切り替えるタイミングで自前で再作画をリクエストしないとダメです。気が付かずにちょっとハマった…
これも対象View(もしくはViewを保持するView/Controllerクラス)の「traitCollectionDidChange」でボーダーのカラー等を変更してやればOKかと。

// アピアランスの変更
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    if #available(iOS 13.0, *) {
        let hasChanged = previousTraitCollection?.hasDifferentColorAppearance(comparedTo: traitCollection) ?? false
        if (hasChanged) {
            // ボーダーを変更
            hogehogeView.layer.borderColor = UIColor(named: "hogehoge")
        }
    }
}

タイド&天気ウィジット - SurfTideDeltaWidget v1.2.0 リリース

  • 投稿:
  • 更新:2020年3月 4日
  • by
  • in

s_SurfTideDeltaWidget_dm_01.png

SurfTideΔ for Androidはウィジェットが別アプリとなっています。(iOS版はアプリにバンドル)
このウィジェットもダークテーマに対応させました。

ダークテーマを切り替えた後、数秒でウィジェットコンテンツは更新されます。
即時更新したい場合はウィジェットをタップして下さい。


今回、コードが短いので、ほぼ数時間で対応できましたが、軽い落とし穴が…
APIレベル28以上をTargetにする場合、Serviceを利用するときに以下のパーミッションをManifestに追加するの忘れずにね。忘れると、なんの警告もなしに落ちます。

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

SurfTideDeltaWidget 最終ベータテスト版

以下はテストバージョン(最終ベータ v1.2.0-R4)となります。
十分テストしていますが、ご利用については自己責任でお願いします。
Androidデバイス(利用できるのはAndroid6.0以上)からここをタップしてインストールして下さい。インストール時に「この提供元不明のアプリを許可」をONにする必要があります。
Android7.0以下の場合は、事前にAndroidの「設定>セキュリティ」から「提供元不明のアプリ」の設定をONにする必要があります。

SurfTideΔ for iOS v1.2.3 リリース

  • 投稿:
  • 更新:2020年2月25日
  • by
  • in

vader_001.png

昨日アナウンスした「SurfTideΔ for iOS v1.2.3」がAppStoreで公開されました。
いまのところダークモード切替の問題はおきていません。

v1.2.1 and 1.2.2 では、すこし違った実装をしていたのですが、セオリー通りにシンプルに「traitCollectionDidChange」にてアピアラインスの変更をフックするようにしました。
ちなみに、この手法でTodayExtensionでイメージをダイレクトに作画している場合も機能するようです。なので、通知エリアでタイドグラフを表示中にアピアランスを切り替えても正しく機能しています。

こんな実装ですね

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    if #available(iOS 13.0, *) {
        let hasChanged = previousTraitCollection?.hasDifferentColorAppearance(comparedTo: traitCollection) ?? false
        if (hasChanged) {
            // ここで必要なlayerを更新する
            hogehogeLayer.setNeedsDisplay()
        }
    }
}

SurfTideΔ for iOS v1.2.3 バージョンアップ申請中

  • 投稿:
  • 更新:2020年2月24日
  • by
  • in

s_surftieddelta_sad_01.png

どうもOSのバグなのか、アプリ起動中にダークテーマを切り替えると、タイド画面がアップデートされない場合が希にあります。
少しロジックを変更したバージョンを申請してます。テストバージョンでは今の所現象は出てないのですが、どうにもロジック的に釈然としないので、発生したときの対処ロジックも入れておきました。

もしダークモード切替時に画面が更新されない場合は、画面でスワップダウンしてみて下さい。本来は本日に移動する機能なのですが、そこに画面の更新する機能も仕込んでおきました。v1.2.3から有効な機能になります。

グラフィックを直接レイヤーに描いている処理で、テーマ切替をウオッチして更新しているのですが、なんとなく希にOSがその通知処理をサボっているような気がするなぁ…

SurfTideΔ for Android v1.2.0 リリース

  • 投稿:
  • 更新:2020年2月24日
  • by
  • in

s_std_android_dt_01.png

Android10からのダークテーマに対応した「SurfTideΔ v1.2.0」をリリースしました。
既にPlayStoreにて公開しているので適時ダウンロードできるようになると思います。


ナビゲーションメニューの機能もiOS版と同じくアップデートしています。
追加された機能は、ナビゲーションメニュー下部のアイコン左から

  • タイドグラフイメージを他アプリと共有する機能(GooglePhotoへのアップロード等)
  • 波乗り目覚まし「Surf’s UP」の起動
  • 世界のタイド「e-tide」の起動

となります。
「Surf’s UP」と「e-tide」のアプリ起動は、未インストールの場合、PlayStoreのアプリページへ誘導するのでダウンロード後に利用して下さい。

SurfTideΔのWidgetについてはこれからダークモード対応する予定です。今しばらくお待ちを。

Androidで画像イメージを「SendTo」する時のメモ

  • 投稿:
  • 更新:2020年2月23日
  • by
  • in

s_std_share_dm.png

SurfTideΔ for Androidでタイドグラフ画像(Bitmap)を他アプリと連携するために実装した「共有(SendTo)」機能ですが、意外に面倒だったのメモしておきます。
主な目的はダークモード対応だったんだけど、そちらの方はそれほど難航せずにほぼカラーリソースの作成だけで1日位で実装できましたが、この「共有」機能がマジに時間かかった…

結構古い情報はネットで拾えるんだけど、Android-Q あたりでの実装だと色々変わってきててまとまった情報が無くて…
かといって公式なリファレンスで読み解くのもなぁ…

ってことで、あちこちの情報を集約して出来たのがこちらのロジック

if (bitmap != null) {
    // イメージをContentProviderへ保存
    var result = false
    val values = ContentValues()
    values.put(MediaStore.Images.Media.TITLE, "タイトル(これはほぼ使われない)")
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/png")
    val uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
    if (uri != null) {
        val ost: OutputStream?
        try {
            ost = contentResolver.openOutputStream(uri)
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, ost)
            ost?.close()
            result = true
        }
        catch (e: Exception) {
            // イメージ作成エラー
        }
    }
    if (result) {
        // メージを共有
        val share = Intent(Intent.ACTION_SEND)
        share.type = "image/jpeg"
        share.putExtra(Intent.EXTRA_STREAM, uri)
        startActivity(Intent.createChooser(share, "Send to"))
    }
}

解ってしまえばなんてことない処理ですね。