SurfTideWatch v1.0.7 リリース

  • 投稿:
  • 更新:2021年1月21日
  • by
  • in

stw_107_20210120.png

v1.0.6より追加した潮回りの表記ですが、やはりズレてしまうのは気になるので、v1.0.7で SurfTideΔで使っている計算方法に変更し、正しく表示されるように補正しました。
ただし補正が適用されるのは地域が日本のみです。ほぼ日本全域をカバーしていますが一部漏れている場所(緯度経度スクエアで判定しているため)もあります。簡易計算による表示は潮回りの表記文字がグレーとなります。

この情報はウオッチに送信するデータに含まれるので、次回データをウオッチと同期するときから適用されます。即有効にしたい場合は、iPhone側から対象データをタップして「リセット」し再同期して下さい。

もう1点細かな修正

タイドの有効期間後に同期した場合、ウオッチのコンプリケーションの更新が翌日からになっていたのを即時更新するように修正しました。

ついでに、Tipsというか注意点を1つ

iCloudで同期するときの注意点ですが、キャリアのネットワークを利用中でWiFi接続が無い場合、iPhoneの「設定>モバイル通信」の下の方にある「iCloud Drive」がONになっていないと利用できません。これがOFFになっていると iPhone側で同期処理時にエラーとなります。
iCloudでの同期処理で「ERR-1: .. CKErrorDomain ..」のような表示が出た場合は上記の設定を確認してみて下さい。

SurfTideWatch と e-tide でデータ通信の障害発生中!

  • 投稿:
  • 更新:2021年1月20日
  • by
  • in

s_e-tide_issue_20210119.png

追記:2021/1/20
障害は復旧しています(1月20日の午前6時の時点で確認)

「SurfTideWatch」と「e-tide」で利用している WWW Tide and Current Predictor のタイドデータですが、現在サイトそのものにアクセスできなくなっているようです。
なので、この2つのアプリで新しいタイドデータを取得できない状態になっています。
現在、サイトに問合せ中ですが、このサービスが復旧しないかぎりはデータを利用できません。

なお、SurfTideΔとSurfTide7はデータソースが別なので、iPhone/Android 及び AppleWatchでタイドデータを正しく表示できます。

AppleWatch版タイドアプリの2本、もう一度更新

  • 投稿:
  • 更新:2021年1月15日
  • by
  • in

s_std_cmp_20210114.png

とりあえずWatch版のタイドアプリ(特にコンプリケーション関連)の一通り気になる部分を修正しました。既にどちらもAppStoreで公開されています。
SurfTideΔとSurfTideWatchのコンプリケーションは同じデザインになっています。ただ、WatchのSeriesにより使えるコンプリケーションは変わってきます。 たとえば、上記スクリーンショットの一番左のカラフルな「インフォグラフ」はSeries4以上とWatchSEで利用できます。他の2つはそれ以前のSeriesでも利用できるコンプリケーションです。

インフォグラフのコーナーに表示しているグラフィックコンプリケーションは、次のタイドイベント(満潮/干潮)までのだいたいの目安をゲージで表示しています。色の薄い方が干潮で濃い方が満潮です。潮の動きに合わせてゲージの「●」が時間表示に近づいていきます。
コンプリケーションの更新は約15分サイクルになっています。これはシステムの制限でとなります。
これ使いたいんだけど、自分のWatchはSeries3なんですよね〜
買い換えるかなぁ…

コンプリケーションは全部で9種類アプリに実装しています。利用する時計のタイプによりカラーや表示する情報も変わり全部説明できないので、色々試してお気に入りのを見つけて下さい。

他、細かな調整として、どちらのアプリもタイドイベント画面を表示したままでスリープし、次にウェイクアップしたときに日付が変わっているとタイドグラフ表示に自動で戻るようにしました。
SurfTideWatchについては、前回通知したとおり、タイドグラフに大潮や小潮といった潮回りの表記を追加しています。

AppleWatch版タイドアプリの2本

  • 投稿:
  • 更新:2021年1月14日
  • by
  • in

stw_20210113_01.png

SurfTideWatchにコンプリケーションを実装したVersionが既にAppStoreにて公開中です。

それで、もう1点要望のあった大潮とか小潮とかの表示も次のVersionにて追加します(上記スクリーンショット右側)。
ただし、こちらのアプリのデータソースには月齢に関する情報が無いので簡易計算により求めているため、計算誤差によりごくまれにズレる可能性があります。

時期バージョンでSurfTideΔのWatchのコーナグラフィックコンプリケーションのUIをSurfTideWatchと同じものにします。
ちなみに、上記スクリーンショット左で、左コーナーがSurfTideΔで右コーナーがSurfTideWatchのものになります。

AppleWatchのComplications実装メモ

SurfTideΔSurfTideWatchに、AppleWatchのコンプリケーションを実装したときのメモです。自分用の備忘録なので、それほど親切には書いていませんが、ネットの情報の不足分を補完する感じです。

タイド情報(潮汐)は常に変化するので、以下のような条件でシンプルに実装しています。

  • 一定時間で更新する必要がある
  • 毎回タイドを計算するのは冗長なので当日と前後1日分のデータはキャッシュする
  • 複数の種類のコンプリケーションを準備する

で、まずはXCODEプロジェクトのWatchExtensionに、コンプリケーションを利用するよう設定します。
というのも、自分の実装では「ComplicationController.swift」関連の設定が無かったり(古いプロジェクト)自分で削除していたりしたので、まずはそれを正しく構成しなければなりませんでした。

まずは「Info.plist」にコンプリケーション関連の設定を追加。
必要なKeyは以下2つです。「CLKComplicationPrincipalClass」は「ComplicationController.swift」のパスを指定します。「CLKComplicationSupportedFamilies」は使うタイプのComplicationsだけ設定します。

<key>CLKComplicationPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).ComplicationController</string>
<key>CLKComplicationSupportedFamilies</key>
<array>
  <string>CLKComplicationFamilyModularSmall</string>
  <string>CLKComplicationFamilyUtilitarianSmall</string>
  <string>CLKComplicationFamilyUtilitarianSmallFlat</string>
  <string>CLKComplicationFamilyUtilitarianLarge</string>
  <string>CLKComplicationFamilyCircularSmall</string>
  <string>CLKComplicationFamilyExtraLarge</string>
  <string>CLKComplicationFamilyGraphicCorner</string>
  <string>CLKComplicationFamilyGraphicBezel</string>
  <string>CLKComplicationFamilyGraphicCircular</string>
</array>

次に「ComplicationController.swift」を用意します。
これはネットの情報は錯綜(海外情報も)してて、古いバージョンやらなんやらで、結局何が必要なのかイマイチでした。
で、自分で実装したのは以下2のメソッドだけです。
ちなみに、最新のXCODEが作ってくれるテンプレートもイマイチ??で使いませんでした。そもそもWatchOS7でしか利用できないようでしたしね。

  • getLocalizableSampleTemplate(設定するときのプレ表示用)
  • getCurrentTimelineEntry(実際の表示用)

端折ってますがこんな感じです。実際は「getTemplate」の中で、「Info.plist」で設定した分のコンプリケーションテンプレート(CLKComplicationTemplate)を作ってます。
また、キャッシュするデータもこのクラスのメンバ変数として保存します。自分のアプリの場合、場所が変わった場合や、日付が変わった場合をトリガーにしてキャッシュを書き換えています。

class ComplicationController: NSObject, CLKComplicationDataSource {
  ・
  func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) {
    setTideData(date: Date())
    if let template = getTemplate(complication.family) {
      handler(template)
      return
    }
    handler(nil)
  }
  ・
  func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) {
    let date = Date()
    setTideData(date: date)
    if let template = getTemplate(complication.family) {
      let entry = CLKComplicationTimelineEntry(
        date: date,complicationTemplate: template)
      handler(entry)
      return
    }
    handler(nil)
  }
  ・
}

次に、各テンプレートが使うアイコンリソースですが、これも必要な分だけ実装します。足りない分は別途ImageSetで追加してもOK。
ちなみに、背景は全て透過で作成します。これを「ComplicationController.swift」の中で各テンプレートに設定します。

s_Assets_xcassets.png

最後に、一定時間で更新する処理を「ExtensionDelegate.swift」に記述して完了です。
追加するのは、「applicationDidEnterBackground」メソッドと、handleメッソッドの中の「case let backgroundTask as WKApplicationRefreshBackgroundTask:」にバックグラウンド処理のスケジュール(scheduleBackgroundRefreshTasks)を入れます。

端折ってますがこんな感じです。

  func applicationDidEnterBackground() {
    // コンプリケーション更新用スケジュール
    scheduleBackgroundRefreshTasks()
  }

  func handle(_ backgroundTasks: Set) {
    // Sent when the system needs to launch the application in the background to process tasks. Tasks arrive in a set, so loop through and process each one.
    for task in backgroundTasks {
      // Use a switch statement to check the task type
      switch task {
      case let backgroundTask as WKApplicationRefreshBackgroundTask:
        // Schedule the next background update.
        self.scheduleBackgroundRefreshTasks()
        // Be sure to complete the background task once you're done.
        // ↓scheduleBackgroundRefreshTasks を有効にする場合は true に変更
        backgroundTask.setTaskCompletedWithSnapshot(true)
  ・
  ・
  func scheduleBackgroundRefreshTasks() {
    let watchExtension = WKExtension.shared()
    let targetDate = Date().addingTimeInterval(15.0 * 60.0)
    watchExtension.scheduleBackgroundRefresh(withPreferredDate: targetDate, userInfo: nil) { (error) in
      // Check for errors.
      if let error = error {
        print("*** An Background refresh error occurred: \(error.localizedDescription) ***")
        return
      }
      // コンプリケーションデータを更新
      let server = CLKComplicationServer.sharedInstance()
      for complication in server.activeComplications ?? [] {
        server.reloadTimeline(for: complication)
      }
    }
  }

これはどの情報をみても15分に1度みたいだったので、そのタイミングがコンプリケーションのミニマム更新時間みたいです。もちろん、他のアクションから強制更新はできますが、1日に更新できる回数は決まっているみたいです。

SurfTideWatch にもコンプリケーション追加

  • 投稿:
  • 更新:2021年1月 8日
  • by
  • in

stw_20210108_01.png

SurfTideΔをAppleWatchに対応にしましたが、AppleWatch版のタイドグラフとしてははこちらのアプリの方が詳細なグラフを表示するようになっています。プロ版ってほどでは無いですが収録地点も全世界で約1万ヶ所と多くなっています。ただし、こちらはオンラインで2週間分のデータを取得して表示するタイプなので、トリップ等に出かけるときは、事前に対象地点のタイドをオンラインでダウンロードしておく必要があります。

今回、このアプリにコンプリケーション機能を追加しました。表示はSurfTideΔとだいたい同じですが、Series4より利用できるコーナグラフィックタイプ(上記のスクリーンショット)だけは、少し機能を追加してみました。ゲージに次のタイドまでの進捗時間をグラフ表示しています。
スクリーンショットでは、右側が15:45の干潮までだいたい8割程度ほど潮が動いてる状態です。右は干潮が終わり22:23の満潮までまだまだ時間がある状態です。ゲージの●が時間表示に近くなるほど、その潮汐に近づいていることになります。

stw_20210108_02.png

もう1つ、これもSurfTideΔで実装した機能ですが、現在時刻より以前の気象イベントは、リストでグレーにするようにしました。

これら機能は v1.0.5 からの実装になります。現在テスト中で今月末までにはリリースできると思います。

SurfTideΔ for AppleWatch のコンプリケーション更新

  • 投稿:
  • 更新:2021年1月 2日
  • by
  • in

st7_with_aw_20210102.png

v1.3.4のリリース準備中です。
AppleWatchのコンプリケーションの表示で、次のタイド情報が翌日になる場合
「名洗・—:—・***」のような表示になっていたのを修正し、上記スクリーンショットのように、翌日でも正しく表示するように変更しました。
夜釣りとかだと、夜中のタイド時刻も必要かと思まして。

で、シミュレータではテストできてるのですが、肝心の実機を別の場所に置き忘れてきてしまい、週末にならないとテストできません…
なので、公開は来週になります。

「天気と風と波」マスタデータ更新での不具合

「天気と風と波」ですが、年始めの最初の起動で、潮汐データ等のマスタデータを自動更新します。
登録している地点データが多い場合、この処理で希に異常終了するケースがあるようです。
原因は現在調査中ですが、数回起動すると正しくマスタデータ更新が完了します。

Android版では特に問題はないようですが、iOS版で上記現象を確認しています。

追記:2021/1/2
継続して調査しますが、どうも一時的なネットワーク(気象庁サイトとの連携の)による問題のようです。 何度かテストしてみましたが、現在は特に問題が出ていません。
もし、まだ不具合等有るユーザーがいましたら連絡下さい。

SurfTideΔ for AppleWatch にコンプリケーション

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

watch_p3.png

コンプリケーションは文字盤に設置できる小さなアクセサリーです。
現在 SurfTideΔ for AppleWatch に実装して実機にてテスト中です。

Series4以上のウオッチ用にGraphic Complications3種「Corner」「Circular」「Bezel」、旧タイプのComplications4種「Circular Small」「Modular Small」「Utilitarian Small」「Utilitarian Large」の全7種類のコンプリケーションを設定できます。

この内「Circular」「Bezel」と「Utilitarian Small」「Utilitarian Large」は、現在ウオッチのタイドアプリで表示中タイドポイントの次のタイド情報を表示できるようにしました。ただし更新頻度にWatchOSの制限があり最短でも15分毎の更新となります。

スクリーンショット左が「Bezel」で右が「Corner」になります。
コンプリケーションをタップするとウオッチのタイドアプリを表示します。

しばらく実機テストして、とくに問題が出ないようならAppStoreのクリスマス休暇が終わり次第申請しようと思います。

SurfTideΔ 特定の場所と日付で異常終了する不具合があり修正

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

上げ下げの3分7分の計算で、あるパタンのタイドグラフのときに計算しきれず異常終了するケースがありました。
iOS版ユーザー様より報告いただき、調査の結果、原因は特定でき修正しました。
(判明している具体的な場所は大阪の「淡輪」で2021年1月23日)

これはAndroid版も同じエラーになります。
Android版については既にストアに公開されています。iOS版は申請済みですが、Appleがクリスマス休暇のため公開が遅れています。

追記:2020/12/24 iOS版もリリース済です。

対応済バージョンは以下になります。ダウンロード可能になりましたら早めのアップデートをお願いします。

  • SurfTideΔ for iPhone v1.3.2-R64
  • SurfTideΔ for Android v1.2.4-R35

なお、旧バーションでの対処方法は、フィッシュアイコンタップで「上げ下げの3分7分」の表示をしなければ異常終了することはありません。