Biblioteca de eventos - Swift SDK
Nesta página
- Visão geral
- Antes de começar
- Habilitar gravação de eventos
- Configuração de evento padrão
- Passar parâmetros para configuração do evento
- Atualizar metadados do evento
- Registrar eventos
- Interaja com o Realm de eventos
- Registrar eventos de leitura ou gravação
- Registrar eventos personalizados
- Serialização de objeto de evento
- serialização de objeto JSON
- Personalizar serialização de eventos
- Tamanho do Arquivo de Realm do evento
- Referência da biblioteca de eventos
- Eventos
- Carga útil do evento
Visão geral
A Biblioteca de eventos permite que você acompanhe a atividade de um usuário enquanto usa um aplicativo móvel habilitado para sincronização. A Biblioteca de evento pode registrar transação de escrita e transação de leitura. Os desenvolvedores também podem configurar eventos personalizados para registrar pressionamentos de botão, os dados exibidos na interface do usuário ou outros detalhes importantes.
Ao usar a Biblioteca de eventos, você pode especificar os eventos que deseja gravar. This means opening two realms:
O Realm do usuário, onde o usuário faz a leitura e a escrita na aplicação cliente
O domínio de eventos, onde a Biblioteca de Eventos registra eventos personalizados e com escopo
Os dados de ambos os domínios são sincronizados com seu App Services App. The client user never interacts directly with the event realm or its data; and the event realm Sync user can even be different from the user realm.
Como a Biblioteca de evento gera uma grande quantidade de dados:
O dispositivo do cliente deve ter capacidade suficiente para armazenar os dados
Esperar que o uso do Realm Mobile Sync para o Realm do evento seja maior do que a leitura e gravação no Realm do usuário
O cluster do Atlas de apoio do aplicativo deve ter capacidade de armazenamento suficiente para lidar com os dados gerados pela biblioteca de evento
Antes de começar
A Biblioteca de Eventos armazena dados em uma coleção do AuditEvent
na sua fonte de dados Atlas vinculada. Ativeo Modo de desenvolvimento em seu App Services App para permitir que o Atlas crie a coleção e infira o esquema a partir dos eventos carregados
Importante
Sincronização baseada em partição necessária
A Biblioteca de eventos não suporta a gravação AuditEvents
usando o Flexible Sync. Essa funcionalidade requer um aplicativo de App Services App de sincronização baseada em partição para registrar dados AuditEvent
.
Habilitar gravação de eventos
Para habilitar a gravação de eventos, defina a propriedade Event.Configuration no Realm.Configuration.
Você pode inicializar o EventConfiguration
de duas maneiras:
Use a configuração inicializada por padrão quando não precisar especificar detalhes
Passe parâmetros adicionais para personalizar a configuração do evento
Configuração de evento padrão
Se você não precisar especificar parâmetros específicos, você poderá usar o EventConfiguration
inicializado por padrão:
var config = user.configuration(partitionValue: "Some partition value") config.eventConfiguration = EventConfiguration()
Passar parâmetros para configuração do evento
Você pode passar parâmetros opcionais para personalizar o EventConfiguration
:
metadata
: Dicionário de strings de campos de metadados para anexar a cada eventosyncUser
: o usuário a ser usado para sincronizar o(s) Realm(s) de evento. If nil, defaults to the user from theRealm.Configuration
.partitionPrefix
: Prefixo de string para anexar ao valor da partição do eventologger
: Custom logger to use for events. Se nulo, o padrão será o registrador do Realm do usuário.errorHandler
: o manipulador de erros personalizado é chamado se ocorrer um erro de sincronização ao fazer o upload dos dados do evento. Senil
, o SDK registra o evento e depois chamaabort()
. Os aplicativos de produção devem sempre definir um eventoerrorHandler
, a menos que abortar no erro seja o comportamento desejado.
let eventSyncUser = try await app.login(credentials: Credentials.anonymous) var config = user.configuration(partitionValue: "Some partition value") config.eventConfiguration = EventConfiguration(metadata: ["username": "Jason Bourne"], syncUser: eventSyncUser, partitionPrefix: "event-")
Atualizar metadados do evento
Você pode atualizar os metadados mesmo depois de começar a gravar eventos. Utilize a função updateMetadata()
para substituir os metadados fornecidos na configuração do evento por novos valores.
Se você atualizar metadados enquanto o escopo de um evento estiver ativo, a Biblioteca de Eventos não utilizará os novos metadados até que o próximo escopo do evento comece.
var config = user.configuration(partitionValue: "Some partition value") config.eventConfiguration = EventConfiguration(metadata: ["username": "Jason Bourne"], syncUser: user, partitionPrefix: "event-") let realm = try! Realm(configuration: config) let events = realm.events! let updateUsernameScope = events.beginScope(activity: "Update username") // Call some function that updates the user's username updateUsername() updateUsernameScope.commit() // Update the metadata you supplied with the initial EventConfiguration events.updateMetadata(["username": "John Michael Kane"])
Registrar eventos
Interaja com o Realm de eventos
Depois de definir a configuração do evento, você pode invocar a funcionalidade de registro de eventos com a nova propriedade de eventos em um domínio. Isso retorna uma instância Event
vinculada a esse domínio.
let realm = try! Realm(configuration: config) let events = realm.events!
Registrar eventos de leitura ou gravação
Alterado na versão 10.36.0: endScope() preterido para commit() e cancel(), novo objeto de escopo
The Event Library records read and write events within the context of a scope. O escopo é o período durante o qual a evento Library observa e registra as atividades do Realm. Você pode definir escopos diferentes para registrar diferentes tipos de eventos. Por exemplo, você pode ter escopos para fluxos de usuários específicos, como "login", escopos diferentes para telas diferentes ou escopos diferentes para atividades específicas relacionadas à conformidade.
Use começaScope(atividade: "alguma atividade") para começar a gravar um novo evento com o nome de atividade fornecido. Isso retorna um objeto de escopo , que você pode usar para confirmar ou cancelar o escopo posteriormente. O início de um escopo registra as atividades que ocorrem dentro desse escopo como eventos de leitura ou gravação.
Leia evento: execute query e instancie objeto. Quando o escopo termina, o Realm de evento registra essas atividades como evento de leitura.
Gravar eventos: modificar objetos. Quando o escopo termina, o Realm registra o estado inicial do objeto, bem como os novos valores de quaisquer propriedades que são alteradas durante o escopo do evento.
Utilizar beginScope
para registrar um evento abre o Realm do evento se ele ainda não estiver aberto. O SDK abre os domínios de eventos no thread em segundo plano e relata erros na chamada de resposta de erro.
Observação
Sobreposição de escopos de eventos
Se mais de um escopo de evento estiver ativo simultaneamente, os eventos gerados serão registrados por todos os escopos ativos.
Quando terminar de gravar eventos para um escopo, use commit()
para salvar os eventos que ocorreram dentro do escopo. When you end the recording, the Event Library saves the event to disk locally. Em seguida, se o dispositivo tiver uma conexão de rede, o SDK enviará de forma assíncrona os dados para o servidor.
// Read event let readEventScope = events.beginScope(activity: "read object") let person = realm.objects(Person.self).first! print("Found this person: \(person.name)") readEventScope.commit() let mutateEventScope = events.beginScope(activity: "mutate object") // Write event try! realm.write { // Change name from "Anthony" to "Tony" person.name = "Tony" } mutateEventScope.commit()
Alternativamente, você pode cancel()
um escopo de evento. Isso interrompe a gravação de eventos e não persiste os eventos no disco ou no servidor.
let eventScope = events.beginScope(activity: "read object") let person1 = realm.objects(Person.self).first! print("Found this person: \(person1.name)") eventScope.cancel()
You can check whether a given scope is currently in progress using the isActive
bool. Isso retornará true
se você tiver iniciado um escopo que ainda não confirmou ou cancelou.
let readPersonScope = events.beginScope(activity: "read object") let person2 = realm.objects(Person.self).first! print("Found this person: \(person2.name)") if readPersonScope.isActive { print("The readPersonScope is active") } else { print("The readPersonScope is no longer active") } readPersonScope.cancel()
Você pode passar um bloqueio de conclusão opcional para commit()
quando terminar de gravar. O SDK chama esse bloco quando os dados do evento são persistidos com êxito - não quando o upload do Realm do evento é concluído.
let mutateScope = events.beginScope(activity: "mutate object with completion") // Write event try! realm.write { // Add a userId person.userId = "tony.stark@starkindustries.com" } mutateScope.commit(completion: { error in if let error = error { print("Error recording write event: \(error.localizedDescription)") return } print("Successfully recorded a write event") })
Registrar eventos personalizados
A Biblioteca de eventos permite gravar cliques de botão ou outros eventos que não envolvem leituras e gravações de banco de dados. Use recordEvent para registrar um evento personalizado. Esta função utiliza estes parâmetros:
activity
: o nome da atividade. Esta é uma string arbitrária, como "registro de usuário".eventType
: o tipo de evento. Esta é uma string arbitrária, como "pressionou o botão Enviar".data
: uma carga de dados opcional para o evento.completion
: an optional completion handler. A Biblioteca de Eventos chama esse bloco de conclusão assim que o evento é salvo no Realm de eventos ou se ocorrer um erro. Um erro de valor null indica o sucesso.
Um evento personalizado não tem um escopo como eventos de leitura e gravação. Em vez disso, gravar um evento personalizado é mais análogo a disparar um trigger.
events.recordEvent(activity: "event", eventType: "custom event")
Serialização de objeto de evento
serialização de objeto JSON
A Biblioteca de Eventos converte cada objeto de evento em um objeto JSON. A maioria dos tipos de Realm possui uma representação JSON análoga. Por exemplo, uma propriedade Realm String torna-se uma JSON String.
É assim que a biblioteca de evento representa os tipos que não possuem um JSON direto:
Data | Codificado para uma string no formato ISO 8601-1: .2019 |
Dados | Excluído totalmente do evento. |
UUID | Codificado para um RFC-4122-string compatível. |
ObjectID | Codificado para nossa ObjectId string representação de . |
Decimal128 | Codificado para uma string, não um número. Os números JSON são oficialmente de precisão infinita, mas raramente são implementados como tal. |
Lista | Codificado como uma array. |
definir | Codificado como uma array. |
Dictionary | Codificado como um objeto. |
Objetos incorporados | Codificado como um objeto. |
Os links de objeto incorporado não são codificados como a chave primária do destino. Em eventos de leitura, se o link for seguido, ele se expande para o objeto completo. Se o link não for seguido, esta continua a ser uma chave primária.
Personalizar serialização de eventos
Você pode personalizar a serialização JSON para objetos de evento. Para personalizar a carga útil do evento, use o protocolo CustomEventRepresentable .
Quando um objeto está em conformidade com CustomEventRepresentable
, a biblioteca de evento serializa o objeto por:
Construir um objeto acessor
Chamando
customEventRepresentation
nesse objeto de acessoSerializando o resultado em vez do objeto original
Para estar em conformidade com CustomEventRepresentable
, seu objeto deve implementar uma função customEventRepresentation que defina sua serialização personalizada.
// To customize event serialization, your object must // conform to the `CustomEventRepresentable` protocol. class Person: Object, CustomEventRepresentable { true) var _id: ObjectId (primaryKey: var name: String var employeeId: Int var userId: String? convenience init(name: String, employeeId: Int) { self.init() self.name = name self.employeeId = employeeId } // To conform to `CustomEventRepresentable`, your object // must implement a `customEventRepresentation` func that // defines your customized event serialization func customEventRepresentation() -> String { if employeeId == 0 { return "invalid json" } return "{\"int\": \(employeeId)}" } }
Tamanho do Arquivo de Realm do evento
O Realm pode ficar bastante grande se o dispositivo estiver offline por um longo período de tempo.
Para compensar isso, a Biblioteca de evento divisão automaticamente os dados do evento em várias partições, conforme necessário. Quando uma partição atinge seu tamanho máximo, a Biblioteca de Eventos fecha o Realm de eventos e começa automaticamente a gravar em uma nova partição.
A Biblioteca de evento verifica se o usuário tem alguma partição não sincronizada. Em caso afirmativo, a Biblioteca de evento abre um, carrega os dados, fecha o arquivo e o exclui. Isso se repete até que o usuário não tenha partições não sincronizadas.
Referência da biblioteca de eventos
Eventos
A collection AuditEvent
onde os evento são armazenados deve ter um esquema definido no servidor para o aplicativo que recebe evento.
O esquema deve conter os seguintes campos:
ID | _id | ObjectId. |
Tipo de evento | event | String opcional. read ou write para eventos com escopo ou uma string arbitrária para eventos personalizados. |
Escopo do evento | activity | String opcional. O nome do escopo passado para beginScope() para iniciar a gravação do evento ou uma string arbitrária para eventos personalizados. |
Timestamp | timestamp | Hora local do dispositivo em que o escopo do evento é encerrado e os dados são confirmados, ou a hora em que o evento atinge o servidor. |
Dados | data | A carga útil do evento. Este é um blob JSON para eventos com escopo ou uma string arbitrária para eventos personalizados. |
Metadata | metadata key (string) | Um dicionário de metadados opcional. Quando esse dicionário contém chaves e valores, a chave se torna um nome de campo no objeto de evento e o valor é armazenado nesse campo para cada evento. |
Carga útil do evento
Cada evento contém uma carga útil na propriedade data
que captura o estado atual dos objetos que estão sendo lidos ou gravados.
As cargas úteis para eventos personalizados podem ser o que o desenvolvedor desejar, incluindo nula.
Importante
Como a carga útil captura o estado atual dos objetos que estão sendo lidos ou gravados, isso produz uma quantidade muito grande de dados. No entanto, isso deve ser feito no cliente e não no servidor, pois os dados exatos que o usuário visualiza podem nunca existir no lado do servidor. Na prática, isso significa que o dispositivo deve ter a capacidade de armazenar uma grande quantidade de dados se ficar offline. Além disso, o uso do Realm Mobile Sync para o Realm de evento pode ser muito maior do que para a leitura e escrita que o usuário faz no Realm do usuário.
Exemplo
Em nossos exemplos de Eventos de registro acima, estas são as cargas úteis data
para os eventos de leitura e escrita:
{ "type":"Person", "value": [{ "_id":"62b38b3c10846041166f5deb", "_partition":"", "employeeId":2, "name":"Anthony", "userId":null }] }
{ "Person": { "modifications": [{ "newValue": { "name":"Tony" }, "oldValue":{ "_id":"62b38b3c10846041166f5deb", "_partition":"", "employeeId":2, "name":"Anthony", "userId":null } }] } }