iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【Firebase】Storageルールの管理を途中からする

既存のFirebaseプロジェクトのStorageルールを途中から追加したので、そのメモを👷‍♀️

Storageルールの追加

とりあえず、storage.rulesファイルをルートに作成します。

f:id:yum_fishing:20210409171944p:plain

次にfirebase.jsonで、作成したStorageルールのファイルを指定します。

  // ...
  "storage": {
    "rules": "storage.rules"
  },
  // ...

最後に、ルールを編集してデプロイすれば完了です👷‍♀️

$ firebase deploy --only storage --project=product

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com

【Xcode】PlaygroundでSwiftPackageを使ってみる

PlaygroundSwiftPackage使えるようにしてみたので、手順を備忘録として残しておきます👷‍♀️

ちなみにXcode12以上が必要で、本記事はXcode12.4で作業を行っています。

やっていく

まずは、File > New > Workspace...ワークスペースを作成します。

f:id:yum_fishing:20210408133834p:plain

f:id:yum_fishing:20210408134101p:plain

次に、ワークスペースPlaygroundを追加します。

f:id:yum_fishing:20210408134124p:plain

f:id:yum_fishing:20210408134300p:plain

f:id:yum_fishing:20210408134312p:plain

File > Add Files to "Workspace name"...で、使用するSwiftPackageワークスペースに追加します。今回はSwift-Collectionsを下記からダウンロードしてワークスペースに追加しました。

github.com

f:id:yum_fishing:20210408134547p:plain

てな感じで無事Collectionsがインポートできるようになったので、本日は以上になります🍺

参考

stackoverflow.com

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com

【Mac】nodenvのセットアップ

備忘録的に残しておく✍️

github.com

nodenvをzshでセットアップ

まずは、ソースを.nodenvにクローン。

$ git clone https://github.com/nodenv/nodenv.git ~/.nodenv

nodenv installなども行えるようにnode-build~/.nodenv/node-buildにクローン。

$ git clone https://github.com/nodenv/node-build.git ~/.nodenv/plugins/node-build

.zshrcに下記を追記して完了。

export PATH="$HOME/.nodenv/bin:$PATH"
eval "$(nodenv init -)"

あとはシェルを開き直して、ちゃんとセットアップできたか確認しましょう🏃🏻‍♂️

$ curl -fsSL https://github.com/nodenv/nodenv-installer/raw/master/bin/nodenv-doctor | bash
Checking for `nodenv' in PATH: /usr/local/bin/nodenv
Checking for nodenv shims in PATH: OK
Checking `nodenv install' support: /usr/local/bin/nodenv-install (node-build 3.0.22-4-g49c4cb9)
Counting installed Node versions: none
  There aren't any Node versions installed under `~/.nodenv/versions'.
  You can install Node versions like so: nodenv install 2.2.4
Auditing installed plugins: OK

てな感じで本日も以上になります🍺

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com

Retrying fetcher due to error xxx の対処法

とあるiOSプロジェクトで、依存関係のgemをインストールしようとbundle installを実行すると下記のようなエラーが発生しました。

Fetching source index from xxxx

Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from xxxx
Retrying fetcher due to error (3/4): Bundler::HTTPError Could not fetch specs from xxxx

解決法

どうやらプロジェクトで使用するgemgemstashを使って、クローズドなソースとして管理されているのが原因でした。sshuttleという簡易VPN環境を使うことで、無事にgemをインストールすることができました。

github.com

ちなみに、Windowsは対応していないらしい。

参考

github.com

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com

【Xcode】必要なバイナリのみ生成するようにする

結論

XcodeBuild Active Architecture Onlyを有効にすることで、開発時などに使う端末のアーキテクチャのバイナリのみを生成できるようになり、ビルド時間を削減することができるようになります。基本的には、デフォルトで有効になっています。(なぜかstaging環境作った時にNoになってた、、)

f:id:yum_fishing:20210405103222p:plain

ONLY_ACTIVE_ARCH = YES

ちなみに、Release環境は様々なアーキテクチャでアプリケーションを実行する必要があるので、Noに設定されます。

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com

【Swift】文字列からSelectorを生成する

結論

NSSelectorFromStringを使うことで、下記のように文字列からSelectorを生成することができるようですね👀

let selector = NSSelectorFromString("delete:")

ちなみに今回は、UICollectionViewcollectionView(_:canPerformAction:forItemAt:withSender:)delegateメソッドにイベントを送信する際に使用しました。

    override open func delete(_ sender: Any?) {
        if let collectionView = self.superview as? UICollectionView {
            if let indexPath = collectionView.indexPath(for: self) {
                collectionView.delegate?.collectionView?(collectionView, performAction: NSSelectorFromString("delete:"), forItemAt: indexPath, withSender: sender)
            }
        }
    }

てな感じで本日も以上になります🍺

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com

【Swift】タップスルーなViewを作成する

このViewのタップイベントをスルーして、背面にあるViewをタップできるようにしたいという場面は、たまに遭遇するかと思います。今回はそんな場面で使えるSwiftの小ネタについて書こうかと思います👷‍♀️

結論

hitTest(_:with:)で受け取ったイベントが自分自身である場合は、タップイベントをスルーするUIViewのサブクラスを下記のように作りました。

class TapThroughView: UIView {
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let view = super.hitTest(point, with: event)
        
        if view == self {
            return nil
        }
        
        return view
    }
}

ちなみにhitTest(_:with:)は、タップされたView階層の最も深い位置(ルートとなるView)からサブビューへ、再帰的に呼び出されることでイベントを受信する最前のViewを見つけます。また、isHiddentrueだったり、isUserInteractionEnabledfalseだったり、alpha0.01未満の場合は、このメソッドは呼び出されません。

てな感じで本日も以上になります🍺

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com