Realm Advent Calendar 2016 25日目 Realm Mobile PlatForm beta Swift3 with 実機

こんにちは、iosフリーランスエンジニアの永田大祐と申します。
機械学習の技術を高めて、iosのモバイルに、機械学習を繋げるエンジニアになります。
よろしくお願いします。

本日は、誠に勝手ながら、Realm Advent Calendar の最終日に参加させていただきました。ありがとうございます。

今年のフリーランスリアルライフはRealmで始まりました。
去年の夏頃より、毎日１０時間以上ほとんどコーディングを続けてきました。去年は退職金や失業給付金などありましたから、毎日コーディングを続けまして、１０本以上のアプリリリースと１０本以上の登壇発表、オープンソースも出し続けましたが、さらに続けないと、あまり意味がないと思いますので、これが自分の普通ペースになってきているので、そのままマイペースで続けたいと思います。

そして今年の2月頃に「RainbowAppsの講師の方に勉強するならRealmを勉強するといいよ」とご教授いただき、ひたすらRealmのデータベースを勉強して、実際にコーディングを続けました。

案の定、業務においてもデータベースでRealmを活用している案件は多数ありました。ただ炎上案件なども自分がマネージメントした方が上手くいくと勝手ながら、思っています。理由は５年間は超繁忙店のマネージャーをしていて、数値で結果を出し続けたからです。（上には上がいると思いますし、各々の頑張りはリスペクトしてます。）

RealmはSwift上で実装するディレクトリーでは非常にシンプルに実装できます。またModelやクラス、構造体といった概念も同時に学べ、コーディングを覚えるのにもとても分かりやすいと思います。

今回の取り組みは、
だいたい23日から検討に入り、投稿させていただきました。
前置きが長くなりましたが、今回実施した内容に入ります。

#Realm Mobile PlatForm betaを実機で試す。



#手順
###1　ネット環境を同じにする。**wifi接続なら同じwifi設定が必要です。

###2　Realmサーバーに繋げる。
realmサーバーの手順は公式ホームページを確認願います。

https://realm.io

公式サイトからプロジェクトをダウンロードしてきたら、
こちらの画像の箇所Start〜をクリックするとターミナルが立ち上がり、サーバーが自動で起動します。リセットなどもあるので英語ですが、公式サイトをよく読むことをお勧めします。

<img width="781" alt="スクリーンショット 2016-12-24 午後2.04.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/87c8c642-9658-a3e4-d6d8-dd9f156bc18b.png">


ここで適当なメールアドレスとパスワードを入力します。本当のメールアドレスではなくとも大丈夫です。

<img width="1194" alt="スクリーンショット 2016-12-24 午後2.03.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/9c5eb78e-2338-2d64-de94-1ca16e9d2b0f.png">

###3 プロジェクト内のMacアプリを起動する。

サーバーにログインする際のメールアドレスや、パスワードを入力します。
<img width="588" alt="スクリーンショット 2016-12-24 午後2.06.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/8698c94e-a776-96d4-603e-8733ac63df30.png">

今回は、チュートリアルをモデルにさせていただきました。
https://realm.io/docs/tutorials/realmtasks/




こちらはシュミレータ専用で、Macアプリの対応になっています。


#4　実機でビルドする
####チュートリアルのモデルアプリを改造して実機で動かしました。
情報は１件だけヒットしました。
https://stackoverflow.com/questions/40296528/realm-app-working-on-the-simulator-but-not-on-an-actual-device

上記のヒントより対応したソースを展開します。こちらのヒントがないと出来なかったかもしれません。

###ポイントはここです！！***Constants.swiftはチュートリアル動画で紹介されていないプロジェクトファイルです。
<img width="530" alt="スクリーンショット 2016-12-25 午前0.27.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/e1cb243f-ff7c-14b4-e420-4061a0a198fe.png">
公式ホームページ内の、画像をクリックすると、ダウンロードできます。

Constants.swiftファイル内の
   
    static let syncHost = "Macのipアドレスを入力"


LocalIPAddress.swiftも同様にMacのipアドレスを記載。

###ポイントはここです！！こちらはチュートリアルで紹介されているメソッドの一部です。残りはhttps://realm.io/docs/tutorials/realmtasks/
で確認願います。

ViewController.swift内の
メールアドレスや、パスワードはサーバーログインした際に登録したものです。あとはご自身のMacのipアドレスを設定する必要があります。
    
    func setupUI() {
        title = "My Tasks"
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        navigationItem.leftBarButtonItem = editButtonItem
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(add))
    }
    override func tableView(_ tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }
    func setupRealm() {
        // Log in existing user with username and password
        let username = "1111@gmail.com"  // <--- Update this
        let password = "1111"  // <--- Update this
        SyncUser.logIn(with: .usernamePassword(username: username, password: password, register: false), server: URL(string: "http://Macのipアドレス:9080")!) { user, error in
            guard let user = user else {
                fatalError(String(describing: error))
            }

            DispatchQueue.main.async {
                // Open Realm
                let configuration = Realm.Configuration(
                    syncConfiguration: SyncConfiguration(user: user, realmURL: URL(string: "realm://Macのipアドレス:9080/~/realmtasks")!)
                )
                self.realm = try! Realm(configuration: configuration)
                
                // Show initial tasks
                func updateList() {
                    if self.items.realm == nil, let list = self.realm.objects(TaskList.self).first {
                        self.items = list.items
                    }
                    self.tableView.reloadData()
                }
                updateList()
                
                // Notify us when Realm changes
                self.notificationToken = self.realm.addNotificationBlock { _ in
                    updateList()
                }
            }
        }
    }
    
    deinit {
        notificationToken.stop()
        
    }
    
   上記の動作を実施することにより端末と端末でも実施できました。

ちなみにサーバー接続が成功するとコンソールにはこのように出力されます。
<img width="889" alt="<img width="889" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3133313436392f36613062666535302d386632642d666530312d393765372d6162366232633438316361332e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/9d309b2a-e4c2-1482-2ebf-a0a130eca8dd.png">
">

　　　　　　　　　　　　
　　　　　　　　　　　　　　　　
2016/12/25現在で自分のFaceBookに挙動紹介動画を貼り付けています。よかったら参考にしてみてください。

https://www.facebook.com/daisuke.nagata.96995?viewas=100000686899395&returnto=profile&privacy_source=privacy_lite


#最後にオリジナルなお絵描きアプリを作りました。


![Movie.gif](https://qiita-image-store.s3.amazonaws.com/0/131469/571f08cf-2d2e-f005-3f5b-5522f627135c.gif)

#まとめ。
サーバーも作れるようになる必要がある。　Realm Mobile PlatFormはサーバが起動して、アプリケーションが動くからです。本番で実施する際は、サーバーも必要になります。
上記のようなお絵描きアプリの完全版を作成する際は、メモリ管理が重要になると思いました。理由は、 現在のRealm Mobile PlatFormでは、Realmself.notificationToken = self.realm.addNotificationBlockでUIの表示が動作し続けているからです。ここで動画のようなUIをリアルタイムで表現にするには、メモリ管理の設計が重要になると考えました。

本日も貴重なお時間にお読みいただき、誠にありがとうございます。来年も宜しくお願い申し上げます:robot: