20200404のSwiftに関する記事は5件です。

iOS開発でDEV環境を構築する

iOSアプリを運用していくにあたって、アプリの配布やサーバーサイドとの連携は必須となります。
その際にクライアント側でDevやStaging、Releaseなど環境を使い分けたいケースは必ず出てきます。
今回はXcode上でDev環境を作る一連の流れをまとめてみました。
複数の環境を追加したい場合もこの流れで同じことを繰り返していけば良いので、簡単です。

この記事ではConfigrationを変更することで、DEV環境を作ります。
他にもTargetsを増やす方法やxcconfigファイルを使用する方法もあるので、チェックしてみてください。

ProjectのConfigurationのNameをDebug -> Developに変更

単純にリネームです。
3つ以上環境使い分けたいケースでは、ここで追加をしてください。

スクリーンショット 2020-03-30 22.19.53.png

Preprocessor Marcos(Project -> Build Setting)で、DEBUG=1 -> Develop=1に変更

スクリーンショット 2020-03-30 22.23.40.png

Other Swift flagの設定

#if DEVELOP とかできるようにするために行う。
-D <flag名>の形式で設定する。
複数やる場合は、-D <flag名> -D <flag名>

スクリーンショット 2020-03-30 22.30.10.png

DEV sheme作成

sheme選択画面でDEV版が選べるようになります。
↓こんな感じ。

スクリーンショット 2020-03-30 22.43.06.png

Manage schemeを選択。

該当プロジェクトを選んで、Editボタンをクリック。
スクリーンショット 2020-03-30 22.35.24.png

Duplicate schemeをクリックして、既存のshemeを複製。
スクリーンショット 2020-03-30 22.35.40.png

名前がcopy of <プロジェクト名>となっていると思うので、本番と見分けがつくように名前を設定。

スクリーンショット 2020-03-30 22.38.32.png

Run, Test, Profile, ArchiveのBuild configurationをチェックする。
今回はRun, ArchiveのときにDevelopを向いてるようにしました。
スクリーンショット 2020-03-30 22.39.43.png

Product Bundle Identifierを変更
スクリーンショット 2020-03-30 22.50.54.png

以上の作業で基本的なDEV環境作成はできていて、別々のアプリとして認識することが可能となりました。
次からは見た目もわかりやすくしていく作業です。

Product nameを変更

ここでアプリのアイコンの名前を変更することができます。
スクリーンショット 2020-03-31 4.11.03.png

Targets -> Build Setting -> Product Nameから$(TARGET_NAME)DEVに変更。

スクリーンショット 2020-03-30 23.20.33.png

アプリのアイコンを変更

まずはDev用のAppIconを作成し、AppIcon_devと命名します。
スクリーンショット 2020-04-04 22.26.39.png

Targets -> Build Settings -> Asset Catalog App Icon Set Nameを開き、Developのところを、AppIcon_devとします。
スクリーンショット 2020-04-04 22.28.55.png

アイコンが切り替わりました!
スクリーンショット 2020-04-04 22.31.34.png

FirebaseのDev版作成

iOS開発において、分析や配布のためにFirebaseを使用しているケースは多々あると思います。
DEV環境を作った際にはFirebaseでもその対応をする必要があります。

まずはFirebase上で、DevとReleaseでそれぞれプロジェクトを作成します。
その際にどちらもGoogleService-info.plistファイルを保存しておきます。
スクリーンショット_2020-04-04_22_09_01.png

こんな感じで名前を変えて、配置します。
スクリーンショット 2020-04-04 22.12.59.png

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

スクリーンショット 2020-04-04 22.32.38.png

ハマったところ

アプリ起動後、画面を読み込む部分でクラッシュしました。
原因はDEV環境内で、Storyboard内のUIViewControllerのModuleが本番環境を向いていることでした。
Inherit Module From Targetにチェックをつけると、Moduleを指定しなくても、よしなにやってくれるので、クラッシュする場合は該当のVCのこの箇所をチェックすると良いです。
参考
スクリーンショット 2020-03-31 4.15.44.png

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はそれより前に実行されるようにしてください。
スクリーンショット_2020-04-05_1_13_06.png

参考リンク

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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メソッドを作りたい場合

パターンA
protocol 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らしくていいらしい.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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が優れています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift UITableViewの編集モードでのセル並び替え機能

canMoveRowAtを呼び、trueにする。

sample.swift
override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        return true
    }

moveRowAtクラスに並び替えの細かい操作を記入する。

sample.swift
override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
     //並び替え中に他に行いたい操作を書く(データの保存など)
        }

上の2つのクラスどちらも呼び出さないと並び替えをすることは可能にならない。
canEditRowクラスを呼び出さなくても編集モード中に並び替えだけは可能になる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む