iOSアプリのバックエンドを構築するには?
iOSアプリは、ウェブアプリケーションと同様に、データを保存し追跡する何らかの方法が必要だ。そのデータがクラウドのバックエンド・サービスに保存されるにせよ、個人でローカルに構築したサーバーに保存されるにせよ、バックエンドはユーザー・データを管理するために不可欠だ。
しかし、iOSアプリのバックエンドをゼロから構築するのは、特にiOS開発やバックエンド開発に慣れていない場合、大変な作業になる可能性があります。
このチュートリアルでは、iOSアプリのバックエンドを構築する方法を学びます。最初にiOS開発の概要を説明し、その利点と限界について説明します。
次に、様々なバックエンドの選択肢を探ります。最後に、BaaS(Backend as a Service)であるBack4AppをiOSアプリのバックエンドとして使用する方法を学びます。
Contents
iOSの概要
アップルは、iPhone、iPad、iPod Touchの各デバイスに搭載されるモバイルアプリケーションを動かすための主要なオペレーティングシステムとしてiOSを開発した。
iOSアプリは、Objective-Cと、最近ではSwiftという2つのプログラミング言語を使って書かれる。
Objective-Cは、2014年にSwiftが導入されるまでは、iOSアプリ開発に使われていた主要言語だった。Swiftは、よりモダンでユーザーフレンドリーな言語として設計され、型推論や オプショナルなどの機能により、読み書きが容易になった。
両方の言語を同じプロジェクトで使うことができる。Swiftのドキュメントによれば、SwiftはObjective-Cと互換性があるように設計されており、既存のObjective-Cのレガシーコードとやりとりするために使用することができるからだ。
iOSアプリをビルドするために、AppleはXcodeという統合開発環境(IDE)を提供しており、そこでコードを書いたり、ビルドしたり、iOSアプリを開発したりすることができます。
iOSアプリケーション開発のメリット
開発者として、iOSアプリを作ることは次のような点で有益である:
質の高いユーザー・エクスペリエンス
iOSアプリは、ユーザーが魅力的で使いやすいと感じる直感的で洗練されたデザインで、その卓越したユーザーエクスペリエンスで知られている。
シンプルさ、わかりやすさ、一貫性を重視し、最高のユーザーエクスペリエンスを実現するために特定のアプリ設計ガイドラインを作成しています。その結果、ユーザーが必要なものを簡単に見つけ、素早くタスクを完了できるようなコントロールやレイアウトを備えた、視覚的に魅力的なアプリが出来上がるのです。
さらにAppleは、デベロッパが最高の品質基準を満たすアプリケーションを作成できるよう、包括的なデザインツールやリソースを提供しています。
iOSアプリはまた、アップル社製デバイスの特定のハードウェアとソフトウェアに最適化されているため、高速なパフォーマンス、スムーズなアニメーション、高品質のグラフィックスを実現しています。
より良いセキュリティ
iOSアプリケーションのもう一つの大きな利点は、提供されるセキュリティのレベルです。これはいくつかの要因によるもので、主にAppleの厳格なApp Store審査プロセス、強力な暗号化、プライバシー重視の機能などが挙げられます。
App Storeの審査プロセスは、すべてのApp Storeアプリケーションが厳格なコンテンツおよびセキュリティガイドラインを満たしていることを確認するために設計されています。これには、悪質なコード、マルウェア、その他の潜在的なセキュリティ脅威のチェックも含まれます。
その結果、iOSアプリに有害なコードが含まれていたり、フィッシング攻撃やその他の悪質な行為に使われたりする可能性は低くなる。
デバイス間の一貫性
iOSアプリは、iPhone、iPad、iPod Touchなど、すべてのアップル製デバイスで同じように見え、機能するように設計されています。
この一貫性により、ユーザーは新しいユーザー・インターフェースやナビゲーション・システムを習得する必要なく、異なるデバイス間で簡単に移行することができます。また、アプリ開発者は、互換性の問題やデバイス固有の機能を心配することなく、すべてのデバイスでシームレスに動作するアプリを設計・構築できます。
開発ツール
Appleは、iOSアプリケーションの開発、テスト、デバッグを容易にする強力なツールをiOSデベロッパに提供しています。
これらのツールには、iOS SDK、Xcode、その他さまざまなツールやリソースが含まれ、開発者のエクスペリエンスと構築されるアプリの品質を最適化するのに役立ちます。
iOSアプリケーション開発の限界
iOSの開発経験は完璧ではありません。iOSアプリを開発する際に経験する制限があります。その中には以下のようなものがあります。
限られたデバイスの互換性
iOSアプリの開発で直面する大きなフラストレーションは、デバイスの互換性の狭さだ。今日の世界には、さまざまなモバイル・デバイス・メーカーがあり、同じようにさまざまな熱心なユーザーがいます。
しかし、iOSアプリケーションはアップル独自のハードウェア上でのみ動作する。つまり、アプリはiPhone、iPad、iPod Touchデバイス上でのみ使用できる。このため、あなたが作ったアプリの潜在的な利用者は限られ、アップルのエコシステムに限定される。
アップルは多くのユーザーを抱えているが、iOSアプリケーションのデバイス互換性が限定的であることは、アップル以外の幅広いユーザーにリーチしようとする場合、不利になる可能性がある。
App Storeの承認プロセス
アップルのApp Storeの審査は厳しいことで知られており、Google Playなど他のアプリストアよりも時間がかかることがある。
審査プロセスは、App Storeにあるすべてのアプリが、品質、安全性、コンテンツに関するAppleのガイドラインを満たしていることを保証するために設計されています。しかし、審査には膨大な時間がかかるため、アプリの公開を遅らせることになります。
閉鎖生態系
Appleはデバイスのハードウェアとソフトウェアを厳しく管理しているため、iOSデバイスではAppleが承認したソフトウェアとハードウェアしか使用できません。クローズドなエコシステムは、カスタマイズの可能性を制限し、アプリのユーザーにもっと柔軟性を提供したい場合に障壁となります。
この閉鎖的なシステムは、開発者がサードパーティのサービスやAPIと統合することを難しくする。
iOSアプリケーションのバックエンドオプション
iOSアプリケーションを開発することの利点と限界がわかったところで、iOSアプリケーションで利用可能なさまざまなバックエンドオプションを理解する必要があります。
IaaS
IaaS(Infrastructure as a Service)とは、クラウド・コンピューティング・モデルの一つで、サードパーティーのプロバイダーが、個人用ソフトウェアを実行するために仮想化されたコンピューティング・リソースを必要とするユーザーにインターネット経由で提供するものである。
IaaSの利用は、サードパーティのプロバイダーから仮想コンピュータをレンタルするようなものだ。コンピュータを購入して保管する代わりに、プロバイダーがホスティングしているコンピュータにインターネット経由でアクセスできる。
このコンピュータは、実際のコンピュータを仮想的に表現したもので、ストレージ容量、処理能力、メモリなどの機能を備えた独自の仮想コンピューティング環境を構築するための基本的なインフラがすべて提供されている。
物理的なハードウェアやメンテナンスの心配をすることなく、独自のソフトウェアやアプリケーションを実行することができる。
IaaSを利用すれば、必要に応じてスケールアップやスケールダウンができ、利用した分だけ料金を支払うことができる。IaaSサービスの例としては、Amazon Web Services(AWS)、Microsoft Azure、Google Cloud Platformなどがある。
PaaS
PaaS(Platform as a Service)は、IaaSに似たもうひとつのクラウド・コンピューティング・モデルだ。PaaSプロバイダーは、最小限のカスタマイズで構成済みのプラットフォームを提供するため、アプリケーションの作成とデプロイが簡単かつ迅速になります。
IaaSとPaaSの主な違いは、基盤となるインフラに対するコントロールのレベルだ。
IaaSでは、プロバイダーがインターネット経由でサーバーやストレージなどの仮想化されたコンピューティングリソースを提供する。同時に、オペレーティング・システム、ミドルウェア、アプリケーションを含む仮想環境を完全にコントロールすることができます。
一方、PaaSの場合、プロバイダーはアプリケーションの開発とデプロイに必要なオペレーティング・システム、ミドルウェア、その他のソフトウェア・コンポーネントのための構成済みプラットフォームを提供する。PaaSプロバイダーが基盤となるインフラの面倒を見る間、ユーザーはアプリケーションの開発だけに集中すればよい。
PaaSサービスの例としては、Heroku、Google App Engine、Microsoft Azure App Serviceなどがある。
バース
Backend as a Service (BaaS)を使用すると、基盤となるインフラストラクチャを構築したり管理したりすることなく、クラウドバックエンドをアプリケーションに簡単に統合できます。
BaaSプロバイダーは、データベース、ユーザー認証、ファイルストレージ、サーバーレス機能、プッシュ通知など、PaaSやIaaSでは一般的に提供されないバックエンド・サービスを事前に構築して提供する。APIやSDKを通じて、これらのサービスをアプリケーションに統合することができる。
これにより、バックエンドのインフラを独自に構築・維持する必要がなくなり、アプリのフロントエンドの構築に集中することができます。BaaSサービスの例としては、Back4App、Firebase、8Baseなどがある。
iOSアプリケーションのバックエンド開発コストは?
iOSアプリのバックエンド開発は、時間、リソース、必要な人材など様々な要因によってコストが異なります。
バックエンドの構築と設定にかかる時間は、考慮すべき重要な要素です。バックエンドの構築に必要な時間は、アプリの機能の複雑さとバックエンドとアプリの統合によって異なります。
また、テスト、デバッグ、デプロイにさらに時間がかかる場合もある。アプリの機能が複雑であればあるほど、バックエンドの開発に時間がかかり、結果的にコストが上がる可能性があります。
バックエンドの開発に必要な人材も、コストに影響する重要な要素です。経験豊富な開発者の雇用と確保にはコストがかかり、トレーニングや開発にかかるコストはバックエンドの開発コスト全体に上乗せされる可能性があります。
iOSアプリのバックエンド開発コストは、Back4appのような既存のバックエンドソリューションを活用することで管理できる。
Back4appでiOSアプリのバックエンドを構築するには?
Back4AppはBackend as a Service (BaaS)プラットフォームで、モバイルアプリやウェブアプリ開発のためのバックエンドインフラが用意されています。データベース管理、ユーザー認証、プッシュ通知など、パワフルでスケーラブルなバックエンドインフラを提供します。
Back4AppがiOSアプリのバックエンドとして最適な理由はいくつかある。まず、シンプルでユーザーフレンドリーなインターフェイスを提供し、データやAPIを簡単に管理できる。
次に、開発プロセスの各ステップをガイドする包括的なドキュメントを提供しています。また、Back4App はスケーラブルなクラウドホスティングを提供し、アプリの大小を問わずあらゆるニーズに対応できるほか、ハイエンドのセキュリティ機能も備えています。
以下のステップを踏むことで、Back4Appを使ってiOSアプリのバックエンドを構築することができます。
ステップ1: Back4appの無料アカウントに登録する
iOSアプリのバックエンドインフラを作成するには、公式サイトから無料のBack4Appアカウントにサインアップしてください。Back4Appアカウントでは、iOSアプリのバックエンドを作成・設定し、そのバックエンドアプリから全てのデータ関連プロセスを管理することができます。
無料アカウントにサインアップするには、Back4Appのウェブサイトにアクセスし、Googleアカウント、GitHubアカウント、またはメールアドレスを使用してサインアップする。
ステップ2:新規アプリの作成
Back4Appアカウントを取得したら、ログインして新しいアプリを作成しましょう。アカウントページの右上にアプリを作成するためのボタンがあります。アプリのオプションとしてBackend as a Serviceを選択してください。
新しいアプリにふさわしい名前を付け、「作成」ボタンを押す。
Back4Appがアプリを作成し、ダッシュボードにナビゲートします。
ステップ3: iOSアプリをBack4appに接続する
次のステップはiOSアプリをBack4Appバックエンドに接続することです。そのためにはParse SDKをiOSアプリにインストールする必要があります。アプリはこのSDKを使ってバックエンドに直接リンクします。
接続をセットアップする前に、動作するiOSアプリが必要です。前述したように、iOSアプリケーションは、アップルのソフトウェアを開発するためのアップルのIDEであるXcodeを使用して構築されます。
このガイドに従うには、Mac コンピュータにインストールされた Xcode の最新バージョン(バージョン 13.0.0 以降)が必要です。このガイドで使用するツールや機能のいくつかは、Xcode のこれらのバージョンでのみ利用可能です。
まずXcodeを起動し、新しいXcode iOSAppプロジェクトを作成します:
いくつかの設定情報とともにアプリの名前を記入するように促されます。選択したインターフェイスとしてSwiftUIを選択してください。
SwiftUI インターフェイスは、廃止された StoryBoard インターフェイスとは異なるビューシステムを使用します。その結果、現在のプロジェクト構造にはAppDelegate.swift
ファイルがありません。ガイドの後半で必要になるので、このファイルを作成する必要があります。
AppDelegate.swiftを
作成し、以下のコードをインポートします:
import SwiftUI
class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
return true
}
}
次に、ルート・プロジェクト・ファイルのApp
内で、以下のコードをコピーして一番上に貼り付ける:
@UIApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate
これで Parse SDK をインストールする準備ができました。Xcodeプロジェクト用のオープンソースの依存関係マネージャーであるCocoaPodsを使ってインストールします。まだインストールしていない場合は、CocoaPodsをインストールしてください。
まず、プロジェクト・ディレクトリ内のターミナルでpods init
コマンドを実行して、プロジェクト用のPodfileを初期化します。
生成されたPodfileをXcodeで開き、Parse SDKを指定します。
あなたのPodfileは次のようなものであるべきだ:
# Uncomment the next line to define a global platform for your project
#platform :ios, '13.0'
target 'ParseiOS-app' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for ParseiOS-app
pod 'Parse'
end
その後、Podfileに指定されたParse依存関係を使用して、プロジェクトにParse SDKをインストールできます。
ターミナルで以下のコマンドを実行する:
pod install
ポッドをインストールすると、プロジェクトは.xcworkspace という
拡張子を持つ新しいワークスペース・ファイルとして再構築されます。ここからは、再構築されたワークスペースで作業することになります。
プロジェクトに Parse SDK がインストールされました。
Podのインストールを実行すると、iOSバージョンのシミュレータ互換性エラーが発生することがあります。このような場合は、Podfileの最後にこの記述を追加してください:
post_install do |installer|
installer.generated_projects.each do |project|
project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
end
end
end
end
このコードスニペットは、Podfileのポストインストールフックで、CocoaPodsがPodをインストールし終わった後に、Xcodeプロジェクトのビルド設定を変更することができます。
この特定のポストインストーラは、iPhone OSの最小デプロイメントターゲットバージョンを12.0に設定します。新しいバージョンを['IPHONEOS_DEPLOYMENT_TARGET']
に割り当てることで、いつでも変更できます。
ここでもう一度ポッドをインストールする:
pod install
iOSアプリの接続を完了するには、Back4AppアプリのApp IDとクライアントキーをリンクする必要があります。これを行うには、ダッシュボードのApp Settingsから Server Settings > Core Settingsに移動します。
Core Settingsの中に、Back4Appバックエンド用に生成されたApp IDと
Client Keyが
あります。これらのキーをコピーして保存してください。
💡 💢 上の画像に示されているキーは、このガイドのために作られたテストアプリのものです。上記のキーはあなたのアプリでは機能しないので、必ずあなた専用のキーをコピーしてください。
次に、AppDelegate.swiftを
開き、didFinishLaunchingWithOptions
関数内の既存のコードを修正する。
あなたの関数は次のようになるはずだ:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
print("app launched!")
let configuration = ParseClientConfiguration {
$0.applicationId = "PASTE_YOUR_APPLICATION_ID_HERE"
$0.clientKey = "PASTE_YOUR_CLIENT_ID_HERE"
$0.server = "<https://parseapi.back4app.com>"
}
Parse.initialize(with: configuration))
return true
}
保存したApp ID
とClient Key
を指定のプレースホルダに貼り付けます。
そして、このファイルにParse SDKをインポートして、「モジュールが見つかりません」という
エラーを消去してください:
import Parse
アプリがBack4Appに接続されました!
ステップ4:バックエンドのテスト
このセクションでは、作成したiOSアプリをテストし、Back4Appサーバーと作成したアプリがやり取りできることを確認します。
Parse SDKを使用してCRUD操作のテストとデータの保存を行います。
テストの最後には、作成されたデータが正常に保存され、バックエンドアプリから読み込まれていることを確認できる。
バックエンドにデータを保存するには、Back4app内でクラスオブジェクトを作成します。デフォルトでは、新しいクラスは3つのフィールドを持つスキーマを持ちます:「objectId”、”createdAt”、”updatedAt “です。新しいフィールドやデータ行を追加することができます。
iOSアプリから新しいフィールドを作成し、作成したクラスに格納されているデータを読み込むことになります。
まず、ContentView.swiftの
中で、SwiftUIのすぐ下にあるParse SDKをインポートします:
import SwiftUI
import Parse
アプリがバックエンドとやりとりできることをテストするために、ユーザがスコアテキストを入力し、バックエンドに保存するためのUIを作成します。また、アプリはバックエンドにアクセスし、クラスからデータを取得し、保存されたスコアを表示することができます。
ContentView.swiftの
View構造体の一番上に、以下のような変更可能な状態プロパティを作成します:
@State private var newScore: Int = ""
@State private var scores: [PFObject] = []
これらのステート・プロパティは、その値が変更されるとビューの更新をトリガします。1つ目は、newScoreという
String
型のステートプロパティを宣言します。これは、新しいスコアのためにユーザによって入力された入力値を表します。これは空の文字列""
で初期化されます。
もうひとつは、[
PFObject
]
型のscoresという
ステート・プロパティを宣言している。これはバックエンドから取得したスコアを表す。
PFObject
クラスはParse-SDK-iOS
が提供するクラスオブジェクトで、データを保存することができます。オブジェクトのカスタムプロパティや値を定義し、バックエンドに保存することができます。
次に、VStack
要素の中に以下のコード・スニペットを追加する:
VStack {
TextField("EnterScore", text: $newScore)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
Button("Save Scores") {
saveScore()
}
List(scores, id: \\.objectId) { score in
Text(score["score"] as? String ?? "")
}
}
.padding()
.onAppear {
fetchScores()
}
ユーザーがスコアを入力するTextFieldが
あります。text
パラメータはnewScore
ステート変数にバインドされており、テキストフィールドの変更はnewScore
変数に反映されます。
次に、タップするとsaveScore()
関数が起動する “Save Scores “ボタンがある。
List
コンポーネントは、バックエンドから取得したスコアを表示します。score
配列を使用してリストを作成し、id
パラメータで各スコア項目の一意な識別子を指定します。リストの中には、スコアの値を文字列として表示するText
ビューがあります。
オプショナル・チェイニングとnil-coalescing演算子(?
最後に、onAppear
モディファイアは、VStackビューが表示されたときにfetchScores()
関数をトリガするために使用されます。
この時点で、saveScores()
とfetchScores()
が見つからないというエラーが出るはずです。
次にこれらの関数を作成する。これらの関数は、リンクしているBack4appのバックエンドアプリからのデータの書き込み、保存、フェッチをそれぞれ処理します。
.save()
またはsaveInBackground()
メソッド呼び出しを使用して、newScore
変数をバックエンドに保存します:
func saveScore() {
let score = PFObject(className: "GameScore")
score["score"] = newScore
score.saveInBackground { success, error in
if let error = error {
print("Error saving score: \\(error.localizedDescription)")
} else {
print("Score saved sucessfully: \\(String(describing: score.objectId))")
newScore = ""
fetchScores()
}
}
}
まず、”GameScore “というクラス名のPFObjectの
インスタンスを作成します。このオブジェクトは、バックエンドデータベースの新しいエントリーを表します。次の行では、オブジェクトの “score “プロパティにnewScoreに
格納されている値をセットします。
次に、スコア
オブジェクトのsaveInBackground
メソッドを呼び出します。saveInBackgroundを
使用すると、バックグラウンドのキューで実行される非同期の保存操作が開始されます。完了クロージャの内部で、保存操作中にエラーが発生したかどうかをチェックし、エラーを処理します。
スコアの保存に成功したら、newScore
状態変数を空文字列にリセットしてテキストフィールドを消去します。次にfetchScores()
関数を呼び出して、得点のリストを更新します。
fetchScores()
関数の内部では、Parse のPFQuery を
使用してバックエンドのデータにクエリを実行し、特定のクラスからオブジェクトを取得します。この場合、そのクラスはGameScore
クラスです:
func fetchScores() {
let query = PFQuery(className: "GameScore")
query.findObjectsInBackground { objects, error in
if let error = error {
print("Error fetching scores: \\(error.localizedDescription)")
} else if let objects = objects {
scores = objects
}
}
}
ここでは、クエリオブジェクトのfindObjectsInBackground
メソッドを呼び出して、非同期フェッチ処理を開始します。完了クロージャの内部で、そのクエリの結果を処理できます。
フェッチ操作中にエラーが発生した場合は、エラーメッセージを表示します。そうでない場合、フェッチが成功しオブジェクトが返されると、フェッチされたオブジェクトでscore
状態変数を更新します。これらのオブジェクトはバックエンドから取得したスコアを表します。
アプリを実行して新しいスコアを入力し、Save Scoresボタンを押すと、アプリは新しいスコアの値をバックエンドに送信して保存し、保存されているすべてのスコアを取得します。すると下の画像のようにスコアのリストが表示されます。
スコアがバックエンドのスコア値とどのように対応しているかに注目してください。
これでテストに合格し、Back4Appバックエンドからのデータの書き込みと読み出しに成功したことが確認できます。
Back4AppとSwiftプログラミング言語を使って、iOSモバイルアプリのバックエンドを構築する方法がわかりました。