MastodonクライアントにおけるiOS 13.1のリンクが触れただけで反応する問題について

追記: iOS 13.2で直った。わーい

iOS 13.1 (正確には beta 4)からのiOS側の不具合?仕様変更?により、いくつかのMastodonクライアントを含む一部iOSアプリで「タッチ開始時に触れているところがリンクだと、そのリンクが即座に踏まれた扱いになってしまう」不具合がある。

この影響を受けるかどうかはMastodonクライアント各位の実装次第。

この影響を受ける条件について、技術的な解説 (クリックで表示/非表示を切り替え)

iOSSDKには、UITextView という、テキスト表示、ユーザーからの編集受け付け、ユーザーによるテキスト選択、自動リンク処理、スペルチェック、リンクタップ時等の処理をいい感じにやってくれる便利なViewがある。

しかし、UITextViewのリンクタップ時のデフォルト処理は「Safariを起動してそのリンク先を表示する」ものであり、それでは使いにくいので、大半のクライアントは、UITextViewDelegatetextView(_:shouldInteractWith:in:interaction:) (リンク先はAppleのドキュメント) を実装し、「システムの処理を止めて自前の処理を走らせる」ということをやっていた。

今までは (覚えている最古のiOS 9.3はこの挙動だったので3年以上) textView(_:shouldInteractWith:in:interaction:)が呼び出されるタイミングは実際にユーザーがリンクを踏んだタイミングだったのでそれでよかったのだが、なぜか iOS 13.1 (beta 4)から、「リンクを踏んだ」タイミングではなくて「リンクをタッチの始点にした、踏むかもしれない」タイミングで呼び出されるようになってしまい、前述の不具合が起こっている。

そもそもドキュメントに呼び出しタイミングが書いてないのにそれを仮定して処理すんなよ、という話もあるだろうが、そもそもUITextViewのリンクを踏んだときの処理をカスタムできるタイミングはここしかないので、仕方ない…。

ちなみに、これを踏んでいるのはサードパーティーのアプリだけかと思いきや、設定アプリの「プライバシー→解析」とかにあるリンクでも同様の挙動が再現する。だめじゃん。

日本だけでなく海外の人たちも困っているらしい https://twitter.com/scelis/status/1176676097754198017

影響を受けないクライアント

  • Amaroq
  • Tootoise
  • Avalanche (現状TestFlightのβ版のみでApp Storeには未リリース?)
    • Flutterを利用しているため無影響 (推測)

影響を受けているが回避しているクライアント

  • iMast
    • 投稿本文の表示にUITextView、リンク判定にtextView(_:shouldInteractWith:in:interaction:)を使っているが、ゴリ押しworkaroundで回避している
    • https://github.com/cinderella-project/iMast/commit/9c088c28511bd0f4d2be321ff4975ea8d074ca56
    • しかし workaround の発動条件がアプリ内に決め打ちのiOSバージョン判定なので、iOSアップデート後などに一時的にバグが再発することがある
      • 設定からworkaroundの発動可否を設定可能

影響を受けているクライアント

未検証

  • Toot
  • Mast
  • GON

情報提供はコメント欄もしくは https://mstdn.rinsuki.net/@rinsuki まで。