- 投稿日:2020-04-04T22:51:43+09:00
iOS開発でDEV環境を構築する
iOSアプリを運用していくにあたって、アプリの配布やサーバーサイドとの連携は必須となります。
その際にクライアント側でDevやStaging、Releaseなど環境を使い分けたいケースは必ず出てきます。
今回はXcode上でDev環境を作る一連の流れをまとめてみました。
複数の環境を追加したい場合もこの流れで同じことを繰り返していけば良いので、簡単です。この記事ではConfigrationを変更することで、DEV環境を作ります。
他にもTargetsを増やす方法やxcconfigファイルを使用する方法もあるので、チェックしてみてください。ProjectのConfigurationのNameをDebug -> Developに変更
単純にリネームです。
3つ以上環境使い分けたいケースでは、ここで追加をしてください。Preprocessor Marcos(Project -> Build Setting)で、DEBUG=1 -> Develop=1に変更
- Preprocessor Marcosとは
- 環境ごとに条件分岐できるようにするためのXcodeの機能
- SwiftでPreprocessor Macrosを使う
Other Swift flagの設定
#if DEVELOP
とかできるようにするために行う。
-D <flag名>
の形式で設定する。
複数やる場合は、-D <flag名> -D <flag名>
DEV sheme作成
sheme選択画面でDEV版が選べるようになります。
↓こんな感じ。Manage schemeを選択。
Duplicate schemeをクリックして、既存のshemeを複製。
名前が
copy of <プロジェクト名>
となっていると思うので、本番と見分けがつくように名前を設定。Run, Test, Profile, ArchiveのBuild configurationをチェックする。
今回はRun, ArchiveのときにDevelopを向いてるようにしました。
以上の作業で基本的なDEV環境作成はできていて、別々のアプリとして認識することが可能となりました。
次からは見た目もわかりやすくしていく作業です。Product nameを変更
Targets -> Build Setting -> Product Nameから
$(TARGET_NAME)DEV
に変更。アプリのアイコンを変更
まずはDev用のAppIconを作成し、
AppIcon_dev
と命名します。
Targets -> Build Settings -> Asset Catalog App Icon Set Nameを開き、Developのところを、
AppIcon_dev
とします。
FirebaseのDev版作成
iOS開発において、分析や配布のためにFirebaseを使用しているケースは多々あると思います。
DEV環境を作った際にはFirebaseでもその対応をする必要があります。まずはFirebase上で、DevとReleaseでそれぞれプロジェクトを作成します。
その際にどちらもGoogleService-info.plistファイルを保存しておきます。
Targets -> Build Phase -> 左上のプラスボタンから新規でRun Scriptを作成します。
CONFIGURATIONに応じて、参照するGoogleService-Inforファイルを切り替えて、BUILT_PRODUCTS_DIRディレクトリにコピペしています。if [ "${CONFIGURATION}" == "Release" ]; then cp "${PROJECT_DIR}/${PROJECT_NAME}/GoogleService/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" else cp "${PROJECT_DIR}/${PROJECT_NAME}/GoogleService/GoogleService-Info-Develop.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" fiハマったところ
アプリ起動後、画面を読み込む部分でクラッシュしました。
原因はDEV環境内で、Storyboard内のUIViewControllerのModuleが本番環境を向いていることでした。
Inherit Module From Targetにチェックをつけると、Moduleを指定しなくても、よしなにやってくれるので、クラッシュする場合は該当のVCのこの箇所をチェックすると良いです。
参考
error: Could not get GOOGLE_APP_ID in Google Services file from build environment
これはFabric初期化のタイミングでGoogleService-Info.plistが生成されていないのが原因です。
Fabric導入した際に、"${PODS_ROOT}/Fabric/run"
をRun Scriptとして追加したと思いますが、Firebase ConfigurationのScriptはそれより前に実行されるようにしてください。
参考リンク
https://qiita.com/Todate/items/a2e6a26731c79bd23e02#%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3
https://qiita.com/KazaKago/items/aacf6eaec65b6d4244d0
- 投稿日:2020-04-04T22:41:32+09:00
Swift:ProtocolでDelegate作る時のTips
基本的な実装
protocol ClassADelegate: AnyObject { func call() } class ClassA { weak var delegate: ClassADelegate? func test() { delegate?.call() } } class ClassB { let a = ClassA() init() { a.delegate = self } } extension ClassB: ClassADelegate { func call() { Swift.print("Hello World") } }ポイント
- 0から自作のDelegateを作る時はAnyObjectをつける
- delegateのプロパティは
weak var
にする(強参照によるメモリリーク対策)すでに
Delegate
をもつクラスを拡張したDelegateを作る時protocol CustomeTextViewDelegate: NSTextViewDelegate { func call() } // NSTextView はすでにdelegateを持っている class CustomeTextView: NSTextView { private var customDelegate: CustomeTextViewDelegate? { return self.delegate as? CustomeTextViewDelegate } func test() { customDelegate?.call() } } class ClassA: NSView { let a = CustomeTextView() required init?(coder: NSCoder) { super.init(coder: coder) a.delegate = self } } extension ClassA: CustomeTextViewDelegate { func call() { Swift.print("Hello World") } }ポイント
self.delegate as? CustomeTextViewDelegate
のようにすでにあるdelegateをキャストする形で使う.キャストできた時だけ発動する仕組み.実装不要なDelegateメソッドを作りたい場合
パターンAprotocol ClassADelegate: AnyObject { func requiredFunc() func optionalFunc() } extension ClassADelegate { func optionalFunc() {} } class ClassA { weak var delegate: ClassADelegate? func callRequire() { delegate?.requiredFunc() } func callOptional() { delegate?.optionalFunc() } } class ClassB { let a = ClassA() init() { a.delegate = self } } extension ClassB: ClassADelegate { func requiredFunc() { Swift.print("Hello World") } // optionalFuncは実装しなくてもコンパイル通る }ポイント
extension
で一度空っぽの実装をしてしまう.パターンB@objc protocol ClassADelegate: AnyObject { func requiredFunc() @objc optional func optionalFunc() } class ClassA { weak var delegate: ClassADelegate? func callRequire() { delegate?.requiredFunc() } func callOptional() { delegate?.optionalFunc?() } } class ClassB { let a = ClassA() init() { a.delegate = self } } extension ClassB: ClassADelegate { func requiredFunc() { Swift.print("Hello World") } // optionalFuncは実装しなくてもコンパイル通る }ポイント
@objc
修飾詞をつける.ここによると,パターンAの方がSwiftらしくていいらしい.
- 投稿日:2020-04-04T21:59:06+09:00
iosアプリ開発 初心者
はじめに
これからiosアプリを開発していくにあたって日々学んだことをアウトプットしていきます。
少しでも参考になれたらと思います。Mac
AndroidアプリはMacとWindowsどちらでも開発可能ですが、iPhone用のアプリを開発するにはMacが必要です。
これからアプリを開発していこうと考えている方はMacのPCを
買うことをおすすめします。Xode
XcodeはAppleが無料で提供しているiosアプリ開発では王道のツールです。
iPhone、iPad、Mac、Apple Watchのアプリを開発できます。※XcodeはMacでのみ動作しますが、最新バージョンのXcodeをインストールするためには、MacのOSも最新バージョンである必要があります。
Swift
SwiftはAppleが開発した新しいプログラミング言語で2014年から使わています。
対象としているOSは、MacOSとiOSで、PhoneやiPadなどの端末で使えるアプリ、パソコン向けのアプリを開発することができます。
これまではObjective-C使われていましたが、スピード・安定性・コスト・メンテナンス面から考えるとSwiftが優れています。
- 投稿日:2020-04-04T20:46:42+09:00
Swift UITableViewの編集モードでのセル並び替え機能
canMoveRowAtを呼び、trueにする。
sample.swiftoverride func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { return true }moveRowAtクラスに並び替えの細かい操作を記入する。
sample.swiftoverride func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { //並び替え中に他に行いたい操作を書く(データの保存など) }上の2つのクラスどちらも呼び出さないと並び替えをすることは可能にならない。
canEditRowクラスを呼び出さなくても編集モード中に並び替えだけは可能になる。
- 投稿日:2020-04-04T17:04:08+09:00
Cocoapodsをmac(10.14.6)Mojavaにインストール
インストール方法
こちらの記事通りにCocoapodssのインストールを行います.
まず, 次のコマンドをターミナル上で実行します.sudo gem install -n /usr/local/bin cocoapodsすると, 私の環境では以下のエラーメッセージが出力されました.
Building native extensions. This could take a while... ERROR: Error installing cocoapods: ERROR: Failed to build gem native extension. current directory: /Library/Ruby/Gems/2.3.0/gems/ffi-1.12.2/ext/ffi_c /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -I /Library/Ruby/Site/2.3.0 -r ./siteconf20200403-30301-1n8idnk.rb extconf.rb mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/include/ruby.h extconf failed, exit code 1 Gem files will remain installed in /Library/Ruby/Gems/2.3.0/gems/ffi-1.12.2 for inspection. Results logged to /Library/Ruby/Gems/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.12.2/gem_make.outこのエラーの対処法を探るために「mkmf.rb can't find header files for ruby at」というキーワードで検索をかけました.
すると, こちらの記事を用いてエラーを解決できました.その手順を記します.まず, AppleDeveloperよりCommand Line Tools (macOS 10.14)for Xcode 10.2.1をダウンロードします. このリンクよりAppleIDでログインをすることでダウンロードできます. ダウンロードが完了したらダウンロードファイルを実行しインストールを完了させてください.
次に, 以下のコマンドをターミナル上で実行します.
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /次に, 以下のコマンドをターミナル上で実行します.
sudo gem install -n /usr/local/bin cocoapodsそして, 最後にCocoppodsをセットアップして完了です.
pod setup以上となります.
参考文献
[1]CocoaPodsを導入してみた
https://qiita.com/showylee/items/29220a8bd43fd76474d7
[2]MacOS(Mojave)でrailsをinstallしようとしてコケた
https://qiita.com/tzono/items/b80f6c343355a872dde6