diff --git a/packages/firebase-firestore/index.ios.ts b/packages/firebase-firestore/index.ios.ts
index 72b60260..34c1f641 100644
--- a/packages/firebase-firestore/index.ios.ts
+++ b/packages/firebase-firestore/index.ios.ts
@@ -140,31 +140,19 @@ function serializeItems(value) {
 	return value;
 }
 
-function createDictionary(field: any, value?: any, moreFieldsAndValues?: any) {
-	const data = {};
-	if (data && !value && !moreFieldsAndValues) {
-		Object.entries(field).forEach((item) => {
-			const key = <any>item[0];
-			const value = <any>item[1];
-			if (key instanceof FieldPath) {
-				data[key.native as any] = value?.native || value;
+function createDictionary(dataOrField: any, fieldPathValue?: any, moreFieldsAndValues?: any) {
+	// TODO: Correctly handle FieldPaths used as keys or passed in the dataOrField and
+	// moreFieldsAndValues params e.g. new FieldPath(['test', '123']) will currently result in an
+	// object like { "<FIRFieldPath: 0x283f94640>": "value" }
+	const data = {}
+	const assignKeyValue = (key, val) => data[key instanceof FieldPath ? key.native : key] = serializeItems(val);
+	if (!fieldPathValue && !moreFieldsAndValues) {
+		Object.entries(dataOrField).forEach((item) => assignKeyValue(item[0], item[1]));
 			} else {
-				data[key] = value?.native || value;
-			}
-		});
-	} else {
-		if (field instanceof FieldPath) {
-			data[field.native as any] = value?.native || value;
-		} else {
-			data[field] = value?.native || value;
-		}
-
+		assignKeyValue(dataOrField, fieldPathValue);
 		if (Array.isArray(moreFieldsAndValues)) {
-			for (let i = 0; i < moreFieldsAndValues.length; i += 2) {
-				const key = moreFieldsAndValues[i];
-				const value = moreFieldsAndValues[i + 1];
-				data[key?.native || key] = value?.native || value;
-			}
+			Object.entries(Object.fromEntries(moreFieldsAndValues))
+				.forEach(([key, value]) => assignKeyValue(key, value));
 		}
 	}
 
@@ -202,7 +190,6 @@ export class Transaction implements ITransaction {
 	update<T extends DocumentData = DocumentData, K extends keyof T = string>(documentRef: DocumentReference<T>, field: K | FieldPath, value: T[K], moreFieldsAndValues: any[]): Transaction;
 	update(documentRef: any, field: any, value?: any, moreFieldsAndValues?: any): Transaction {
 		const data = createDictionary(field, value, moreFieldsAndValues);
-
 		return Transaction.fromNative(this._native.updateDataForDocument(data as any, documentRef?.native));
 	}