- ニフクラmobile backendの機能『データストア』を学習するための問題集です
- ニフクラmobile backendの利用登録(無料)が必要です。
- 問題用プロジェクトにはオンラインランキング機能が実装されていない状態の「連打ゲーム」です
- 既に実装済みのニフクラmobile backendを利用するための準備(SDK導入など)方法の詳細はこちらをご覧ください。
- 問題は2問あります
- 2問クリアすると「連打ゲーム」にオンラインランキング機能を実装したアプリが完成します
- 問題を取り組む上で必要な開発環境は以下です
- Mac OS 12.5.1 (Monterey)
- Xcode Version 14.0
- iPhone X (iOS 16)
▼問題用プロジェクト▼
- 上記リンクをクリックしてzipファイルをローカルに保存します
- zipファイルを解凍して、
SwiftFirstApp.xcworkspace
をダブルクリックしてXcodeでプロジェクトを開きます - アプリを実行し、「連打ゲーム」で遊んでみましょう
- 「Start」ボタンをタップします
- 「3」,「2」,「1」とカウントダウンし、「スタート!」から「タイムアップ!」の10秒間「◎」の部分がタップできるようになります
- 10秒間の間に何回タップできるかを競う単純なゲームです
- 10秒経つと名前を入力するアラートが表示されますので、入力し「OK」をクリックします
- 画面に名前とスコアが表示されます
※注意:問題に取り組む前の状態では「ランキングを見る」ボタンをタップしてもランキングは表示されません
- ニフクラmobile backendにログインしアプリの新規作成を行います
- アプリ名はわかりやすいものにしましょう。例)「renda」
- アプリが作成されるとAPIキーが2種類(アプリケーションキーとクライアントキー)発行されます
- 次で使用します。
AppDelegate.swift
を編集します- 先程ニフクラmobile backendのダッシュボード上で確認したAPIキーを貼り付けます
- それぞれ
YOUR_NCMB_APPLICATION_KEY
とYOUR_NCMB_CLIENT_KEY
の部分を書き換えます - このとき、ダブルクォーテーション(
"
)を消さないように注意してください!
GameViewController.swift
を開きます。下図のsaveScore
メソッドを編集し、引数のname
(アラートで入力した名前)とscore
(連打ゲームでタップした回数)の値をmBaaSに保存する処理をコーディングしてください
- データストアに保存先クラスを作成します
- クラス名は「
GameScore
」としてください name
を保存するフィールドを「name
」、score
を保存するフィールドを「score
」として保存してください
- ニフクラmobile backendのiOSドキュメントはObjective-Cで書かれていますので、Swiftに書き換えたものを用意しました
問題1のコーディングが完了したら、下記の作業を行います
【作業1-1】それぞれ該当する箇所に以下の処理を追記して、実行時にXcode上にログを表示できるようにします
- 保存に失敗した場合の処理を行う箇所に追記
// 保存に失敗した場合の処理
print("エラーが発生しました。エラーコード:\(error.code)")
- 保存に成功した場合の処理を行う箇所に追記
// 保存に成功した場合の処理
print("保存に成功しました。objectId:\(obj.objectId)")
【作業1-2】シミュレーターで実行、「Start」ボタンを押してゲームを遊びます
-
名前を入力し、「OK」がクリックされると【問題1】で作成した
saveScore
メソッドが呼ばれ、データが保存されます -
このとき下記のいずれかのログが出力されます
-
「
保存に成功しました。objectId:************
」の場合は保存成功です -
「
エラーが発生しました。エラーコード:************
」の場合は保存失敗です
※エラーコードが出た場合はこちらで確認できます
▼答えはこちら▼
RankingViewController.swift
を開きます。下図のcheckRanking
メソッドを編集し、データストアのGameScore
クラスに保存したname
とscore
のデータをscore
の降順(スコアの高い順)で検索・取得する処理をコーディングしてください
- 検索データ件数は5件とします
- ただし、この値は「
rankingNumber
」としてフィールドに設定しているため、「5
」の代わりに「Int32(rankingNumber)
」を使用して設定してください
- ニフクラmobile backendのiOSドキュメントはObjective-Cで書かれていますので、Swiftに書き換えたものを用意しました
- Swiftでデータベースを使おう!③(ランキングを作る・アクセス権限)
問題2のコーディングが完了したら、下記の作業を行います
【作業2-1】該当する箇所に以下の処理を追記して、実行時にXcode上にログを表示できるようにします
- 検索に失敗した場合の処理を行う箇所に追記
// 検索に失敗した場合の処理
print("検索に失敗しました。エラーコード:\(error.code)")
- 検索に成功した場合の処理を行う箇所に追記
// 検索に成功した場合の処理
print("検索に成功しました。")
【作業2-2】シミュレーターで実行し、「ランキングを見る」ボタンをタップします
-
画面起動後、
checkRanking
メソッドが呼ばれ、【問題1】で保存されたデータが検索・取得されます -
このとき下記のいずれかのログが出力されます
-
「
検索に成功しました。
」が表示された場合は検索成功です -
「
検索に失敗しました。エラーコード:************
」が表示された場合は検索失敗です
※エラーコードが出た場合はこちらで確認できます
- 検索の状態(成功・失敗)に関係なく、「ランキングを見る」ボタンをタップしても、まだランキングは表示されません
【作業2-3】検索に成功したら、該当する箇所に以下の処理を追記して、取得した値から必要なデータを取り出し、ランキング画面へ反映させます
- 検索に成功した場合の処理を行う箇所に追記
// 取得したデータを格納
self.rankingArray = objects as! Array
// テーブルビューをリロード
self.rankingTableView.reloadData()
【作業2-4】シミュレーターで実行、「ランキングを見る」ボタンを押します
- 先ほどのスコアが表示されれば完成です!おめでとうございます★
▼答えはこちら▼
- 問題の回答を実装した完全なプロジェクトをご用意しています
▼完成版プロジェクト▼
- APIキーを設定してご利用ください