Swiftpack.co - NIFCLOUD-mbaas/ncmb_swift as Swift Package

Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
NIFCLOUD-mbaas/ncmb_swift
ニフクラ mobile backend Swift SDK
.package(url: "https://github.com/NIFCLOUD-mbaas/ncmb_swift.git", from: "v1.2.1")

ニフクラ mobile backend Swift SDKについて

概要

ニフクラ mobile backend Swift SDKは、 モバイルアプリのバックエンド機能を提供するクラウドサービス ニフクラ mobile backend用の Swift SDK です。

  • プッシュ通知
  • データストア
  • 会員管理
  • ファイルストア
  • SNS連携(Sign In With Apple, Facebookのみ)

といった機能をアプリから利用することが可能です。

このSDKを利用する前に、ニフクラ mobile backendのアカウントを作成する必要があります。

動作環境

  • Swift version 4.2
  • iOS 10.x ~ iOS 14.x
  • Xcode 9.x ~ Xcode 12.x
  • armv7s, arm64, arm64e アーキテクチャ
  • iOS/Xcodeのバージョンに依って対応が必要となる可能性があります。詳細はニフクラ mobile backendのドキュメントをご覧ください。

※ 動作確認バージョン、開発環境につきましては今後、順次拡大する予定です。

テクニカルサポート窓口対応バージョン

テクニカルサポート窓口では、1年半以内にリリースされたSDKに対してのみサポート対応させていただきます。
定期的なバージョンのアップデートにご協力ください。
※なお、mobile backend にて大規模な改修が行われた際は、1年半以内のSDKであっても対応出来ない場合がございます。
その際はinformationブログにてお知らせいたします。予めご了承ください。

  • v1.1.0 ~ (※2021年9月時点)

現在未実装部分について

以下の機能につきましては現在実装中です。今後順次、提供いたします。

  • クエリ
    • 副問い合わせ
    • 位置情報検索
  • プッシュ通知
    • 位置情報連動配信
  • 会員管理
    • SNS認証(Sign In With Apple, Facebook以外)
    • メールアドレス確認

ライセンス

このSDKのライセンスについては、LICENSEファイルをご覧ください。

SDK開発者向け資料

このSDKの開発者向け資料として、FORDEVELOPER.md を用意しております。 SDKの改修をされる際には、ご一読ください。

参考URL集

サンプル

初期化

    NCMB.initialize(
        applicationKey: /* アプリケーションキー */,
        clientKey: /* クライアントキー */)

データストア

オブジェクトをデータストアに保存する

    // testクラスのNCMBObjectを作成
    let object : NCMBObject = NCMBObject(className: "test")

    // オブジェクトに値を設定
    object["fieldA"] = "Hello, NCMB!"
    object["fieldB"] = "日本語の内容"
    object["fieldC"] = 42
    object["fieldD"] = ["abcd", "efgh", "ijkl"]

    // データストアへの登録を実施
    object.saveInBackground(callback: { result in
        switch result {
            case .success:
                // 保存に成功した場合の処理
                print("保存に成功しました")
            case let .failure(error):
                // 保存に失敗した場合の処理
                print("保存に失敗しました: \(error)")
        }
    })

オブジェクトの取得

    // testクラスへのNCMBObjectを設定
    let object : NCMBObject = NCMBObject(className: "test")

    // objectIdプロパティを設定
    object.objectId = "Mz6xym6wNi63lxb8"

    object.fetchInBackground(callback: { result in
        switch result {
            case .success:
                // 取得に成功した場合の処理
                print("取得に成功しました")
                if let fieldB : String = object["fieldB"] {
                    print("fieldB value: \(fieldB)")
                }
            case let .failure(error):
                // 取得に失敗した場合の処理
                print("取得に失敗しました: \(error)")
        }
    })

オブジェクトの更新

保存済み(または、objectIdを持っている)のオブジェクトに新しい値をセットして saveInBackground メソッドを実行することでデータストアの値が更新されます。

データストアに対しての操作を設定する

    // testクラスのNCMBObjectを作成
    let object : NCMBObject = NCMBObject(className: "test")

    // objectIdプロパティを設定
    object.objectId = "Mz6xym6wNi63lxb8"

    // 指定したフィールドの値をインクリメントする(すでに該当フィールドに値が存在する場合にのみ更新可能)
    object["fieldC"] = NCMBIncrementOperator(amount: 1)
    // 指定したフィールドの配列内で重複しなければ追加する
    object["fieldD"] = NCMBAddUniqueOperator(elements: ["food", "fish"])

    // データストアへの更新を実施
    object.saveInBackground(callback: { result in
        switch result {
            case .success:
                // 更新に成功した場合の処理
                print("更新に成功しました")
            case let .failure(error):
                // 更新に失敗した場合の処理
                print("更新に失敗しました: \(error)")
        }
    })

オブジェクトの削除

    // testクラスのNCMBObjectを作成
    let object : NCMBObject = NCMBObject(className: "test")

    // objectIdプロパティを設定
    object.objectId = "Mz6xym6wNi63lxb8"

    // データストアから削除
    object.deleteInBackground(callback: { result in
        switch result {
            case .success:
                print("削除に成功しました")
            case let .failure(error):
                print("削除に失敗しました: \(error)")
        }
    })

オブジェクトの関連付け

  • TBD

リレーション

ポインタは1つのオブジェクトへの参照しか持つことができませんが、 リレーションを利用することで、特定クラスの複数オブジェクトと関連づけることが可能です。 リレーションを追加・削除する場合は、それぞれ NCMBAddRelationOperatorNCMBRemoveRelationOperator という構造体を使用します。 リレーションの取得には NCMBRelation を使用します。

リレーションの新規作成
// testクラスへのNCMBObjectを設定
let object : NCMBObject = NCMBObject(className: "test")
let pointerA = NCMBPointer(className: "test", objectId: "84lywBlhwuA8SeUo")
let pointerB = NCMBPointer(className: "test", objectId: "SqG3oH0tgXx50hT7")

object["NewRelation"] = NCMBAddRelationOperator(elements: [pointerA, pointerB])

// データストアへの登録を実施
object.saveInBackground(callback: { result in
    switch result {
    case .success:
        // 保存に成功した場合の処理
        print("保存に成功しました")
    case let .failure(error):
        // 保存に失敗した場合の処理
        print("保存に失敗しました: \(error)")
    }
})
リレーションの追加
// testクラスへのNCMBObjectを設定
let object : NCMBObject = NCMBObject(className: "test")
let pointerC = NCMBPointer(className: "test", objectId: "2tEvocmtRTllMgQT")

// objectIdプロパティを設定
object.objectId = "ATfLxBq683MF3zy9"

object["NewRelation"] = NCMBAddRelationOperator(elements: [PointerC])

// データストアへの登録を実施
object.saveInBackground(callback: { result in
    switch result {
    case .success:
        // 保存に成功した場合の処理
        print("保存に成功しました")
    case let .failure(error):
        // 保存に失敗した場合の処理
        print("保存に失敗しました: \(error)")
    }
})
リレーションの削除
// testクラスへのNCMBObjectを設定
let object : NCMBObject = NCMBObject(className: "test")
let pointerC = NCMBPointer(className: "test", objectId: "2tEvocmtRTllMgQT")

// objectIdプロパティを設定
object.objectId = "ATfLxBq683MF3zy9"

object["NewRelation"] = NCMBRemoveRelationOperator(elements: [PointerC])

// データストアへの登録を実施
object.saveInBackground(callback: { result in
    switch result {
    case .success:
        // 保存に成功した場合の処理
        print("保存に成功しました")
    case let .failure(error):
        // 保存に失敗した場合の処理
        print("保存に失敗しました: \(error)")
    }
})
リレーションの取得
// testクラスへのNCMBObjectを設定
let object : NCMBObject = NCMBObject(className: "test")

// objectIdプロパティを設定
object.objectId = "ATfLxBq683MF3zy9"

object.fetchInBackground(callback: { result in
    switch result {
    case .success:
        // 取得に成功した場合の処理
        print("取得に成功しました")
        if let relation : NCMBRelation = object["NewRelation"] {
            print("relation value: \(relation)")
        }
    case let .failure(error):
        // 取得に失敗した場合の処理
        print("取得に失敗しました: \(error)")
    }
})

オブジェクトの検索を行う

    // クエリの作成
    var query : NCMBQuery<NCMBObject> = NCMBQuery.getQuery(className: "test")
    // フィールドの値が 42 と一致
    query.where(field: "fieldC", equalTo: 42)

    // 検索を行う
    query.findInBackground(callback: { result in
        switch result {
            case let .success(array):
                print("取得に成功しました 件数: \(array.count)")
            case let .failure(error):
                print("取得に失敗しました: \(error)")
        }
    })

標準クラスを検索する場合

    // 会員管理
    let userQuery : NCMBQuery<NCMBUser> = NCMBUser.query

    // ロール
    let roleQuery : NCMBQuery<NCMBRole> = NCMBRole.query

    // ファイルストレージ
    let fileQuery : NCMBQuery<NCMBFile> = NCMBFile.query

    // 配信端末
    let installationQuery : NCMBQuery<NCMBInstallation> = NCMBInstallation.query

    // プッシュ通知
    let pushQuery : NCMBQuery<NCMBPush> = NCMBPush.query

クエリの合成

and検索

    // クエリの作成
    var query = NCMBQuery.getQuery(className: "test")
    query.where(field: "fieldA", equalTo: "Hello, NCMB!")
    query.where(field: "fieldC", greaterThanOrEqualTo: 40)

    // 検索を行う
    query.findInBackground(callback: { result in
        switch result {
            case let .success(array):
                print("取得に成功しました 件数: \(array.count)")
            case let .failure(error):
                print("取得に失敗しました: \(error)")
        }
    })

or検索

    // 一つ目のクエリの作成
    var query1 = NCMBQuery.getQuery(className: "test")
    query1.where(field: "fieldB", equalTo: "日本語の内容")

    // 二つ目のクエリの作成
    var query2 = NCMBQuery.getQuery(className: "test")
    query2.where(field: "fieldC", lessThan: 50)

    // OR検索を行うためにクエリを合成する
    let query = NCMBQuery.orQuery(query1, query2)

    // 検索を行う
    query.findInBackground(callback: { result in
        switch result {
            case let .success(array):
                print("取得に成功しました 件数: \(array.count)")
            case let .failure(error):
                print("取得に失敗しました: \(error)")
        }
    })

プッシュ通知

配信端末情報の登録

AppDelegate.swift 内に記述

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

        // 配信端末インスタンスの作成
        let installation : NCMBInstallation = NCMBInstallation.currentInstallation

        // デバイストークンの設定
        installation.setDeviceTokenFromData(data: deviceToken)

        // 配信端末の登録
        installation.saveInBackground(callback: { result in
            switch result {
                case .success:
                    print("保存に成功しました")
                case let .failure(error):
                    print("保存に失敗しました: \(error)")
                    return;
            }
        })
    }

プッシュ通知をアプリから送信する

    // プッシュ通知オブジェクトの作成
    let push : NCMBPush = NCMBPush()
    // メッセージの設定
    push.message = "プッシュ通知です"
    // iOS端末を送信対象に設定する
    push.isSendToIOS = true
    // android端末を送信対象に設定する
    push.isSendToAndroid = true
    // 即時配信を設定する
    push.setImmediateDelivery()

    // プッシュ通知を配信登録する
    push.sendInBackground(callback: { result in
        switch result {
            case .success:
                print("登録に成功しました。プッシュID: \(push.objectId!)")
            case let .failure(error):
                print("登録に失敗しました: \(error)")
                return;
        }
    })

プッシュ通知のスケジューリング

    // プッシュ通知オブジェクトの作成
    let push : NCMBPush = NCMBPush()
    // メッセージの設定
    push.message = "プッシュ通知です"
    // iOS端末を送信対象に設定する
    push.isSendToIOS = true
    // android端末を送信対象に設定する
    push.isSendToAndroid = true
    // 配信時刻を設定する
    let formatter : DateFormatter = DateFormatter()
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    formatter.timeZone = TimeZone(secondsFromGMT: 0)
    push.deliveryTime = formatter.date(from: "2020-07-24T10:10:01.964Z")

    // プッシュ通知を配信登録する
    push.sendInBackground(callback: { result in
        switch result {
            case .success:
                print("登録に成功しました。プッシュID: \(push.objectId!)")
            case let .failure(error):
                print("登録に失敗しました: \(error)")
                return;
        }
    })

配信端末の絞り込み

   // プッシュ通知オブジェクトの作成
   let push : NCMBPush = NCMBPush()
   // メッセージの設定
   push.message = "プッシュ通知です"
   push.action = "ReceiveActivity"
   push.title = "testPush"
   // android端末を送信対象に設定する
   push.isSendToAndroid = true
   // 即時配信を設定する
   push.setImmediateDelivery()

   var query : NCMBQuery<NCMBInstallation> = NCMBInstallation.query
   //installationクラス(端末情報)に独自フィールドtakanokunに持っている値が ["d", "e", "f"] 配列に入っているデータを検索する条件を設定
   var searchStringsArray: [String] = ["d", "e", "f"]
   query.where(field: "takanokun", containedIn:  searchStringsArray)
   push.searchCondition = query

   push.sendInBackground(callback: { result in
       switch result {
       case .success:
           print("登録に成功しました。プッシュID: \(push.objectId!)")
       case let .failure(error):
           print("登録に失敗しました: \(error)")
           return;
       }
   })

会員管理

ユーザーの新規登録

    // Userインスタンスの生成
    let user = NCMBUser()

    // ユーザー名・パスワードを設定
    user.userName = "takanokun"
    user.password = "openGoma"

    // ユーザーの新規登録
    user.signUpInBackground(callback: { result in
        switch result {
            case .success:
                // 新規登録に成功した場合の処理
                print("新規登録に成功しました")
            case let .failure(error):
                // 新規登録に失敗した場合の処理
                print("新規登録に失敗しました: \(error)")
        }
    })

会員登録用のメールを要求する

    // 会員登録用メールを要求する
    let result = NCMBUser.requestAuthenticationMailInBackground(mailAddress: "takanokun@example.com", callback: { result in
        switch result {
            case .success:
                // 会員登録用メールの要求に成功した場合の処理
                print("会員登録用メールの要求に成功しました")
            case let .failure(error):
                // 会員登録用のメール要求に失敗した場合の処理
                print("会員登録用メールの要求に失敗しました: \(error)")
        }
    })

ログイン

ユーザー名、パスワードでのログイン

    // ログイン状況の確認
    if let user = NCMBUser.currentUser {
        print("ログインしています。ユーザー: \(user.userName!)")
    } else {
        print("ログインしていません")
    }

    // ログイン
    NCMBUser.logInInBackground(userName: "takanokun", password: "openGoma", callback: { result in
        switch result {
            case .success:
                // ログインに成功した場合の処理
                print("ログインに成功しました")

                // ログイン状況の確認
                if let user = NCMBUser.currentUser {
                    print("ログインしています。ユーザー: \(user.userName!)")
                } else {
                    print("ログインしていません")
                }

            case let .failure(error):
                // ログインに失敗した場合の処理
                print("ログインに失敗しました: \(error)")
        }
    })

メールアドレス、パスワードでのログイン

    // ログイン状況の確認
    if let user = NCMBUser.currentUser {
        print("ログインしています。ユーザー: \(user.userName!)")
    } else {
        print("ログインしていません")
    }

    // ログイン
    NCMBUser.logInInBackground(mailAddress: "takanokun@example.com", password: "openGoma", callback: { result in
        switch result {
            case .success:
                // ログインに成功した場合の処理
                print("ログインに成功しました")

                // ログイン状況の確認
                if let user = NCMBUser.currentUser {
                    print("ログインしています。ユーザー: \(user.userName!)")
                } else {
                    print("ログインしていません")
                }

            case let .failure(error):
                // ログインに失敗した場合の処理
                print("ログインに失敗しました: \(error)")
        }
    })

ログアウト

    // ログイン状況の確認
    if let user = NCMBUser.currentUser {
        print("ログインしています。ユーザー: \(user.userName!)")
    } else {
        print("ログインしていません")
    }

    // ログアウト
    NCMBUser.logOutInBackground(callback: { result in
        switch result {
            case .success:
                // ログアウトに成功した場合の処理
                print("ログアウトに成功しました")

                // ログイン状況の確認
                if let user = NCMBUser.currentUser {
                    print("ログインしています。ユーザー: \(user.userName!)")
                } else {
                    print("ログインしていません")
                }

            case let .failure(error):
                // ログアウトに失敗した場合の処理
                print("ログアウトに失敗しました: \(error)")
        }
    })

パスワードのリセット

    // パスワードのリセット
    NCMBUser.requestPasswordResetInBackground(mailAddress: "takanokun@example.com", callback: { result in
        switch result {
            case .success:
                // パスワードのリセット処理登録に成功した場合の処理
                print("パスワードのリセット処理登録に成功しました")
            case let .failure(error):
                // パスワードのリセット処理登録に失敗した場合の処理
                print("パスワードのリセット処理登録に失敗しました: \(error)")
        }
    })

メールアドレス確認の有無

  • TBD

匿名認証

    // ログイン状況の確認
    if let user = NCMBUser.currentUser {
        print("ログインしています。ユーザー: \(user.userName!)")
    } else {
        print("ログインしていません")
    }

    // 匿名ユーザの自動生成を有効化
    NCMBUser.enableAutomaticUser()

    // 匿名ユーザーでのログイン
    let result = NCMBUser.automaticCurrentUserInBackground(callback: { result in
        switch result {
            case .success:
                // ログインに成功した場合の処理
                print("ログインに成功しました")

                // ログイン状況の確認
                if let user = NCMBUser.currentUser {
                    print("ログインしています。ユーザー: \(user.userName!)")

                    // 匿名ユーザーでログインしているかの確認
                    if NCMBAnonymousUtils.isLinked(user: user) {
                        print("匿名ユーザーです。")
                    } else {
                        print("匿名ユーザーではありません。")
                    }

                } else {
                    print("ログインしていません")
                }

            case let .failure(error):
                // ログインに失敗した場合の処理
                print("ログインに失敗しました: \(error)")
        }
    })

会員のグルーピング

ロールの作成
// ロールの作成
let freePlanRole : NCMBRole = NCMBRole.init(roleName: "freePlan");
freePlanRole.save();
let proPlanRole : NCMBRole = NCMBRole.init(roleName: "proPlan");
proPlanRole.save();
会員をロールに追加する
// ユーザーを作成
let user: NCMBUser = NCMBUser.init();
user.userName = "expertUser"
user.password = "pass"
user.signUp()
// 登録済みユーザーを新規ロールに追加
let role : NCMBRole = NCMBRole.init(roleName: "expertPlan");
role.addUserInBackground(user: user, callback: { result in
   switch result {
   case .success:
         print("保存に成功しました")
   case let .failure(error):
         print("保存に失敗しました: \(error)")
         return;
   }
})

ファイルストア

ファイルストアへのアップロード

    // アップロード対象のデータ
    let data : Data

    // ファイルオブジェクトの作成
    let file : NCMBFile = NCMBFile(fileName: "Takanokun.txt")

    // アップロード
    file.saveInBackground(data: data, callback: { result in
        switch result {
            case .success:
                print("保存に成功しました")
            case let .failure(error):
                print("保存に失敗しました: \(error)")
                return;
        }
    })

ファイルを取得する

    // ファイルオブジェクトの作成
    let file : NCMBFile = NCMBFile(fileName: "Takanokun.txt")

    // ファイルの取得
    file.fetchInBackground(callback: { result in
        switch result {
            case let .success(data):
                print("取得に成功しました: \(data)")
            case let .failure(error):
                print("取得に失敗しました: \(error)")
                return;
        }
    })

ファイルの削除

    // ファイルオブジェクトの作成
    let file : NCMBFile = NCMBFile(fileName: "Takanokun.txt")

    // ファイルの削除
    file.deleteInBackground(callback: { result in
        switch result {
            case .success:
                print("削除に成功しました")
            case let .failure(error):
                print("削除に失敗しました: \(error)")
                return;
        }
    })

スクリプト

スクリプト実行

    // スクリプトインスタンスの作成
    let script = NCMBScript(name: "myCoolScript.js", method: .get)

    // スクリプトの実行
    script.executeInBackground(headers: [:], queries: ["name": "foo"], body: [:], callback: { result in
        switch result {
            case let .success(data):
                print("scriptSample 実行に成功しました: \(data)")
            case let .failure(error):
                print("scriptSample 実行に失敗しました: \(error)")
                return;
        }
    })

GitHub

link
Stars: 8
Last commit: 5 days ago

Ad: Job Offers

iOS Software Engineer @ Perry Street Software
Perry Street Software is Jack’d and SCRUFF. We are two of the world’s largest gay, bi, trans and queer social dating apps on iOS and Android. Our brands reach more than 20 million members worldwide so members can connect, meet and express themselves on a platform that prioritizes privacy and security. We invest heavily into SwiftUI and using Swift Packages to modularize the codebase.

Submit a free job ad (while I'm testing this). The analytics numbers for this website are here.

Release Notes

v1.2.1
5 days ago

変更点

  • FIX #73 "ログアウト処理エラー時の挙動について"
  • FIX #86 "podspecのlintでエラー"
  • FIX #88 "参考URL集にサンプル&チュートリアルの追加"

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics