Xcode11 で Resource の Localization をする

Xcode11 から Resource の Localization ができるようになった。 https://help.apple.com/xcode/mac/11.0/index.html?localePath=en.lproj#/dev7c584bb2a

やり方は簡単で、まずベースとなる言語のファイルを追加、Localization の設定、Localize 用のファイルを追加となる。

ベースとなる言語のファイルを追加

ベース言語となるファイルを Project Tree にドラッグ&ドロップ

Localization の設定

Show the file inspector にある Localization を選択し、Base を選択。
今回は画像でやった。

f:id:star__hoshi:20191231010952p:plain

Localize 用のファイルを追加

Show the file inspector 上の方にファイル選択があるのでそこからやる。

f:id:star__hoshi:20191231011409p:plain

ファイルの読み込み

Bundle.main.url(forResource: "image", withExtension: "jpeg")

これで Resource ファイルにアクセスすると、 Localize されたファイルを取得できる。

Share Extension で画像のシェア先に自分のアプリを出す

f:id:star__hoshi:20191230162427p:plain

これの Share 先に自分のアプリを表示させて、保存などの処理を行う。

やることは

  1. Target 追加
  2. App Groups の設定
  3. 証明書の修正
  4. Podfile 修正
  5. 新しいTargetの Info.plist 修正
  6. ShareViewController の実装
  7. データの保存先について
  8. Simulator で確認

です。

Target 追加

Xcode の File > New > Target から Share Extension を選択して作成。
こんな感じの物が出来上がる。

f:id:star__hoshi:20191230172145p:plain

App Groups

次に、App Groups の設定をする。Target を超えてファイルを共有するのに必要。

先ほど作った Target > Signing & Capabilities > + Capability から AppGroups を選択。 group.com.hoge を App Groups に追加する。メインの Target にも同様に group.com.hoge を App Groups に追加する。

証明書の更新

証明書の設定が必要なので、 https://developer.apple.com/account/resources/identifiers/list から Capabilities の App Groups にチェックを入れ、 group.com.hoge を登録する。

f:id:star__hoshi:20191230172657p:plain

証明書の更新をしておく。

Podfile 修正

Share Extension でライブラリを使う必要があるなら Podfile も修正する。
例えば Realm を共有するなら以下のようにして pod update。

# Podfile

target 'hoge' do
  use_frameworks!
  inhibit_all_warnings!

  pod 'RealmSwift'
end

target 'hogeShareExtension' do
  use_frameworks!
  inhibit_all_warnings!

  pod 'RealmSwift'
end

Info.plist 修正

今回は画像を1枚だけ受ける設定にしたいので、Share Extension の Info.plist を以下のようにする。

NSExtensionAttributes を Dictionary に, NSExtensionActivationRule を Dictionary に, NSExtensionActivationSupportsImageWithMaxCount を 1 で設定する。

f:id:star__hoshi:20191230173308p:plain

https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW8 で他の設定などが確認できる。

ShareViewController の実装

これまでの手順で、もう画像のシェア先に hoge アプリが出るはず。
画像を受け取った時の実装を書いていく。

import UIKit
import Social
import MobileCoreServices
import RealmSwift

class ShareViewController: SLComposeServiceViewController {
    override func isContentValid() -> Bool {
        // テキスト入力で Validation したい場合に設定する
        return true
    }

    // Post ボタンが押された
    // データの保存処理などここで行う
    override func didSelectPost() {
        let extensionItem = self.extensionContext?.inputItems.first as? NSExtensionItem
        let itemProvider = extensionItem?.attachments?.first
        let imageType = String(kUTTypeImage)

        // 渡されたデータが画像か確認
        if itemProvider?.hasItemConformingToTypeIdentifier(imageType) == true {
            // データを読み込む
            itemProvider?.loadItem(forTypeIdentifier: imageType, options: nil) { item, error in
                // 画像の場合 URL が渡ってくる
                if let url = item as? URL {
                    let image = UIImage(contentsOfFile: url.path)
                    if let image = image {
                        // 画像をローカルに保存やAPI実行するなどやりたいことをする
                        // contentText から入力された文字が取得できる
                    }
                }
            }
        }

        // 最後に実行する。データの保存処理などが非同期な場合は注意
        self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
    }

    override func configurationItems() -> [Any]! {
        // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
        return []
    }
}

こんな感じで画像を受け取ることができる。

データの保存先について

これで共有ディレクトリを取得できます。

let url: URL? =FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.hoge")

メインのアプリとデータを共有するためには documentDirectory などは使えません。
Realm でデータの共有をしたい場合などは以下のようにします。

        var config = Realm.Configuration()
        config.fileURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.memoCamera")?.appendingPathComponent("default.realm")
        Realm.Configuration.defaultConfiguration = config

Simulator で確認

Scheme を変えてデバッグをします。Scheme を変えないと break point など使えません。

f:id:star__hoshi:20191230174653p:plain

参考

以下の記事などが参考になります qiita.com

fastlane で Crashlytics に dSYM をアップロードしようとしたら invalid byte sequence in UTF-8 でハマった

  lane :upload_latest_dsyms do
    download_dsyms(version: "latest")
    upload_symbols_to_crashlytics
    clean_build_artifacts
  end

を実行したら、こんなエラーが出た

[22:29:22]: -------------------------------------------
[22:29:22]: --- Step: upload_symbols_to_crashlytics ---
[22:29:22]: -------------------------------------------
[22:29:23]: Extracting '/Users/hoge/hoge-1.0.0-201911121041.dSYM.zip'...
[22:29:23]: $ unzip -qo /Users/hoge/hoge-1.0.0-201911121041.dSYM.zip
+------------------+--------------------------------------------------------------------------------------+
|                                              Lane Context                                               |
+------------------+--------------------------------------------------------------------------------------+
| DEFAULT_PLATFORM | ios                                                                                  |
| PLATFORM_NAME    |                                                                                      |
| LANE_NAME        | upload_latest_dsyms                                                                  |
| DSYM_PATHS       | ["/Users/kensuke/hoge/hoge-1.0.0-201911121041  |
|                  | .dSYM.zip"]                                                                          |
+------------------+--------------------------------------------------------------------------------------+
[22:29:23]: invalid byte sequence in UTF-8

どうやら unzip が失敗しているようなので、手元で unzip してみると、確かに unzip でこけている。

$ unzip -qo /Users/kensuke/hoge/hoge-1.0.0-201911121041.dSYM.zip
error:  cannot create bf73f681-9f66-3e36-83e4-f79219bafdf6.dSYM/Contents/Resources/DWARF/��������+��޿����SS
        Illegal byte sequence

issue を探すと、ここに行き着いた。.app ファイル名が悪いらしい。

github.com

.app ファイルを見てみると、 ダメージ計算SS.app となっており、日本語ファイル名になっている。これを英語名に変える必要がある。

.app ファイル名を変える

Build Settings > Packaging > Product Name を確認すると確かに日本語になっている。

これに対処するためには、以下の順序で設定を変える。

  1. display name を英語のにする
    • f:id:star__hoshi:20191113231424p:plain
  2. Info.plist の Bundle display name をアプリ名に置き換える。
    • f:id:star__hoshi:20191113231024p:plain

そうすると、Product Name は英語で指定した Display Name になり、アプリ名は Bundle display name で指定したものにできる。そして Display Name は Bundle display name で指定したものになる。
めちゃくちゃややこしい。

注意

今度アプリ名を変える時、 Display Name を変えると Bundle display name が上書きされてしまうので、 Bundle display name だけを変えるようにしましょう。

macOS Catalina で Karabiner を使う

これをやるだけ。 Catalina が出たばかりなので暫定処置となる。

github.com

日本語にすると、

セキュリティとプライバシーの入力監視に /Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_grabber を追加。

f:id:star__hoshi:20190605221157p:plain

Terminal で sudo killall karabiner_grabber を実行。

これだけで動くようになった。

セキュリティとプライバシーに「+」ボタンが表示されない人は Krabiner-EventViewer.app を開くとここにアプリケーションが表示される。

Karabiner は Vi Mode、コマンドで英かなを使っているけどどちらも動いてて問題なさそう。

皆さまにご報告。

いつも応援していただいている皆さまへ、私事で恐縮ですがご報告があります。

本日令和元年五月一日に私星川健介は入籍致しましたことをここにご報告させていただきます。
お相手は一般の方です。

元号が令和に変わった初日で、大安という事もあり、この良き日に入籍できたことを嬉しく思います。

自分自身まだまだ本当に未熟な人間ではありますが、どんな時も楽しく思いやりに満ちた家庭を築いていきたいと思っております。

23歳からプログラミングのお仕事を始めて以来、本当にありがたいことに毎日充実した日々を送らせていただき、今日に至るまでたくさんの経験、ご縁が出来た事に心から感謝の気持ちでいっぱいです。
これからもソフトウェアエンジニアとして、人として、より精進していきたいと改めて感じています。
もちろん、今後も変わらずお仕事は続けていきます。

これまで支えてくださった家族、友達、お仕事関係の皆さま、そしてファンの皆さまに感謝の気持ちを忘れず、これからもアプリ・サービス開発などで恩返しをしていけるよう、より一層精進してまいります。

突然のご報告になってしまいましたが、どうか温かく見守っていただけますと幸いです。
今後とも皆さまのご支援賜りますよう、どうぞよろしくお願い致します。

お祝いお待ちしています。
https://www.amazon.jp/hz/wishlist/ls/38J4VLC6989GL

星川健介


この記事は戸松遥様のブログを参考にさせていただきました。

ameblo.jp

2018年振り返り

2018年色々あった。

気楽に生きた

2017 年振り返り で、2018年は気楽に生きたいと書いた。
2018年前半は頑張ってしまったのだが、後半は気持ちの向くまま気楽に生きれたのでいい一年だった。

今までは業務で必要になる知識は就業後にやっていたのだが、それを業務時間内でやるようにしている。これはなかなか難しくて、正直新しい知識というのはあまりつけられなかった。しかし、業務はなんとかなっているのでこれでいいかという気持ちになっている。

家でコード書かなくなった結果、資産運用や不動産投資、人間、筋肉などに興味が移っている。

こうして最新技術の知識がなくなり老害化していくのだろう、胸が熱くなる。

Github

f:id:star__hoshi:20190103100320p:plain

前半は個人開発やOSS作成などしていたが、後半はほぼ全くやらなかった。

OSS をそこそこ出したが、業務で使っているコードを OSS として切り出したという程度で大したものは作っていない。というか、しょうもないコードを切り出すと正直メンテがだるいので OSS やめて業務のレポジトリに戻したりもしている。ここら辺の塩梅がなんとなく掴めたのがよかった。

個人開発の収益はやっぱり落ちてきているのでなんとかしたいところがあるが、気持ちが全くないので半年くらいは個人開発しなさそう。

blog / Qiita

このブログに20記事Qiita に11記事 書いた。2018年前半に書いたのがほとんどなので、今年はもっとアウトプットが減るであろうことが予想される。

聴覚情報処理障害かもしれない が心に残った記事であるが、電話してても相手の話を聞き取れるしやっぱり問題ないのかな、とも思う。しかし俺は困っている。

Twitter

2018年前半はサブ垢を使っていたが、後半からはサブ垢を使うのをやめて鍵垢に引きこもっている。鍵垢はめちゃくちゃ居心地が良い、過激な発言やネガティブな発言を躊躇しなくて良い。どんなツイートをしても炎上しない、という安心感もある。
ID が knskgroup であり、めちゃくちゃ気に入っている。これは kskgroup2017 をリスペクトしている。

twitter.com

代わりに本垢ではしょうもないツイートばかりするようになった。

筋トレ

半年前くらいから筋トレを始めた。1年前と比べて体重が10kg近く増え、標準体重に近くなって嬉しい。今までは170kgで50kgとかでBMI異常値だったが、60kgになり正常値に入ってきた。

筋トレをしたことによる効能は特に感じていない。体温が高くなった気はする。

f:id:star__hoshi:20190103102311p:plain

Withings という体重計が Wifi 連携できるので、起きたら毎朝測るようにしている。

ポケモンGO

6月から復帰して12月末までやった。めちゃ楽しかった、コミュニティデイは歩き回ったし、レイドバトルも楽しくて、ポケモンGOオフ会もしたし、最高のゲームだった。

しかし12月末で引退した、歩きながらスマホ見るのは危険。

WWDC

6月にアメリカに行ったが、言語が通じなくてなかなか辛い気持ちになった。iOS エンジニアとしては一度行きたいという気持ちがあったので行けてよかった。

しかし意識が低いので、今年は申し込まないと思う。

2019年

2018年後半のように、とにかく気の向くまま行きていきたい。とはいえ給料をあげたいという強い気持ちがあるので、キャリアプランなどを考えるかもしれない。週末働くなどはしたくないので、純粋に今の給料をあげたい。それと不動産投資で一発当てたい。

今年もよろしくお願いします。

Xcode10 にしたら Multiple commands produce ... Info.plist で消耗した

個人プロジェクトを Xcode10 対応してたらこんなエラーが出た。

:-1: Multiple commands produce '/Users/hoge/Library/Developer/Xcode/DerivedData/KotaichiDex-eiyecmvfctikcwcspitwpzskudue/Build/Products/Debug-iphonesimulator/PokemonRealm/PokemonRealm.framework/Info.plist':
1) Target 'PokemonRealm' (project 'Pods') has copy command from '/Users/hoge/Xcode/KotaichiDex/Pods/PokemonRealm/PokemonRealm/Info.plist' to '/Users/hoge/Library/Developer/Xcode/DerivedData/KotaichiDex-eiyecmvfctikcwcspitwpzskudue/Build/Products/Debug-iphonesimulator/PokemonRealm/PokemonRealm.framework/Info.plist'
2) Target 'PokemonRealm' (project 'Pods') has process command with output '/Users/hoge/Library/Developer/Xcode/DerivedData/KotaichiDex-eiyecmvfctikcwcspitwpzskudue/Build/Products/Debug-iphonesimulator/PokemonRealm/PokemonRealm.framework/Info.plist'

PokemonRealm というのは private pods として利用しているライブラリ。こいつの Info.plist がどうこう怒られている。

PokemonRealm の .podspec はこう書いていた。

Pod::Spec.new do |s|
  ...
  s.source_files       = "PokemonRealm/*"
  ...
end

こうしていると、 PokemonRealm/Info.plist もライブラリ管理されてしまって、それが重複してしまうのでダメらしい。

なので、 Swift ファイルだけ対象にするようにした。

Pod::Spec.new do |s|
  ...
  s.source_files       = "PokemonRealm/*.swift"
  ...
end

そしたら無事エラーが消えて Xcode10 でビルドできた。

参考

github.com