【重要】EBPocket for Android の対象範囲別ストレージ対応について
やむを得ず、EBPocket for Android の対象範囲別ストレージ対応をすることになってしまった。その理由は、
- 近い将来、targetSdkVersion を31以上にしないと、新規ユーザのGoogle Playにアプリが表示されなくなってしまう(Android11以降の場合)。EBPocketというアプリがGoogle Play上から存在しなくなってしまう。
- Android 11 以降で外字ビットマップが表示されないという現象が起きるようになった。改修は容易だが、アップデートするためにはtargetSdkVersion を31以上にしないと、Google Playに申請ができない。
targetSdkVersion を31以上にするということは、対象範囲別ストレージ対応が必須になるということである。要するに、iPhoneみたいに、アプリ固有のサンドボックスと呼ばれる領域以外にアクセスできなくなる。
EBPocketにおいては、これまでのように外部SD上の辞書に自由にアクセスできなくなるということだ。
そこで、EBPocket 1.49以降では次のようになる。
Android10まで
従来通り、ストレージ内の任意の場所を辞書検索パスに指定できる。外部SDカード上の辞書もこれまで通り使用できる。
Android11以降
- 辞書の場所は、次のアプリ固有のデータ領域(サンドボックス)に固定される。辞書を追加する場合は、必ずこの配下に辞書を置かないと認識しない。
/storage/emulated/0/Android/data/info.ebstudio.ebpocket/files/EPWING - PCからUSB接続で辞書を転送する場合は、上記の場所に辞書を転送し、「辞書の再検索」を実行する。
- 外部SDに辞書が存在する場合は、辞書管理メニューから辞書をインポートする。以下のスクリーンショットを参考にしてほしい。
かなりの混乱が予想されるが、避けては通れないのでしかたない。今後もEBPocket for Androidの提供を続けるには、Google Playの規約に準拠するしかないからだ。
EBPocket for iOS クリップボード変更検知によるクリップボード検索
クリップボード検索というと、たいていの方は、「他のアプリと辞書アプリを同時に立ち上げて、他アプリでテキストをコピーすれば即座に辞書引きができる」という利用方法を期待するのではないだろうか。
だが、EBPocketのクリップボード検索は、アプリケーションがアクティブになるタイミングでしか検索できなかった。
このたび、iPad のSplit Viewによるマルチタスク環境において、EBPocket for iOS のクリップボード変更検知によるクリップボード検索が、やっとできるようになった。
iOSのペーストボードには、次のように変更を検知する機能が元々ある。
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(pasteboardChanged:)
name:UIPasteboardChangedNotification
object:[UIPasteboard generalPasteboard]];
ところが、Split Viewで別のアプリがペーストボードを変更しても、このNotificationは発火しない。このため、てっきり変更検知はできないと思い込んでいた。
ところが最近、「物書堂の辞書アプリではできている」という報告をいただいた。物書堂さんができているなら、EBPocketでもできないはずはない。
色々方法を探ったところ、結局、次の記事の方法で解決した。単純にタイマーで定期的にペーストボードの内容をチェックするだけだ。
1つ注意点は、iOS14以来、他のアプリが書き込んだペーストボードの情報を読み込むと、"EBPocketに○○からペースト"みたいなアラートが表示されることである。
このため、実際に変更された場合だけ読み込むようにしないと、タイマーの間隔毎にアラートが表示されることになってしまう。そこで、ペーストボードのchangeCountを見て、数字が変わったときだけデータを取得する。
実は上記の記事のコードには、一部コンパイルできない箇所があるので、実際に使ったコードを以下に示す。
クリップボード監視を開始するときにstartCheckingPasteboardを呼び、終了時にstopCheckingPasteboardを呼ぶ。
@property (strong, nonatomic) NSTimer *pasteboardCheckTimer;
@property (assign, nonatomic) NSUInteger pasteboardchangeCount;
- (void) startCheckingPasteboard{_pasteboardchangeCount = [[UIPasteboard generalPasteboard] changeCount];
//Start monitoring the paste board
_pasteboardCheckTimer = [NSTimer scheduledTimerWithTimeInterval:1 // 1s間隔
target:self
selector:@selector(monitorBoard:)
userInfo:nil
repeats:YES];
}- (void) stopCheckingPasteboard{
[_pasteboardCheckTimer invalidate];
_pasteboardCheckTimer = nil;
}- (void) monitorBoard:(NSTimer*)timer{
UIPasteboard *_pasteboard = [UIPasteboard generalPasteboard];
NSUInteger changeCount = [_pasteboard changeCount];
if (changeCount != _pasteboardchangeCount) { // means pasteboard was changed
_pasteboardchangeCount = changeCount;if ([_pasteboard hasStrings]){
NSString *newContent = _pasteboard.string;[self tryToDoSomethingWithTextContent:newContent];
}
}
}- (void)tryToDoSomethingWithTextContent:(NSString*)string{
// 取得したペーストボードの内容で処理を行う。}
iOS16のペーストボードの挙動について(EBPocket for iOS)
iOS16以降、他のアプリケーションでコピーした内容をペーストボードからペーストしようとすると、許可を求められるようになった。EBPocketでクリップボード検索をすると、次のような確認ダイアログが毎回表示され、非常にうっとうしい。
iOS16.0.2で「一部のユーザーにプロンプトが過剰に表示される問題」を解決したというアナウンスがあったが、EBPocketには効果が無かった。
iOS16.1からは、挙動を変更するオプションが設定画面に表示されるようになった(一度でもペーストの許可のダイアログが表示された後、オプションが表示される。初期状態ではオプションはない)。
設定アプリケーションからEBPocketを選ぶと、次のように「ほかのAppからペースト」という項目が追加されており、確認・拒否・許可から選択できる。
ここを許可にすると、確認ダイアログは表示されなくなる。ただし「"EBPocket"に○○からペースト」というメッセージが短い時間表示される。
読書尚友の注記対応、その他
読書尚友 Android版の公開から10年経っても、いまだに未対応の注記が見つかるので、徹底的に問題を潰したいと思って、下記の公式の組版案内に基づいて対応状況を調べてみた。
その結果、新たに対応した注記は以下の通り。
- 「字詰め」中の「囲み」「地寄せ」(『蟹工船』小林多喜二、『不連続殺人事件』坂口安吾)
- 「ここから○字下げ、折り返して●字下げ」
- ブロックでの「地付き」「地寄せ」
- 「○段階小さな文字」(あるいは大きな文字)の入れ子(『他計甚麽(竹島)雑誌』松浦武四郎)
最終的に、読書尚友で完全に対応できていない注記は以下のみだと思う。
- 改丁、改段(いずれも改ページとして処理する)
- 窓見出し(同行見出しとして処理 ※実例はほとんど見たことがない)
- 縦中横(ただし2桁の数字は自動縦中横で表示するので、ほとんど対応)
- キャプション(本来は図の下に表示するが、左側に表示している)
さて、注記対応と同時に、有償版の本棚に登録しているお勧め図書一覧も更新した。この10年で重要コンテンツが増加し、見直しが必要になったからだ。(吉川英治、山本周五郎、米川正夫訳のロシア文学等)
100冊に絞りたかったが、どうしても絞りきれなくて以下のラインナップになった。まずまず無難なところだと思っているが、どうだろうか。
読書尚友 AndroidX対応
Android ではOSバージョンの下位互換性を確保するためにサポートライブラリというものがある。例えばFragmentはAndroid OS3.0から導入された機能だが、それより以前のAndroidの利用者はFragmentを使ったアプリを実行できない。そこで、標準ライブラリ版のFragmentとは別にサポートライブラリ版のFragmentがあり、サポートライブラリを使うと過去のAndroid OSでも実行することができる。サポートライブラリは便利なので、新機能の追加はほとんどサポートライブラリで提供されてきた。
ところがAndroid OSもバージョンを重ねる毎に、サポートライブラリも肥大し続け、複雑になりすぎたため、Googleはサポートライブラリのメンテナンスを28.0で打ち切り、AndroidX( Android Jetpack )という新しいライブラリを導入した。今でもサポートライブラリを使用することはできるが、なるべくAndroidXに移行することが望ましいとされている。(Android Jetpack はkotlin言語からも利用できるように設計されている)
今回、読書尚友をAndroidXへ移行させたので、防備録として手順を記録しておく。といってもほとんどGoogleの推奨の手順通りで移行できた。
- 移行する前に、サポートライブラリの最終版であるバージョン 28.0.0 まで上げる。
- Android Studio 3.2以上では、AndroidXへマイグレーションするツールがあるので、これを使用する。
メニューバーから [Refactor] -> [Migrate to AndroidX] を選択する。変換候補が表示されるので、 [Do Refactor]を押して実行する。大体はこれだけで変換できる。 - 変換漏れがあった場合、.java と .xml 内のパッケージ名を、個別にサポートライブラリのパッケージ名から対応するAndroidXのパッケージ名に修正していく。(クラス名は共通なので変更の必要は無い。)
読書尚友の場合、android.support.v4.*は変換できたが、なぜかandroid.support.v7.*が変換されずに残ったので、手作業で修正が必要だった。全体的にはスムーズにAndroidX化ができた。
なお、AndroidXとサポートライブラリのパッケージ名の対応は以下の通り。
AndroidXを利用するメリットとして、Android Jetpackの新しい機能が利用できるようになることがある。たとえば、Jetpack Composeという新しいUIツールキットがある。これはSwiftUIのような宣言型のフレームワークであり、より簡単にUIが書けるようになることが期待されている。
もっともCompose自体がまだ頻繁にアップデートされている状態だが、部分的に導入できればいいと思っている。
EBPocket Free for iOS 5年ぶりに更新
Googleから、「Google Mobile Ads SDK のサポート終了スケジュール」というメールが届いた。
ようするに、Google Mobile Ads SDKにはサポート期間があり、新しいバージョンが出ると3世代前のバージョンのSDKは広告が配信されなくなる。Google Mobile Ads SDKを用いて広告を表示しているアプリは、アップデートを怠ると、広告の配信が止まって広告収入が途切れてしまうと言うことだ。
慌ててGoogle Mobile Ads SDKのバージョンを調べてみると、次のようになっていた。
Ads SDK | サポート終了日 | 廃止日 | |
EBPocket Free iOS | 7.1.0 | 2022年9月30 日 | 2023年第2四半期 |
EBPocket Free for iOSは、このままでは来年第2四半期で広告が止まってしまうので、Google Mobile Ads SDKのバージョンを v7 から v9 に上げることにした。さすがにメジャーバージョンが2つも違うと、関数名や定数名が変わっていてそれなりに対応は大変だった。
EBPocket Free for iOSは最後のリリースが2018年1月で、なんと5年近くもアップデートしていなかったことになる。さすがにソースが古くなったので、現在のEBPocket Pro for iOSのソースからFree版を再作成した。おかげでダークモードやApp Extension による共有など、新しめの機能を追加することができた。
なお、App StoreもGoogle Playも、アプリ名称に "free" という価格を表す文字列を入れることができなくなっているので、EBPocket Freeという名称では提出できない。このため、フリー版のアプリ名を、 * Lite に統一することにした。
EBPocekt Lite for Android
EBPocekt Lite for iOS
読書尚友 Lite for Android
EBシリーズについて、今後大きな機能追加は考えていないが、OSのバージョンアップに伴う改訂は可能な限り続けるつもりでいる。
EPWING版『ジーニアス英和大辞典』の表示問題について(解決編)
EPWING版『ジーニアス英和大辞典』はEPWINGを代表する大型辞書の一つだが、EBWin4を始めEBシリーズで使用するときに、困った問題が2つある。
問題1:「項目毎」や「全ての項目」表示で、説明が途中までしか表示されない
例えばtakeを検索すると、連続表示*1では当然全ての説明が表示されるが、「項目毎」や「全ての項目」表示の場合、途中で表示が途切れてしまう。
最近では以下のサイトでも指摘されている。
これはEPWING版『ジーニアス英和大辞典』自体の問題で、通常は検索語の区切りを意味する検索キー記述子(1F41)が、本文中の1,2,3,a,b,のような項番号毎に使用されているからである。
解決方法は、次のように辞書毎の設定でストップコードに 1F090001 を指定する。
1F09という記述子は、字下げ指定で、1F01 0001 は1字目(=字下げ無し)の意味だが、ジーニアスの場合はこれが項目区切りの代わりとなる。
これで「項目毎」および「全ての項目」表示で、項目の説明が終わりまで表示される。
問題2:成句を検索したとき、見出しが表示されず説明から表示される
例えば、"take away"を検索すると、次図のように、本文中に見出しが表示されず、説明から表示される。
これは前方検索インデックスの指す本文アドレスが、見出しの次の本文位置を指しているからである。
明らかに辞書側の問題である。
この問題は2017年頃にEBシリーズサポート掲示板でも取り上げられている。
EBPocket / EBWin サポート掲示板(終了:閲覧のみ可)
掲示板にもあるように、佐藤様が辞書自体を改編するperlスクリプトを公開してくださっている。
http://babelkund.php.xdomain.jp/palm03.html
このスクリプトで改編したHONMONを検索した結果がこちらである。見事に見出し語から表示されている。
なお、記事ではActive Perlが使用されているが、現在はActive PerlのFree版は入手が難しいので、strawberry-perlが代用できる。
この記事を書くに当たり、strawberry-perlで「ジーニアス英和大辞典」の派生語表示修正スクリプトを実行してみたが、問題なく使用できた。
このスクリプトは現在でも使用できるので、perlをインストールする労を厭わない方は、ぜひ試してみられることをお薦めする。