なぜframeworkを作ろうと思ったか
数値の配列からその特徴を抽出するクラスを生成しました。
割といい感じのクラスで、使いやすく、尚且つそのアルゴリズムが簡単...
ソースコードの中身がわかると「そんな程度でできるんだ...」と思われるのもなんか悔しい。
ならばソースコード非公開で利用してもらうのがいい!
その手法の一つがframeworkだったわけです。
frameworkを作る
Xcodeプロジェクトを作る
今回はmacOS、iOSの両方で使えるMultipratform
のframeworkを作ります。
数値計算だけのプログラムでGUIが関わらないため、macOS、iOSとも同じソースコードが利用できます。
MyFramework
というプロジェクト名にしました。
実際に処理をするMyFramework
というソースファイルをプロジェクトに追加します。
MyFrameworkクラスにhello()
というメソッドを実装します。
「Hello, World!」という文字列を返すメソッドです。
public class MyFramework {
///プロパティ、メソッドの使い方などのコメント
public static func hello() -> String {
return "Hello, World!"
}
}
これでプログラム自体は完成です。
ビルドの準備
今回の目標は
- ソースコードは非公開にする
- macOS、iOSでも使える
です。
ビルドスキーム
ソースコードを非公開にするにはRelease
でビルドします。
Releaseビルドにより、デバッグシンボルがframeworkに含まれなくなります。
プラットフォームごとにビルド
macOS、iOSの実機、iOSのシミュレータごとにビルドする必要があります。
どのプラットフォームでビルドするかは下記のように選ぶことができます。
ビルドされたProductsのフォルダ内を見てみると、それぞれのプラットフォームごとにframeworkが出来上がっています。
これでframeworkは完成です。
作ったframeworkを使う
frameworkを使うプロジェクトをXcodeで作成します。
もちろん、既存のプロジェクトに取り込んで使うこともできます。
今回はmacOSのFrameworkTEST
というプロジェクトを作りました。
プロジェクトにフレームワークを取り込む
ビルドしたframeworkを利用したいプロジェクトにドラッグ&ドロップします。
わかりやすいように、プロジェクト内にframeworks
というフォルダを作りました。
この後、いくつかやらなければならない作業があります。
まず、frameworkの設定をEmbed & Sign
にします。
次にBuild Settingのframework Search Paths
を指定します。
今回はプロジェクト内のフォルダに入れたので、そのフォルダを設定用のポップオーバーにドラッグ&ドロップすれば簡単に指定できます。
これでframeworkを使う準備は完了しました。
ソースコードでframeworkを利用する
まずは利用するソースコードの冒頭でインポートします。
import MyFramework
MyFrameworkのhello()メソッドを使います。
print(MyFramework.hello())
ソースコード全体はこんな感じです。
import Cocoa
import MyFramework
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
print(MyFramework.hello())
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
実行すれば、ターミナルに「Hello, World!」が表示されます。
ソースコードが非公開になっているか?
私はここでハマりました...
設定類は問題なく、実際は非公開になるはずです。
しかし、デバッガでframeworkのメソッドにStep Inすると、なんとソースコードが見えています!
これ、同じMacでframeworkを作って、同じMacで使っていることが原因です。
Mac内にデバッグシンボルが残っているので、それを参照してしまうということです。
なので、同じMacに別のログインアカウントを作り、そちらで確認してみます。
これでStep Inできなければ、無事非公開になっています。
別のアカウントで実行したところ、Step Inできないので、無事非公開になっています。
ターミナルには「Hello, World!」が表示され、無事frameworkが使えています。
また、frameworkで利用できるプロパティ、メソッドの定義も見ることができました。
無事完成
これでソースコードを非公開にしつつ、frameworkを通して自分で作ったクラスなどを多くの人に利用してもらうことができます。