ページ

ラベル Realm の投稿を表示しています。 すべての投稿を表示
ラベル Realm の投稿を表示しています。 すべての投稿を表示

2016年10月27日木曜日

Realm mobile platform アプリ作成 - Android -


前回、RealmサーバーにiOSで作成したアプリと同期が取れている事を確認しました。
今回はAndroidアプリを作成し、iOS->Realmサーバー->Androidで同期を取ってみたいと思います。
とりあえず今回はログインまでをやってみます。

Androidアプリ開発準備


開発環境
Android Studio 2.2.2
プロジェクト作成&Realmインストール

まずはプロジェクトを作成。minSdkVersionは19、targetSdkVersionは23
Activity追加ではEmpty Activityを選択しました。

早速Realmをインストールしていきます。
まずはトップにあるbuild.gradleのdependenciesに↓を追加。
dependencies {
    classpath "io.realm:realm-gradle-plugin:2.0.2"
}
次にapp/build.gradleに↓を追加します。
apply plugin: 'realm-android'

realm {
    syncEnabled = true
}
syncEnabled = trueにしないとObjectServer関連が使えないので注意!!
最後にbuild.gradleを修正した際に右上に表示されるSync Nowをクリック。
Realmがインストールされます。


ログイン画面作成


Realmサーバーにログインするまでを実装してみたいと思います。
  • Applicationクラス作成
Realm関係の初期化を行う為にApplicationクラスを継承した
クラスを作成します。今回はMyApplicationクラスにします。
作成したMyApplicationクラスのonCreateを以下のようにオーバーライドします。
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Realm.init(this);
    }
}
次にAndroidManifest.xmlandroid:name=".MyApplication"を追加します。
<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:name=".MyApplication" // ☆ここ
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
      ・・・
    </activity>
</application>
とりあえず今回はMainActivityonCreateでログイン処理を実施します。
public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // [1]
        Credentials creds = Credentials.usernamePassword("ユーザー名", "パスワード", false);

        String authUrl = "http://10.0.2.2:9080/auth"; // [2]
        User.Callback callback = new User.Callback() {
            @Override
            public void onSuccess(User user) {
                Log.i(TAG, "Login success.");
            }

            @Override
            public void onError(ObjectServerError error) {
                String errorMsg;
                switch (error.getErrorCode()) {
                    case UNKNOWN_ACCOUNT:
                        errorMsg = "Account does not exists.";
                        break;
                    case INVALID_CREDENTIALS:
                        errorMsg = "User name and password does not match";
                        break;
                    default:
                        errorMsg = error.toString();
                }
                Log.e(TAG, errorMsg);
            }
        };
        User.loginAsync(creds, authUrl, callback);
    }
}
[1]のusernamePasswordメソッド第三引数をtrueにするとユーザー新規作成
falseにするとログインになります。
[2]でhttp://10.0.2.2:9080/authとしてますが、
これはエミュレータ上でlocalhostにアクセスするには10.0.2.2
する必要がある為、このIPアドレスにしています。
この状態でRealm Object Serverを立ち上げて実行し、
ログに「Login success.」が表示されればOKです。

2016年10月13日木曜日

Realm mobile platform アプリ作成1 - iOS -


以前デモアプリを試して、サーバーと同期が取れている事を試してみました。 今回は実際にiOSアプリに組み込んでみたいと思います。

プロジェクト作成

今回はXcode8でプロジェクトを作成していきます。
Create a new Xcode project > iOS > 
Application > Single View Applicationを選択。
Product NameOrganization Name等はお好みで。
LanguegeはSwift、DevicesはiPhoneを選択します。

Keychainを使用する為、Keychain SharingをONにします。
※「Capabilities」タブにあります

次に「General」タブのEmbedded Binariesに前回ダウンロードした
realm-mobile-platformフォルダ内の「SDKs」>「realm_cocoa_XXX」> 
「ios」>「swift-3.0」にある「Realm.framework」と「RealmSwift.framework」を
ドラッグ&ドロップします。

その際に「Copy Items if Needed」にチェックを入れます。

コピー後


モデルの作成

次に簡単なモデルを作成します。
ViewController.swiftに以下を追加します。
import RealmSwift

final class Item : Object {
    dynamic var id = 0
    dynamic var name = ""
}
モデルの作成はObjectクラスを継承したクラスを作成し、
メンバはdynamic varで宣言します。

ユーザーログイン

アプリ起動時にサーバーにログインする処理を追加します。
var realm: Realm!

func login() {
    // サーバーURLを指定
    let url = URL(string: "http://localhost:9080")
    // 登録済みのユーザーで認証します
    let credential = Credential.usernamePassword(
      username: "user@example.com", password: "xxxxxx", actions: [.useExistingAccount])
    User.authenticate(with: credential, server: url!, onCompletion: {user, error in
        if let _ = user {
            // ログイン成功時
            // sample/database : DBで言うスキーマみたいなもの
            let realmURL = URL(string: "realm://localhost:9080/sample/database")!
            let configuration = Realm.Configuration(syncConfiguration: (user!, realmURL))
            Realm.Configuration.defaultConfiguration = configuration
            // realmオブジェクトを取得
            self.realm = try! Realm()

        } else if let _ = error {
            // ログイン失敗
            print("login error \(error)")
        }
    })
}

override func viewDidLoad() {
    super.viewDidLoad()
    login()
}
ログイン成功時に取得したRealmオブジェクトを使って処理を行います。

アイテム追加

ストーリーボードでButtonTextFieldを追加します。

Button押下時のアクションをonPushAddとしてViewController.swift
イベント追加します。また、TextFieldnameFieldとして追加します。

追加したonPushAddを以下のように修正します。
var count: Int = 0

@IBAction func onPushAdd(_ sender: AnyObject) {
    // TextFieldから現在入力されているテキストを取得
    let name = self.nameField.text
    try! self.realm?.write {
        // RealmオブジェクトにてItemを追加
        count = count + 1
        let item = Item()
        item.id = count
        item.name = name!
        self.realm.add(item)
    }
}
ここまで出来たらサーバー側で反映されているか確認します。
Realm Object Serverを起動し、Realm Browser.appを立ち上げます。
サーバー接続後、Openできるスキーマが増えているかと思います。

ログイン時に設定したスキーマになります。
※スキーマという名前であってるか分かりませんが、便宜上そう読んでます。
接続後に起動したアプリ上でTextFieldに文字列を入力しAddを押すと
データが追加されてればOKです。
gif
今回修正したViewController.swiftここで見れます。

2016年10月9日日曜日

新しい技術を学んでみる 7 - Realm Mobile Platform -


ついこの間発表されたRealm Mobile Platformを試してみたいと思います。

Realmとは?
SQLiteやCore Dataの代替となるモバイルのデータベース
Android、iOS両方で使える。

Realm Mobile Platformとは?
データベースに加え、リアルタイムの同期、コンフリクトの解決、
イベントハンドリングといったサーバサイドの機能をシームレスに統合したもの。
現在はJava、Objective-C、Swiftのみ対応。

環境準備


開発環境としてはMacOSで進めていきます。
MacOS以外ではLinuxでも使えるようです。
まずはここから一式をダウンロードします。

ダウンロードしたフォルダの中にstart-object-server.commandがあるので、
ダブルクリックしてRealm Object Serverを立ち上げます。
Server起動するとブラウザが立ち上がりAdminユーザー作成画面が表示されます。

e-mailとpasswordを入力しAdminユーザーを作成します。
セットアップが完了すると再度e-mailとpasswordを求められるので入力しLoginします。

ログイン後ダッシュボード画面が表示されればセットアップ完了です。

デモを試してみる


早速何か動かしてみたいので、チュートリアルにあるRealmTasks
動かしてみたいと思います。
先ほどダウンロードしたrealm-mobile-platformフォルダ内に
RealmTasks.appがあるので起動してみます。

起動するとe-mailとpasswordを求められるので、
適当なユーザーを作成してログインします。(※ローカル内だけでのアカウントなので適当で)
次に「+」を押して新規タスクを作成してみます。
タスクは左にドラッグで削除、右にドラッグでタスク完了の操作ができます。

Realm Browser


デモアプリを起動している状態で、サーバーと同期が取れているか確認してみます。
realm-mobile-platformフォルダ内にあるRealm Browser.appを起動します。
起動したらConnect to Object Serverを押します。
Server URLAdmin Access Tokenを入力する画面で
デフォルトの場合
  • Server URL
    realm://localhost:9080
  • Admin Access Token
    start-object-server.commandをダブルクリックした時コンソールに出力されているAdmin Access Token
を入力します。
Realm Object Serverに接続されたRealm Browserでは
デモアプリと同期しているのが分かります。
gif

使ってみて


今回はデモを動かしてみただけですが、色んな用途で使えそうです。
次は実際にアプリに組み込んで、組み込み易さを検証したいと思います。

また、今回はローカル内で完結していたのでレスポンスが早いのは当たり前ですが
実際のサーバー上とのやりとりでどんな感じが試してみたいと思います。