diff --git a/packages/core/utils/native-helper.d.ts b/packages/core/utils/native-helper.d.ts index 1f9becfff..339bc9320 100644 --- a/packages/core/utils/native-helper.d.ts +++ b/packages/core/utils/native-helper.d.ts @@ -121,6 +121,12 @@ export namespace iOSNativeHelper { export function nsArrayToJSArray(a: NSArray): T[]; } + /** + * Data serialize and deserialize helpers + */ + export function dataSerialize(data?: any): any; + export function dataDeserialize(nativeData?: any): any; + /** * @deprecated use application.orientation instead * diff --git a/packages/core/utils/native-helper.ios.ts b/packages/core/utils/native-helper.ios.ts index b7d93f398..a685a32c5 100644 --- a/packages/core/utils/native-helper.ios.ts +++ b/packages/core/utils/native-helper.ios.ts @@ -1,4 +1,5 @@ import { Trace } from '../trace'; +import { getClass, isNullOrUndefined } from './types'; declare let UIImagePickerControllerSourceType: any; @@ -53,6 +54,60 @@ export namespace iOSNativeHelper { } } + export function dataDeserialize(nativeData?: any) { + if (isNullOrUndefined(nativeData)) { + // some native values will already be js null values + // calling types.getClass below on null/undefined will cause crash + return null; + } else { + switch (getClass(nativeData)) { + case 'NSNull': + return null; + case 'NSMutableDictionary': + case 'NSDictionary': + let obj = {}; + const length = nativeData.count; + const keysArray = nativeData.allKeys as NSArray; + for (let i = 0; i < length; i++) { + const nativeKey = keysArray.objectAtIndex(i); + obj[nativeKey] = dataDeserialize(nativeData.objectForKey(nativeKey)); + } + return obj; + case 'NSMutableArray': + case 'NSArray': + let array = []; + const len = nativeData.count; + for (let i = 0; i < len; i++) { + array[i] = dataDeserialize(nativeData.objectAtIndex(i)); + } + return array; + default: + return nativeData; + } + } + } + + export function dataSerialize(data?: any) { + switch (typeof data) { + case 'number': + case 'string': + case 'boolean': + return data; + case 'object': + if (Array.isArray(data)) { + return NSArray.arrayWithArray(data.map(dataSerialize)); + } + + let obj = {}; + for (let key of Object.keys(data)) { + obj[key] = dataSerialize(data[key]); + } + return NSDictionary.dictionaryWithDictionary(obj); + default: + return NSNull.new(); + } + } + export function isLandscape(): boolean { console.log('utils.ios.isLandscape() is deprecated; use application.orientation instead');