初めてiOSライブラリを公開してみて、その紹介とCocoaPodsにxibファイルや画像を含める方法について


はじめに

こんにちは。
先日、CocoaPodsにiOSライブラリを投稿させて頂きました。
コードの内容もシンプルでとても簡単なものですが、作成してみて楽しかったです。
この場をお借りしまして、CocoaPods公開時の悩んだ点やライブラリの紹介をさせて頂きたいと思います。

SimpleConsoleView

Installation

use_frameworks!

pod "SimpleConsoleView"

GitHub
https://github.com/KikurageChan/SimpleConsoleView

ViewControllerで以下のようにprintとすると
画面の下側に出力を閲覧できるViewが表示されます。

コード 説明
SCprintln(_:) at new line
SCprint(_:) no line break

また、端末をシェイクすると、このViewは非表示になります。

使い所 ?

勉強用に作るような「サンプルアプリ」やアプリ側で出力を見たい時などに使えないかなと思っています...

悩んだところについて

カスタマイズ性などから固有の画像などを含めることは
あんまり良くないのかもしれないのですが、
私の作成したものには「xibファイル」「画像」を含んでいました。
その場合のpodspecの書き方とディレクトリなどについて書いてみたいと思います。
pod lib createした時に作成されるディレクトリ構成はこんな感じです

SimpleConsoleView
    ├── Example                      // サンプルプロジェクトが入っているディレクトリ
    ├── LICENSE                      // ライセンスについて記述してあるファイル
    ├── README.md                    
    ├── SimpleConsoleView            // _Pods.xcodeprojのプロジェクトファイル
    ├── SimpleConsoleView.podspec
    └── _Pods.xcodeproj              // 自動生成された.xcodeproj

私は、ライブラリとして作ったプロジェクトが既にあったので
自動生成された_Pods.xcodeprojとそのプロジェクトファイルSimpleConsoleViewを置き換えました。

SimpleConsoleView
    ├── Example
    ├── LICENSE
    ├── README.md
    ├── SimpleConsoleView            <-- 置き換え
    ├── SimpleConsoleView.podspec    
    └── SimpleConsoleView.xcodeproj  <-- 置き換え

ディレクトリ構成

置き換えたプロジェクトの中身を見ています。構成はこのような感じにしました。

SimpleConsoleView
    ├── SimpleConsoleView
    |   ├── AppDelegate.swift
    |   ├── Assets                  //ここにxibやxcassetsを入れています
    |   ├── Base.lproj
    |   ├── Classes                 //ここに.swiftファイルを入れています
    |   ├── Controllers             //動作確認のためのStoryboardやViewController.swiftを入れています
    |   └── Info.plist
    └──SimpleConsoleView.xcodeproj

podspec

podspecは以下のように書きました。(一部抜粋)

# ここにソースファイルのパスを書いています
s.source_files = 'SimpleConsoleView/Classes/**/*.swift'
# ここにxibやxcassetsのパスを書いています
s.resource_bundles = {
    'SimpleConsoleView' => ['SimpleConsoleView/Assets/*.xib','SimpleConsoleView/Assets/*.xcassets']
  }

コードからxibファイルや画像ファイル呼び込む(Bundle経由?)

xibファイル

let pod = Bundle(for: self.classForCoder)
let path = pod.path(forResource: "SimpleConsoleView", ofType: "bundle")!
let bundle = Bundle(path: path)
let view = UINib(nibName: "SimpleConsoleView", bundle: bundle).instantiate(withOwner: self, options: nil).first as! UIView

画像ファイル (xcassets)

DotImageView.swift
let dotImage = UIImage(named: "dot", in: Bundle(for: DotImageView.self), compatibleWith: nil)

さいごに

私はiOS初心者で、Bundleなど分からないまま利用している部分が多く、
また、今回作成したライブラリも様々な問題を抱えています。

  • ViewControllerにこのViewを乗せて画面遷移をすると、次のViewControllerで何らかのSCprintを記述しないと再表示されない事(SCprint("")と空文字を表示させれば再表示できますが...)

  • シェイクすると非表示にできますが、画面遷移した時に、このViewを触るか、SCprintを記述しないとフォーカスが当たらずにシェイクアクションが受け取れない事

  • このViewに表示される文字列の制限を設けていないので、数千行などの表示に耐えられない事

  • その他Find機能などや横画面に対応していない事

などなど列挙するといっぱいありました...
これからも勉強を続けて、頑張ってみたいと思います。

参考にさせていただいた記事

CocoaPods公開について

CocoaPodsに自作ライブラリを登録 Qiita

CocoaPodsへのライブラリのアップロードと注意点 Qiita

cocoaPodsのBundleについて

Load assets from bundle resources in Cocoapods

見て頂いてありがとうございます。