hishidaの開発blog

EBシリーズ(EBPocket,EBWin,EBMac,EBStudio),KWIC Finder,xdoc2txt,読書尚友の開発者ブログ

EBPocket Pro for iOS iOS13ダークモード対応

EBPocket Pro for iOS のダークモード対応が終了し、無事App Store で公開できた。iOS13のダークモード対応以外の新機能の追加はない。

ダークモード対応を有効にするにはXcode11でビルドする必要があるのだが、Xcode11でビルドしたモジュールがiOS13ではメモリ管理の関連で予期せぬクラッシュが発生し、問題を回避するのに大半の時間を費やした。

結局、検索一致リストにEPWING外字を表示するために使っていた独自クラスをUIWebViewに置き換えることで動作するようになった(オリジナルのソースも間違っているようには見えないので、原因は謎のまま)。

iOS14以降に懸念されることは、deprecated(非推奨)とされているAPIをまだ使っている箇所があって、iOS14以降APIが廃止されると動作しない可能性があることだ。

把握しているのでは、

  • UIPopoverController(iOS9でdeprecated)→UIPopoverPresentationControllerで置き換え
  • UIWebView(iOS12でdeprecated)→WKWebViewで置き換え

がある。今回は無事だったが、iOS14ではそろそろやばいかもしない。iOS14ベータが出た段階でテストする予定。

今回、Macの開発環境をXcode11に統一できたことが成果かもしれない。2020年4月以降は、AppStoreへの提出はXcode11+iOS13 SDKが義務づけられるからだ。

これでAndroid,Mac OS X ,iPhoneでのダークモード対応が終わり、残るはWindows だけになった。Windows 10 ではMay 2019 Updateでダークモードがサポートされたが、アプリケーション側で独自に対応する必要がある不完全なもので、なかなか面倒だ。まだ標準アプリとChromeぐらいしか対応していないと思う。EBWin4のダークモードは実現できるかどうか、今のところわからない。

EBMac ダークモード対応

EBMacの開発環境を最新のXcode11に移行し、macOSもCatalinaにアップデートしたところ、Xcode11でコンパイルしたappは自動的にダークモード対応とみなされることがわかった。
せっかくなので画面の各部の色を調整し、正式にダークモード対応とした。どうでしょうか。

f:id:hishida:20191105130300p:plain

EBPocket for iOSもダークモード対応可能だと思うので、検討してみたい。

「ランダムハウス英語辞典Toolkit」をEBStudio2で変換する場合の注意点

「ランダムハウス英語辞典Toolkit」で作成したHTMLが、EBStudio2では文字化けするという報告があった。旧EBStudioとは互換性を保っているはずなので、調査したところ、EBStudio2の新機能の「UnicodeからEPWING外字に自動登録する」が悪さをしていることがわかった。

ランダムハウス英語辞典Toolkit」では、文字の字下げを表現するために、EPWINGの制御文字(0x1F09)を直接16進コードで表現している箇所がある。

<dd><p>
[&#x00E9;i] a<br>
&#x1f09;&#x00;&#x02;━n.<br>
&#x1f09;&#x00;&#x02;(pl. A&apos;s or As, a&apos;s or as)<br>
&#x1f09;&#x00;&#x02;【1】英語アルファベットの第1字(母音字).<br>
&#x1f09;&#x00;&#x02;【2】A, a 字によって表される音[ei](bake),[&#xE0EC;](hat),[&#x0251;&#x02D0;](father),[&#x0254;&#x02D0;](small) など.<br>
&#x1f09;&#x00;&#x02;【3】A 字形の物.<br>
&#x1f09;&#x00;&#x02;【4】(印刷・スタンプ・手書きなどの)A, a 字.<br>
&#x1f09;&#x00;&#x02;【5】&#xE13B;数学&#xE13C;第一の既知数[量].<br>
&#x1f09;&#x00;&#x02;<b><成句></b>
</p>


旧EBStudioでは、16進コードの0x1F09 0x0002 は外字として定義されていないため、そのままEPWINGに出力していたが、EBStudio2だと「Unicodeの0x1F09(Ἁ)が出現した」と解釈してしまい、そのために文字化けが生じていた。EBStudioの本来の仕様では、制御文字を直接指定したい場合のために拡張タグを用意している。

<X4081>1F09 0002</X4081>

互換性を保つために、EBStudio win版(2.0.9)およびmacOS版(2.0.5)では、「UnicodeからEPWING外字に自動登録する」機能をオプションにした。
ランダムハウス英語辞典Toolkit」を使用する場合は、このオプションをoffで実行してほしい。

ランダムハウス英語辞典Toolkit」をWindows10で実行する

 なお、「ランダムハウス英語辞典Toolkit」では「ランダムハウス英語辞典」をインストールしてから変換する前提になっているが、インストーラがWindows10では実行できない。次の手順でインストールを行わずに変換ができる。

  1. CD-ROMの \DATAをまるごとPCの任意のディレクトリにコピー。
  2. CD-ROMのルートにあるReadme.txtを、コピーしたDATAディレクトリの中にコピー。
  3. 設定ファイルsrd2html.iniの DICPATH= と DATAPATH= に、1のコピー後のDATAディレクトリを指定する。

 

EBMac、AppStoreからrejectされる

前回EBMacをApp Store配布に切り替えると告知したが、あえなくApp Storeの審査でreject(却下)されてしまった。理由は、「EBMacというアプリケーション名称に Mac が含まれているから」。

名前が却下されてしまったのでは仕方ない。EBPocket の名称で登録してマニュアル等では "EBPocket on macOS(EBMac)"とするという方法も考えられるが、EBPocketの名称でAndroid版、iOS版、macOS版が存在することになり、問合せの時にプラットフォームを言ってもらわないと話が通じなくなる。

実は Apple notary service でAppleの認証を受ければ、これまで通り野良アプリを配付できるので、App Storeは諦めて認証を受けることにした。 

qiita.com

App Storeで配付することを想定していたので、今回からSandBox 対応になる。これまでの辞書グループ登録は引き継げないので、もう一度辞書登録を行っていただく必要がある。

とりあえずhome pageでCatalina対応の EBMac 1.44.0 を公開した。当面はこれまで通りVectorでの配布を継続するつもりである。

NotarizeされたアプリをダウンロードしてmacOS Mojave以降で実行すると、初回のみ次のような確認メッセージが表示される。そのまま開けば次回から確認なしで実効できるので、ユーザーの負担は少ない。

f:id:hishida:20191025143026p:plain

EBStudio for macOSも、2020年1月までには認証を受ける必要がある。こちらも近日中に対応する予定である。

EBMac のApp Store登録を検討中

macOS 10.15 CatalinaではEBMacが実行できないという報告を受けた。当方の環境は諸般の事情でまだ 10.14 Mojave のままなので確認できていないが、考えられる理由は次の二つ。

いずれApp Store以外からのアプリケーションのインストールが禁止される可能性もあるので、この機会にEBMac をApp Storeに登録する方向で考えている。というのは、2016年頃から、iOS Developer Program と Mac Developer Programが統合されてApple Developer Program になったので、iOSの開発者もMac のアプリケーションをApp Store に登録できるようになったからである。

このため、EBMacに次の改造が必要になる。

  • 動画の再生を、QuickTimeからiOS由来のAVFoundationに変更する。
  • Sandboxに対応する

このうちSandbox対応の方が大変である。

EPWING辞書はSandboxの外にある。NSOpenPanelで開いたパス(EBMacでは辞書ファイルのパス)はアプリの起動中はアクセス権限があるが、アプリを閉じると権限が消えてしまい、次回起動時はアクセスできなくなる。そこでsecurity-scoped bookmarkにパスを保存すると、次回起動時にアクセス権限を付与することができる。この方法で実現しようと思っている。

 

 

Android コンテキストメニューへのEBPocketの登録と検索

Android M(6.0)以降では、Google翻訳をインストールすると、ブラウザ等のアプリのコンテキストメニューに"翻訳"が現れ、選択したテキストの翻訳を行うことができる。同様に、MDict等の辞書アプリをインストールすると、コンテキストメニューに辞書アプリ名が表示され、選択したテキストで辞書引きができる。
「EBPocketでは対応しないのか」と海外のユーザからの問い合わせがあったので、調査したところ簡単に対応できそうなので実装してみた。Android M以降にEBPocketをインストールすると、次のようにコンテキストメニューにEBPocketが登録される。

f:id:hishida:20191016081031p:plain

実装方法は下記の通り。

1.AndroidManfest.xmlにaction.PROCESS_TEXTのインテントフィルターを追加する。これで他アプリのコンテキストメニューにアプリ名が表示される。

     <intent-filter>
        <action android:name="android.intent.action.PROCESS_TEXT" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>

2.ACTION_PROCESS_TEXTのハンドラを作成する

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
。。。
	handleIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
	// android:launchMode="singleTop" にした場合、
	// 2回目以降のActivityの呼び出しで呼ばれる
	handleIntent(intent);
}

private void handleIntent(Intent intent) {

	String queryAction = intent.getAction();

	if (Intent.ACTION_SEARCH.equals(queryAction)) {
		// handles a search query
		String queryString = intent.getStringExtra(SearchManager.QUERY);
		//  queryStringで検索
	}
	else if (Intent.ACTION_PROCESS_TEXT.equals(queryAction)) {
		Bundle extras = intent.getExtras();
		if (extras != null) {
			CharSequence ext = extras.getCharSequence(Intent.EXTRA_PROCESS_TEXT);
			if (ext != null) {
				String queryString = (String) ext;
				//  queryStringで検索
			}
		}
	}
}

参考になる記事:

medium.com