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(英語)でご相談ください。