2016/03/24MobileSafariとWebView全般に拡張メニューを追加するWebViewExMenuというTweakを作ってみました。MobileSafariの拡張じゃありません。Webブラウザの拡張でもありません。WebView全般で有効。WebViewというのは、iPhoneのアプリケーションの中全般で部品として使われています。Evernoteの中でも、Twitterクライアントの中でも、RSSリーダーの中でも、2ちゃんねるリーダーの中でも、サードパーティ製のWebブラウザでも有効です。どこからでもはてなブックマーク登録Bookmarkletを呼び出したり、といったことができます。Bookmarkletsフォルダはあるのですが、JavaScript実行メニューに表示されません。どこでもはてブどこでもはてブできます。2実際の動作の様子です。MobileSafariのみならず、RSSリーダーからも呼び出せています。場所を選ばずメニューの表示ができ、機能の実行ができていることが分かるかと思います。WebViewExMenuの表示方法WebViewExMenuは、MobileSafari、WebView上でトリプルタップをすると表示されます。ページ中がタップ可能なもので占められている場合など、タップを避けつつメニューを表示することが困難なケースはあるかと思います。汎用性の実現、片手操作が可能であること、実装の簡単さからトリプルタップを選択しました。Bookmarklet(JavaScript)実行と、実行結果のクリップボードへの転送テキストエンコーディング選択ソース表示モード移行Bookmarklets(JavaScript)実行と、実行結果のクリップボードへの転送機能についてMobileSafariのブックマークのルートにあるBookmarkletsフォルダ(Bookmarkletの複数形でBookmarklets)にあるブックマークレットを一覧から選んで実行できます。Bookmarkletsフォルダの下層は再帰走査しません。ベタで置いてください。SafariのブックマークからBookmarkletを実行する場合との違いは、実行結果に何らかの文字列が含まれていたら、それをクリップボードに転送することです。以下のBookmarkletを実行すると、表示中のページのタイトルとURLがクリップボードに転送されます。window.locationXPathで掘れば、大概のスクレイピングはできるかと思います。ページから欲しい情報を抜いてきて、サクっとクリップボードにコピー、ということができるわけです。副次的なメリットとして、ブックマークレット実行までに、テキスト選択が解除されてしまうことがないというものがあります。よって、選択テキストを取得して処理するタイプのBookmarkletを素直に動かすことができます。Safariから選択テキストを扱うBookmarkletを実行する場合、ブックマークボタンを押した時点でテキストの選択が解除されてしまうため、少々面倒なBookmarkletの作りと手順が必要なのです。YutaKikuchiのTechBlog以下の例では、選択中のテキストをダブルクォートで括ったものがBookmarkletの返り値となり、クリップボードにコピーされます。冒頭の「javascript:」は必要ありませんが、Safariのブックマークから起動する場合のことを考えて、付けておくのがいいでしょう。逆に、クリップボードにコピーされたくない場合は、Bookmarkletの最後を文字列を返さないメソッドで終わるか、void(0)かなんかを実行してください。Schemeから始まるURLをwindow.locationにセットして、別のアプリケーションを呼び出すBookmarkletは、iPhoneでは多用されます。したタイプのJavaScriptは、必ずしも期待通りの結果をもたらすとは限りません。JavaScriptを動かしたアプリケーション内のWebViewのdelegateメソッドの実装次第です。Scheme経由で別アプリケーションを呼び出そうとしても無反応。一方で、Tweetingsだと呼び出せるといったような感じです。Bookmarkletを実行しても、ウンともスンとも言わない。そんなときはどうしましょう?「設定>Safari>デベロッパ>デバッグコンソール」をオンにしましょう。エラーが出ていれば、それをデバッグコンソールで教えてくれるようになります。デバッグコンソールは、Safariのアドレスバーの下に表示されます。テキストエンコーディング選択機能についてMobileSafari、WebViewでちょっと昔めのページを訪れると、ときどき化けて見られないことがあります。ページの実際のエンコーディングと、ページ内で指定されているcharsetに不一致があったり、正しくない書き方だったりするのでしょう。WebViewだと処置のしようがありません。処置のしようがないんです。そんなWebページの文字化けの対策になるのがテキストエンコーディング選択機能です。X0213UTF-8上記の六つのテキストエンコーディングから任意に選んで適用することができます。そのどれかを選択すれば日本語の文字化けは回避することができるかと思います。選択できるテキストエンコーディングは無数にあり、それを選択できるようにすることは可能ですが、無数の中から残したいものを選ぶUIを作る必要があるので、とりあえずはこのようにしてみました。ソース表示モードについてWebViewExMenuの項目「ソースを表示」を選択すると、表示中のページのhtmlのソースを見ることができます。シンタックスハイライティングされ、行番号まであって見やすい表示です。ソース表示モード中にWebViewExMenuを起動すると、「ソースを表示」から「ソース表示を解除」とボタン名が変わっています。「ソース表示を解除」ボタンを押すと、通常のモードに戻ります。設定WebViewExMenuをインストールすると、「設定>WebViewExMenu」が現れます。Menu:メインメニューとJavaScript実行メニューの階層を入れ替え、JavaScript実行メニューを最上層に持っていきます。JavaScriptの実行がクイックにできるようになります。考える人はオンにしてください。First」の設定項目はVer.0.4から削除されています。既知の不具合WebViewを使うアプリケーションが起動不能になるケースがある模様Bookmarkletを編集してもすぐには反映されません。WebViewの初期化時にBookmarkletを読み込んでいるので、一度WebViewを閉じないと更新は反映されません。Schemeで他のアプリケーションを呼び出そうとしても、うまくいかないことがある。「Bookmarklets(JavaScript)実行機能の制約」を読んでください既にBookmarkletsフォルダはあるのですが、JavaScript実行メニューに表示されません。バグですか?WebViewの初期化時にBookmarkletを読み込んでいます。初期化とは、例えばMobileSafariなら、新しくウインドウを作ることが初期化です。ここでWebViewExMenuのJavaScript実行メニューの内容が読み込まれます。初期化時に読み込んだBookmarkletは、そのWebViewが保持します。MobileSafariのBookmarkletsフォルダに手を加え、さらにMobileSafariで新しくウインドウを作った場合、古いウインドウと新しいウインドウのJavaScript実行メニューの内容は違ったものになります。MobileSafariにBookmarkletsフォルダを作ったのが、WebViewExMenuを実行しようとしているWebViewが生成されたのより後である場合、まだそれらが無かったときにそのWebViewは生成されているため、MobileSafariにBookmarkletsフォルダの中身は表示されません。MobileSafariなら、新しくウインドウを作ってからWebViewExMenuを実行してください。この辺は感覚的でないのは分かりますが、都度読み込もうとすると不具合が出るため、このような仕様になっています。Bookmarkletを編集してもすぐには反映されないのですが、バグですか?Bookmarkletを編集してもすぐには反映されません。WebViewの初期化時にBookmarkletを読み込んでいるので、一度WebViewを閉じないと更新は反映されません。都度読み込もうとすると不具合が起きるための仕様です。メニューの表示方法を〜片手でできる範囲の起動方法ではベストだと思っているので、考えを曲げる気はありません。ActionMenuには〜Activator、SBSettingsの場合は1対多の通信となり、「どのWebViewで実行するか」を絞る手順が必要になります。それを解決する手段はありませんし、そんなことをしたい人もまた居ないはずです。1画面に複数のWebViewが存在する、ということもあります。ActionMenuならいけますが、メニューの奥まったところから実行するのは得策ではないと思います。コピー/ペーストに並べて置くようなものでもありません。よって、対応するつもりはありません。0.3が不安定だったため、webviewexmenudというDaemonにSpringBoardの代わりをさせるように。PlainText.app連携機能を改修。拡張子txtもWebViewExMenuのJavaScript実行メニューに追加するようにした。PlainText.app連携機能搭載。(iPad未テスト)インストールNew野良リポジトリに置いておきました。「WebViewExMenu」で検索してください。-平均から抜けられない僕-にインスパイアされて作りました。アイデアは随分前から考えていたんですけどね。AM4.3.3でも動作しました。した時に、かゆい所に手が届いて、良いと思いました。PMいつも便利なtweekありがとうございます!ちょっとバグ報告です。4.3.2JBで初めのうちは動作していましたが、しばらくしてWebViewを使っている(と思われる)appが全て起動しなくなりました。発生した時がいつなのかハッキリしてなくてすみません。PMこちらで再現していないので何とも分かりませんが、クラッシュログがもらえたりしないでしょうか。クラッシュログが保存されます。Ver3を使わせて頂いてます。4.1環境の為、メニューが二重起動しますが1つ目をキャンセルすれば使用出来ます。PMうおおおおお!素晴らしいです。AM当方iPad2のiOS5.0.1使用なのですが、対応していないとわかった上でインストールしました。トリプルタップしてJavaScriptを実行を押したところ、出てくる枠が小さすぎて押しても反応せず機能しませんでした。このtweakはとても便利で素晴らしいので是非iPadにも対応させてもらえませんでしょうか?お忙しいのに私の身勝手な考えで申し訳がないのですが、是非ともご検討よろしくお願いします。コメントをキャンセルメールアドレスが公開されることはありません。date*日本語が含まれない投稿は無視されますのでご注意ください。