0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

UITextDocumentProxyのselectedTextは3行以上かつ改行含めて65文字以上選択していると正しい選択部分を返さない

Last updated at Posted at 2020-11-30

想定外でした。

2020/12/16追記

より一般的な問題だったので新たに記事にしました。

2020/12/12追記

バグとしてFeedbackAssistantから報告を送っていたのですが、「キーボードがクラッシュしないようにするためのexpected Behaviorだよ(意訳)」という返答をいただきました。

実際、例えば数万、数十万文字に及ぶテキストが一度に選択された場合(全選択では時折起こることですが)、メモリ制限の厳しいKeyboard Extensionでこのような制限がかかることは納得のいくことです。

挙動の概要

動作確認は第1・2世代のiPhoneSE (iOS14.2)において行っています。

タイトルの通り、UITextDocumentProxyのselectedTextは3行以上かつ65文字以上選択していると正しい選択部分を返しません。代わりに最初と最後の2行を結合したものを返してきます。そんなことある?

論より証拠なのでまずは実行結果の例です。
IMG_3811.jpg
IMG_3812.jpg
IMG_3813.jpg
IMG_3814.jpg

なぜか最後だけ文字数が32と判定されています。
それぞれの場面でtextDocumentProxy.selectedText?.debugDescriptionを出力すると以下のようになります。

Optional("aaaaaaaaaaaaaaaa")
Optional("aaaaaaaaaaaaaaaa\nbbbbbbbbbbbbbbbb")
Optional("aaaaaaaaaaaaaaaa\nbbbbbbbbbbbbbbbb\ncccccccccccccccc")
Optional("aaaaaaaaaaaaaaaa\ndddddddddddddddd")

挙動をさらに理解するために次の二例を見ましょう。

IMG_3815.jpg
IMG_3816.jpg

非常にわかりにくくて申し訳ないのですが、文字数は改行を含まない設定で算出しているため、改行を含める場合一枚目は64文字、二枚目が65文字です。ここを境に挙動が変わっていることがわかります。

同様の事象は3行でも起こります。

IMG_3817.jpg
IMG_3818.jpg
同様に改行を含めて64文字、65文字を境に挙動が変わります。

ところが、2行の場合はこの制限はありません。
IMG_3819.jpg

ハラスメントではないでしょうか。

挙動の問題点

さて、この挙動は実用上どう問題になるでしょうか。
まず、こちら側では得られた二行分のテキストが内部を省略されてしまったものなのか、それともそうでないのか、という判断ができません。従って次のように判断する必要があります。

  • 三行以上のテキストがselectedTextに含まれていた場合→問題ない
  • 二行のテキストが含まれていた場合→内部の省略かどうか判断ができない
  • 一行のテキストが含まれていた場合→問題ない

ちょうど二行のテキストが得られた場合のみ挙動を変えなければならないということです。
しかしユーザ側から見れば、複数行選択した場合に望む挙動を得られる場合と得られない場合が生じることになります。この奇天烈な動作は不具合にしか見えませんし、「3行以上かつ改行含めて65文字以上選択しないで下さい」とはとても頼めません。

従って実際は次のようにせざるを得ません。

❌ 三行以上のテキストがselectedTextに含まれていた場合→諦める
❌ 二行のテキストが含まれていた場合→諦める
⭕️ 一行のテキストが含まれていた場合→用いる

提供できる機能がぐっと制限されますが、やむを得ないでしょう。
恣意的にやらなければ起こらなそうな動作なのに、ドキュメントに書いていないのが本当に意味不明でした。

※こちらの環境によるものの可能性があるので、ぜひ検証をお願いします。

参照

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?