2018年1月15日月曜日

使ってみた(App Extension編) その1

「コンテキストメニューを置き換えてみた」の続編になります。

UITextViewのコンテキストメニューのカスタマイズはできたものの、WKWebViewではできなかったというところで終わってました。何とかならないかなぁと思っていたのです。

あ、App Extensionで「共有」に追加でき、、、?

それや!

App ExtensionはiOS8で追加された機能ですが、使ったことがなかったので思いつかなかったです。

ここではApp Extensionについてのざっくりとした話題だけですので、詳細についてはAppleの「App Extensionプログラミングガイド」を参照してください。

--

登場人物は3人です。

  1. ホストアプリケーション(Host app)
  2. App Extension
  3. 収容アプリケーション(Containing app)

1.のホストアプリケーション(Host app)は、例えばSafariやメモappなど、App Extensionを呼び出す側のアプリです。

3.の収容アプリケーション(Containing app)は、App Extensionを備えたアプリで、いわゆる「アプリ」です。

App Extensionは、収容アプリケーションのプロジェクトに含まれていますが、収容アプリケーションとは独立して動きます。

ホストアプリケーションは、収容アプリケーションを呼び出すのではなく、App Extensionを呼び出してやりとりするだけで、収容アプリケーションが起動されるわけではないというところが肝でしょうか。

--

さっそく、テストアプリを作ってみます。

ホストアプリケーションはとりあえず、Safariを使います。
収容アプリケーションは、AwesomeAppというアプリにしてみます。


いつもどおり、普通にAwesomeAppというプロジェクトを作成したら、App Extensionを新しいターゲットとして追加します。シンプルにShare Extensionにします。

File > New > Target で、Share Extensionを選択します。

ターゲットとして追加

Share Extensionを選択


ターゲット名は自由に決められますが、「収容アプリケーション+機能」がわかりやすいと思いますので、AwesomeAppShareにしました。



AwesomeAppShareのテストのスキームを作成するか否かのダイアログが表示されるので、'Activate'を選択します。

Activateを選択
ターゲットが追加されました

このApp Extensionのターゲットの中には、3つのファイルが生成されています。

  • ViewController
  • Storyboard
  • info.plist
--

ひとつ、はまりどころとしては、Deployment Targetがあります。

App Extensionと収容アプリケーションのDeployment Targetが同じになっているか確認するのを忘れないでください。

ターゲットの追加時には、デフォルトのDeployment Targetになります。既存のアプリにターゲットを追加するときには、同じにならないことがありますので、要確認です(テストで、はまりましたよ)。

--


たったこれだけですが、とりあえず動きます。


スキームを「(E)AwesomeAppShare」に設定して、実行します。

(E)AwesomeAppShareに変更


ホストアプリケーションが選択できるので、Safariを選んでRunを押します。



Safari(ホストアプリケーション)が起動するので、適当な文言を選択してから、Shareを選択します。

Shareを選択


AwesomeAppShareのアイコンがあるので、タップ。

※ここではアイコンがデフォルトのものになっていますが、収容アプリケーションにアイコンが設定されていれば、そのアイコンが自動的に表示されます。



Share Extensionが起動します。

選択した文言が取得できています


コーディングなしで、ここまでできました。ただ、ここで動いているのはあくまでShare Extension(AwesomeAppShare)です。収容アプリケーション(AwesomeApp)は、全く動いてません。念のため。


今回はここまで。


「使ってみた(App Extension編) その2」に続きます。


♪♪♪


こちらもどうぞ。
使ってみた(App Extension編) その2
使ってみた(App Extension編) その3
使ってみた(App Extension編) その4
使ってみた(App Extension編) その5
使ってみた(App Extension編) おまけ

iOS 11 Programming
  • 著者:堤 修一,吉田 悠一,池田 翔,坂田 晃一,加藤 尋樹,川邉 雄介,岸川克己,所 友太,永野 哲久,加藤 寛人,
  • 発行日:2017年11月16日
  • 対応フォーマット:製本版,PDF
  • PEAKSで購入する


2018年1月1日月曜日

続々 Vimのようなもの

2021/9/23 追記
Xcode13から、Vim ModeがXcode自体に組み込まれました。XVim2も一応の役割を終えたかもしれません。

♪♪♪

Xcodeがバージョンアップすると、UUIDが変わってプラグインが動かなくなりますね。XVimも例外ではありません。

大体はUUIDを追加するだけで動くようになります。もちろんUUIDだけの問題ではないケースもあるので、まずは「UUIDを追加すればいけたよ」という情報を得てから行った方がいいです。

普段からGitHubのリポジトリをwatchしておくと吉。

まぁ、XVimの場合、すぐに修正されるので、Xcodeのバージョンアップを急がないで少し待っていればいいのですが、最新のiOSのテストができないということもあります。そんなときのために、今回はUUIDの追加方法について書いておくことにします。



1. まず、普通にXcodeをバージョンアップします。

時間かかるね。


2. XVimをインストールしたときと同じように、Xcodeを自作の証明書で署名します。
※詳細は「Vimのようなもの」の1.〜3.を参照してください。


3. 新しいXcodeのUUIDを調べます。
$ defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
B395D63E-9166-4CD6-9287-6889D507AD6A
$


4. プラグインは~/Library/Application Support/Developer/Shared/Xcode/Plug-insにあります。
$ cd Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/
$ ls -l
total 8
drwx------  3 hoge  staff  102  3 29  2016 UncrustifyPlugin.xcplugin
lrwxr-xr-x  1 hoge  staff   74  2 26  2016 Unity4XC.xcplugin -> /Applications/Unity/PlaybackEngines/iOSSupport/Tools/OSX/Unity4XC.xcplugin
drwxr-xr-x  3 hoge  staff  102 11  8 13:27 XVim2.xcplugin ←これがXVim2
$
XVim2.xcpluginが、XVim(正確にはXVim2)です。


5. XVim2.xcpluginの中の、Contentsの下にInfo.plistがあるので、適当なエディタで開きます。
$ cd XVim2.xcplugin/Contents/
$ ls -l
total 8
-rw-r--r--  1 hoge  staff  1815 12 24 01:03 Info.plist ←これを編集する
drwxr-xr-x  3 hoge  staff   102 11  8 13:27 MacOS
drwxr-xr-x  3 hoge  staff   102 11  8 13:27 Resources
drwxr-xr-x  3 hoge  staff   102 11  8 13:27 _CodeSignature
$ 
$ vi Info.plist 
XVimを使うような人は、そのままvimで開けばいいですね。


6. DVTPlugInCompatibilityUUIDsを探して、3.で調べたUUIDを追加して保存します。
<dict>
    <key>AllowedLoaders</key>
    <array>
        <string>com.apple.dt.Xcode</string>
    </array>
    <key>BuildMachineOSBuild</key>
    <string>17B48</string>
    <key>CFBundleDevelopmentRegion</key>
    <string>en</string>

    ---- 中略 ----

    <key>DTXcodeBuild</key>
    <string>9B55</string>
    <key>DVTPlugInCompatibilityUUIDs</key>
    <array>
        <string>CA351AD8-3176-41CB-875C-42A05C7CDEC7</string>
        <string>E0A62D1F-3C18-4D74-BFE5-A4167D643966</string>
        <string>DF11C142-1584-4A99-87AC-1925D5F5652A</string>
        <string>C3998872-68CC-42C2-847C-B44D96AB2691</string>
        <string>B395D63E-9166-4CD6-9287-6889D507AD6A</string> ←これを追加する
    </array>
    <key>NSHumanReadableCopyright</key>
    <string>Copyright © 2017 Shuichiro Suzuki. All rights reserved.</string>

    ---- 中略 ----

    <key>XCPluginHasUI</key>
    <false/>
</dict>
</plist>


7. あとは、Xcodeを開き直すときに[Load Bundle]を選べばOKです。

いつものやつ。



簡単ですね。これでうっかりアップデートを、ポチっとしちゃったときでも安心です。




iOS 11 Programming
  • 著者:堤 修一,吉田 悠一,池田 翔,坂田 晃一,加藤 尋樹,川邉 雄介,岸川克己,所 友太,永野 哲久,加藤 寛人,
  • 発行日:2017年11月16日
  • 対応フォーマット:製本版,PDF
  • PEAKSで購入する