Realm Blog

Realm ObjC & Swift 2.7: Permission APIの刷新、再接続の速度を改善、パスワード変更、不具合の修正

Realm Objective‑CおよびRealm Swift 2.7をリリースしました。 このバージョンには新機能としてPermission APIの刷新、パスワード変更機能の追加、再接続の速度を改善、不具合の修正を含みます。詳しくは下記をご覧ください。

Permission APIの改善

同期されたRealmに対するアクセス権の変更APIをコールバックベースに変更しました。

新しいAPIは将来的に既存のRealmオブジェクトベースのAPIから置き換えられます。

例えば、これまでの方法ではアクセス権を付加、あるいは削除するときは、{RLM}SyncPermissionChangeオブジェクトを作成し、ユーザーのmanagementRealm()に保存しました。

そして、オブジェクトの変更を監視し、操作が成功したかどうかを確かめます。具体的には下記のようにします。

let permissionChange = SyncPermissionChange(realmURL: realmURL,    // The remote Realm URL on which to apply the changes
                                            userID: anotherUserID, // The user ID for which these permission changes should be applied
                                            mayRead: true,         // Grant read access
                                            mayWrite: true,        // Grant write access
                                            mayManage: false)      // Grant management access

let managementRealm = try! user.managementRealm()
try! managementRealm.write {
  managementRealm.add(permissionChange)
}
// Wait for server response
token = permissionChange.addNotificationBlock { _ in
  switch permissionChange.status {
  case .notProcessed: break // handle case
  case .success: break // handle case
  case .error: break // handle case
  }
  print(permissionChange.statusMessage) // contains error or informational message
}

Retrieving permissions used a separate Realm (SyncUser.permissionRealm()) and a separate model type (SyncPermission).

let permissionRealm = try! user.permissionRealm()
let permissions = permissionRealm.objects(SyncPermission.self)
token = permissions.addNotificationBlock { _ in
  // permissions updated
}

上記のAPIはこのバージョンから非推奨となり、新しいAPIに置き換えられます。新しいAPIではコールバックベースになり、内部でRealmを使っているという仕組みを気にしなくても使えます。

新しいAPIでは{RLM}SyncPermissionValueをアクセス権の変更に使用します。

// Applying permissions
let permission = SyncPermissionValue(realmPath: realmPath,
                                     userID: anotherUserID,
                                     accessLevel: .write)
user.applyPermission(permission) { error in
  if let error = error {
    // handle error
    return
  }
  // success!
}
// Retrieving permissions
user.retrievePermissions { permissions, error in
  if let error = error {
    // handle error
    return
  }
  // success! access permissions
}

詳しくはドキュメントのアクセスコントロールのセクションをご覧ください。

このAPIはRealm Object Server 1.1.0以上が必要です。

再接続の速度を改善

このバージョンではReachabilityフレームワークの機能を利用して、ネットワークの状態を監視しています。それにより、オフライン状態からオンラインに復帰した際の再接続の速度が即座に行われるようになります。 これまでは再接続するまでの時間はオフラインになってからの経過時間に依存していました。

パスワードの変更

-[RLMSyncUser changePassword:completion:] APIを利用してユーザーのパスワードを変更できるようになりました。このAPIの利用はRealm Object Server 1.4.0以上が必要です。

その他の改善

  • {RLM}SyncConfigurationに新しくenableSSLValidationプロパティを追加しました。(Swiftではデフォルト値として false が与えられています。)サーバーごとのSSLバリデーションを有効にします。
  • 同期されたRealmとRealm Object Server間で16MB以上のトランザクションが可能になりました。

不具合の修正

  • Swiftで定義したモデルクラスの名前を@objc()アトリビュートによって変更できるようになりました。(e.g. @objc(Foo) class SwiftFoo: Object {}
  • マイグレーション中にオブジェクトを削除した際に、-[RLMMigration enumerateObjects:block:]が正しくないoldObjectを返す問題を修正しました。
  • 読み取り権限しかないユーザーがRealmをRealm.asyncOpen(...)を使って開こうとすると失敗しる問題を修正しました。
  • KVCを使ってListプロパティにnilを設定しようとした際の挙動をRLMArrayプロパティの挙動と合わせました。
  • 同期されたRealmを使用している際に発生する!m_awaiting_pongアサーションエラーを修正しました。
  • 大文字小文字を区別しない検索を大文字小文字の区別のない文字(数値や記号)によって構成され、かつ非常に長い文字列に対して行うと非常に速度が低下する問題を修正しました。

iOS 7 Support

iOS 7のサポートは可能な限り続けますが、近い将来、iOS 8以降のみのサポートにな予定です。 release.


お読みいただきありがとうございます。 Realmで素晴らしいアプリケーションを作りましょう!お困りの際はStack Overflow(日本語)Slack(日本語)Twitter(日本語)GitHub(英語)でご相談ください。


Realm Team

At Realm, our mission is to help developers build better apps faster. We provide a unique set of tools and platform technologies designed to make it easy for developers to build apps with sophisticated, powerful features — things like realtime collaboration, augmented reality, live data synchronization, offline experiences, messaging, and more.

Everything we build is developed with an eye toward enabling developers for what we believe the mobile internet evolves into — an open network of billions of users and trillions of devices, and realtime interactivity across them all.

記事の更新情報を受け取る