Timeline

See how your iOS platform is evolving.

iOS
Flex SDK
Kinvey CLI
Guides
Tutorials
Console
Business Logic
  • Improvement: Update all dependencies to latest versions with support for Xcode 13 and iOS 15
  • Improvement: Most notably Realm from v3.21.0 to v10.15.1
  • Breaking Change: The designated initializers defined by RLMObject and RealmSwift.Object when inheriting Entity, File, etc. are no longer required and should be removed.
  • Breaking Change: Carthage:
  • Breaking Change: We are using xcframeworks now
  • Breaking Change: SPM:
  • Breaking Change: The Package.swift file was updated to use the exact version of dependencies matching the ones from Cartfile.resolved
  • Breaking Change: The tests related dependencies are removed from Package.swift
  • Bug Fixes: Fix build error on Cocoapods for WatchOS.
  • Improvement: Update all dependencies to latest versions with support for Xcode 13 and iOS 15. Most notably Realm from v3.21.0 to v10.15.1
  • Breaking Change: The designated initializers defined by RLMObject and RealmSwift.Object when inheriting Entity, File, etc. are no longer required and should be removed.
  • Breaking Change: We are using xcframeworks now for Carthage
  • Breaking Change: The tests related dependencies are removed from Package.swift
  • Add support for login hooks
  • Add support for login hooks
  • Improve error message for iOS push settings in config management
  • Modify collection hooks sequentially
  • Add collection hooks: onPreInsert, onPreUpdate, onPostInsert, onPostUpdate
  • Bugfix: Fix the EntityLimitExceeded error when more than 100 new items are pushed or synced (#384)
  • Do not update the appEnv when no settings are supplied on kinvey appenv apply
  • Fix appEnv ID check
  • Support login with external identity providers
  • Improvement: Set default API version to 5 (#381)
  • Bugfix: Update dependencies and fix incompatibility with PubNub v4.14.2 (#382)
  • Bugfix: Consistent MultiSaveError behavior (#383)
  • Bugfix: Fix multi insert errors parsing (#381)
  • Modify commands to accept only --org <org> (--app <app> is no longer valid):
    • flex init
    • flex create
    • flex list
    • service create
    • website create
    • app create
  • Remove flex job command
  • Update API version to 4
  • Update min node version to 12.16.1
  • Improvement: Build with ObjectMapper 3.5.2 (#379)
  • Improvement: Codable support for File (#378)
  • Add config management feature
  • Improve profile description
  • Improve response error handling
  • Bugfix: Allowing query into file metadata. ([#375 ]
  • Bugfix: Fixing multi-client support. (#376 )
  • Improvement: Swift Package Manager Support (#302)
  • Bugfix: Missing JSON Content-Type HTTP Header for multi-insert operations. ([#371]
  • Bugfix: Fixed return when an entire batch fails. (#372)
  • Bugfix: Auto DataStore now handling network fails correctly. (#374)
  • Validate files size when deploying websites
  • Breaking Change: To avoid possible rejections by the Apple App Review team, any support for login with MIC using UIWebView was removed. (#370)
  • Breaking Change: Minimum version for watchOS is now version 4.0
  • Bugfix: Fixing compilation because of PubNub 4.9 (#367)
  • Bugfix: Removing compiler warnings from Realm (#368)
  • Bugfix: Fixing Index for Errors when multiple requests are necessary (#369)
  • Known Bug: Version not available at CocoaPods, please use version 3.27.0
  • Show an output error if an identifier (e.g. --app) matches more than one entity
  • Improvement: Using Multi-Insert feature for Push when it is available (#363)
  • Bugfix: Bugfix for Auto File Store Type (#364)
  • Improvement: Multi-Record Insert allowing to save many items at once using DataStore.save() (#359 #361)
  • Improvements to the website deploy command:
    • Verify presence of index and/or error page
    • Ability to force the deploy using the --force flag
  • Add node12 (Node.js v.12) to flex commands that support Node.js runtime selection
  • Improvement: New methods pendingSyncCount(), pendingSyncEntities() and clearSync() to match with other platforms. Auto DataStore tests and changes around it. (#356)
  • Bugfix: Custom Client instance usage for aggregate functions on DataStore (#357)
  • Deprecated: DataStore.syncCount() deprecated in favor of DataStore.pendingSyncCount() (#356)
  • Support for Kinvey Web Hosting under the website command namespace
  • Improvement: Support for Xcode 10.2 and Swift 5 (#354) (#355)
  • The flex status command outputs statuses using upper case letters
  • Suggest command when token is expired
  • Use backend error when HTTP status code is 401
  • Improvement: Avoid blocking the UI thread when access to cache is required (#350)
  • Improvement: Make Client.userChangedListener public so changes to the logged in user can be listened to (#352)
  • Improvement: Adding new DataStore type .auto that prioritizes network requests and if they fail for network reasons, returns local cache data without calling the callback twice (#337)
  • Deprecated: DataStore type .cache is now deprecated in favor of .auto
  • Bugfix: Converting dates in queries to ISO 8601 format (#349)
  • Improvement: Allow clearCache() to delete nested objects (#348)
  • Bugfix: Crash when saving objects inside a List (#347)
  • Bugfix: Crash on signpost calls (#346)
  • Improvement: Allowing to perform queries using KeyPath syntax (#338)
  • Improvement: Cascade Delete performance improvement (#340)
  • Bugfix: Bugfix for $not queries (#339)
  • Bugfix: Crashing during open Realm not allowing recovery (#341 #342)
  • Validated support for node v6.x, node v8.x, and node v10.x
  • Updated dependencies
  • Adjusted Linitng and fixed linting issues
  • Bug fix: Preserve existing environment variables on flex deploy --set-vars <env variables>
  • Support for service environments when working with Flex services
  • Support for selecting a Node.js runtime version using --runtime
  • Bugfix: GeoPoint Codable Support (#334)
  • Bugfix: Be able to store dates as ISO 8601 strings (#335)
  • Bugfix: Optimize and bugfix for $and queries (#336)
  • The app create command now supports the --org option
  • Support for environment variables for internal Flex services
  • Help information for kinvey <namespace>
  • The development dependencies have been updated
  • Bugfix: Prevent multiple calls to initialize client (#333)
  • Improvement: Support for Apple Watch Series 4 (#332)
  • Bugfix: Prevent multiple calls to refresh token (#330)
  • Improvement: Minor fix and improvement for observe objects (#329)
  • Improvement: Adding basic support for command line apps (#324)
  • Improvement: Replace logger library dependency XCGLogger in favor of SwiftyBeaver and OSLog (#325)
  • Improvement: Reduce unused space in the cache file during launch. New optional parameter named compactCacheOnLaunch for the Client.initialize() method with the default value true (#327)
  • Bugfix: Codable support for Social Identities (#323)
  • Bugfix: Bugfix for crash when a non-objc property is set. Please override the User.refresh(anotherUser: refreshCustomProperties:) method in your User subclass if you have non-objc properties in your subclass (#326)
  • Improvement: Support for iOS 12 / Swift 4.2 / Xcode 10 (#321)
  • Bugfix: Codable support for EmailVerification and PasswordReset metadata objects (#319)
  • Bugfix: Storing refresh token from the correct source (#320)
  • Bugfix: Adding an overload method for the instanceId and encrypted parameters (#322)
  • Bugfix: Access to User.encode() changed from public to open (#316)
  • Bugfix: User.refresh() should not update authentication tokens (#317)
  • Bugfix: Large memory consumption during DataStore.pull() calls (#318)
  • Improvement: Support for list of primitive values for Codable (314)
  • Bugfix: Cache deletes were doing cascade deletes on objects referenced by other objects (#315)
  • Rename the env namespace to appenv
  • Ability to specify an organization when creating an app
  • Improvement: Support List<T> for Swift.Codable entities (#310)
  • Bugfix: Inconsistent cache results (#312)
  • Bugfix: Crashes related to ThreadSafeReference usage during transactions (#313)
  • Deprecated: DataStore<T>.deltaSet is now deprecated in favor of DataStore<T>.options
  • Bugfix: Persist Swift.Codable in cache (#309)
  • Bugfix: Cascade deletes during updates (#306)
  • Breaking Change: The User-to-User Communication flow of Live Service is not supported anymore (#307)
  • Prompt for 2FA token on profile login if required
  • Log output columns have been rearranged to show timestamp, log ID, and then logged message
  • Output logs properly when the log message is an object
  • Prompt for 2FA token on profile login if required
  • Log output columns have been rearranged to show timestamp, log ID, and then logged message
  • Output logs properly when the log message is an object
  • Improvement: Support for Swift.Codable, which replaces ObjectMapper (#303)
  • Improvement: Throw Error() instead of fatalError() everywhere to allow for recovery (#305)
  • Bugfix: Fixed memory leak in DataStore.removeAll() (#304)
  • Deprecated: ObjectMapper is now deprecated in favor of Swift.Codable
  • Breaking Change: Entity.CodingKeys renamed to Entity.EntityCodingKeys to avoid confusion when subclassing Entity
  • Breaking Change: DataStore<MyEntity>.collection() can now throw errors, so a try is now required, for example: try DataStore<MyEntity>.collection()
  • Breaking Change: Options() constructor can now throw erros, so a try is now required, for example: try Options(timeout: 120)
  • Breaking Change: Custom types used in CustomEndpoint calls now require you to implement the JSONDecodable protocol
  • FLEX-286 Fixed setQuery to propagate on FSR prehook
  • Stringify query.query and query.sort if they are objects before returning
  • FLEX-293 Removed SIGKILL handler to prevent crash
  • FLEX-270 Added graceful shutdown
    • Now on ctrl-c, SIGTERM, SIGINT, or SIGKILL, the sdk will attempt to wait for in-process tasks to finish.
    • Will time out and force-quit if all tasks aren't complete in 50 seconds
    • Pressing ctrl-c, or sending SIGINT/SIGTERM/SIGKILL a second time will terminate the process immediately.
  • FLEX-291 Remove lodash as a dependency
  • FLEX-290 Changed destination property in body for sendPush to recipients
  • Removed CoffeeScript as a dependency
  • Updated code-task-receiver to 2.3.1
  • Updated kinvey-datalink-errors to 0.3.2
  • Improvement: Returning support for tvOS on CocoaPods (#299)
  • Improvement: New Error Kinvey.Error.blRuntimeError to handle BL runtime errors (#301)
  • Deprecated: Client.ping(completionHandler:)
  • Deprecated: Push.unRegisterDeviceToken(_:)
  • See README for migration guide
  • BREAKING CHANGE: email and push modules now require a callback or promise handlers. They can no longer be executed as "fire and forget".
  • FLEX-206 Added Promise support to Asynchronous flex-sdk modules
    • dataStore
    • userStore
    • groupStore
    • push
    • email
  • FLEX-176 Add RoleStore
  • FLEX-240 Add endpointRunner to support executing of custom endpoints
  • FLEX-246 Use new KCS endpoints for push/email
  • FLEX-248 Removed deprecated skipBl and useMasterSecret options for all stores
  • FLEX-247 Change baasUrl property to retrieve it from top-level task object
  • Updated dependencies with nsp warnings
  • Removed lodash isNil package

Upgrading from 2.x to 3.x

Flex-sdk 3.x contains several breaking changes as well as new features. To upgrade your service from Flex-sdk 2.x to 3.x:

  • All email and push methods now return a promise. It is now required that you either handle the promise, or pass a callback.
  • For all stores (e.g. dataStore, userStore, etc), the deprecated options skipBl and useMasterSecret have been removed and no longer function. Use useBl and useUserContext instead.
  • All asynchonous modules (dataStore, groupStore, roleStore, endpointRunner, userStore, email, and push) now return a promise or accept a callback.
  • For more information on what's new, see the Changelog.

Open the Flex SDK GitHub repo for more information and source code.

  • Improvement: Better code coverage (#297)
  • Breaking Change: Deprecations made on or before 3.15.0 are now removed completely. See the complete list of API Differences (#295)
  • Deprecated: Client.initialize(appKey:appSecret:accessGroup:apiHostName:authHostName:encrypted:schema:completionHandler:)
  • Deprecated: Client.initialize(appKey:appSecret:accessGroup:apiHostName:authHostName:encryptionKey:schema:completionHandler:)
  • Deprecated: CustomEndpoint.CompletionHandler
  • Deprecated: CustomEndpoint.execute(_:params:client:completionHandler:)
  • Deprecated: DataStore.pull(_:deltaSetCompletionHandler:deltaSet:completionHandler:)
  • Deprecated: DataStore.purge(_:completionHandler:)
  • Deprecated: DataStore.push(timeout:completionHandler:)
  • Deprecated: DataStore.sync(_:deltaSetCompletionHandler:deltaSet:completionHandler:)
  • Deprecated: Entity.Key.acl
  • Deprecated: Entity.Key.entityId
  • Deprecated: Entity.Key.metadata
  • Deprecated: FileStore.download(_:storeType:ttl:completionHandler:)
  • Deprecated: FileStore.download(_:ttl:completionHandler:)
  • Deprecated: FileStore.find(_:ttl:completionHandler:)
  • Deprecated: FileStore.refresh(_:ttl:completionHandler:)
  • Deprecated: FileStore.remove(_:completionHandler:)
  • Deprecated: FileStore.upload(_:data:ttl:completionHandler:)
  • Deprecated: FileStore.upload(_:image:imageRepresentation:ttl:completionHandler:)
  • Deprecated: FileStore.upload(_:path:ttl:completionHandler:)
  • Deprecated: FileStore.upload(_:stream:ttl:completionHandler:)
  • Deprecated: Metadata.Key.authtoken
  • Deprecated: Metadata.Key.entityCreationTime
  • Deprecated: Metadata.Key.lastModifiedTime
  • Deprecated: User.PersistableUsernameKey
  • Deprecated: User.changePassword(newPassword:completionHandler:)
  • Deprecated: User.exists(username:client:completionHandler:)
  • Deprecated: User.forgotUsername(email:client:completionHandler:)
  • Deprecated: User.get(userId:client:completionHandler:)
  • Deprecated: User.login(authSource:_:createIfNotExists:authServiceId:client:completionHandler:)
  • Deprecated: User.lookup(_:completionHandler:)
  • Deprecated: User.resetPassword(usernameOrEmail:client:completionHandler:)
  • Deprecated: User.save(newPassword:completionHandler:)
  • Deprecated: User.sendEmailConfirmation(forUsername:client:completionHandler:)
  • Deprecated: User.signup(username:password:user:client:completionHandler:)
  • Improvement: MIC support for the Resource Owner Credentials Grant flow (#290)
  • Improvement: Outdated compiler warnings removed (#291)
  • Bugfix: Use autopaging when Delta Sync is not available (#289)
  • Bugfix: Fix inconsistencies when Delta Sync is enabled and an autopaging request fails (#292)
  • Bugfix: Fix inconsistencies when Delta Sync is enabled and fields is used in the query (#293)
  • Bugfix: Correctly handle OAuth MIC errors in a returned redirect URI (#294)
  • Deprecated: User.login(redirectURI:username:password:). Use User.login(username:password:provider:options:completionHandler:) instead
  • Ability to create internal Flex services using flex create.
  • Ability to delete internal Flex services using flex delete. Note that this command name was used to clear Node.js project setting in previous versions.
  • The flex delete command available in previous versions has a new name: flex clear. It keeps its behavior.
  • All delete commands now require confirmation that you can avoid using the new --no-prompt flag (available only for delete commands).
  • Unknown hyphenated options or flags now cause the command to exit with an error instead of being ignored.
  • Dependency updates: moment.js, request.js.
  • Improvement: X-Kinvey-Device-Info is a new header that includes more information about the device (#282)
  • Improvement: Upgrading PromiseKit to version 6 (#284)
  • Improvement: The client-side Delta Set feature has been replaced by a server-side implementation called Delta Sync (Beta) that offers better performance and scalability (#261, #286, #287)
  • Improvement: Default log level is now .warning (#283)
  • Bugfix: Make the ValidationStrategy work as intended (#285)
  • Bugfix: Canceling DataStore.find() requests not working in some situations (#288)
  • Added role helper to the kinveyEntity module
  • Disable the proxy when using dataStore
  • Disable the proxy for push and email modules
  • Fixed errors for null or empty entityIds for dataStore, groupStore, and userStore
  • Updated the request module to 2.85.0
  • Updated code-task-receiver to 2.2.3 to add response object parsing for FlexFunctions

Open the Flex SDK GitHub repo for more information and source code.

  • Support for managing apps within your Kinvey account: creating, listing, viewing details, deleting, and setting as active.
  • Support for managing environments within your Kinvey account: creating, listing, viewing details, deleting, and setting as active.
  • Support for managing collection within a Kinvey app: creating, listing, and deleting.
  • Ability to view organizations and set an organization as active.
  • The profile login command updates the token only.
  • Improvement: Send scope parameter to all MIC versions (#273)
  • Improvement: Thread-safe reference observer (#275)
let person: Person = <#...#>
let notificationToken = person.observe { (objectChange: Kinvey.ObjectChange<Person>) in
    switch objectChange {
    case .change(let person):
        print("person object changed")
    case .deleted:
        print("person object deleted")
    case .error(let error):
        print("\(error)")
    }
}

let dataStore = DataStore<Person>.collection(.sync)
let notificationToken = dataStore.observe {
    switch $0 {
        case .initial(let results):
            print("initial results")
        case .update(let results, let deletions, let insertions, let modifications):
            print("dataStore changed")
        case .error(let error):
            print("\(error)")
    }
}
  • Improvement: Allow usage of authServiceID for MIC calls (#277)
  • Improvement: User and Entity now conforms to Hashable and Equatable (#279)
  • Bugfix: DataStore.removeAll() request was wrong (#274)
  • Bugfix: Queries were not translated correctly for non-entity classes, like Acl for example (#278)
  • Bugfix: Live Service messages not coming with strict permissions (#280)
  • Support for 2-factor authentication. See the --2fa global option.
  • New command for reauthenticating the specified profile: kinvey profile login.
  • Ask for profile override if profile already exists on kinvey init.
  • Use active profile if no other specified on kinvey profile delete.

Open the Kinvey CLI GitHub repo for full documentation and source code.

  • Improvement: DataStore instances are not cached anymore allowing multiple configurations for the same DataStore (#272)
  • Improvement: HTTP header User-Agent now includes the Swift version (#270)
  • Improvement: Client instances can now be created using instanceID (#267)
Kinvey.sharedClient.initialize(appKey: "myAppKey", appSecret: "myAppSecret", instanceId: "my-instance-id") {
    switch $0 {
        case .success(let user):
            print("\(user?.userId ?? "nil")")
        case .failure(let error):
            print("\(error)")
    }
}
  • Bugfix: Memory consumption fixed for DataStore<T>.find() calls (#268)
  • Bugfix: FileStore now returns the proper result types for sync wait calls (#266)
  • Bugfix: User lockdowns now is fully supported automatically logging out users in lockdown state (#265)
  • Breaking Change: Client.timeout is now a shortcut for Client.options.timeout (#271)
  • Breaking Change: Default MIC API Version is now v3 (#269)
  • Support for entering Instance ID instead of instance URL for dedicated client instances
  • More detailed and useful error messages
  • The flex deploy command now accepts --serviceId
  • The flex init command now requires a profile and ignores the --email, --password, and --host options
  • Support for outputting in JSON format
  • New --no-color flag for disabling colors in output
  • Bug fixes

Open the Kinvey CLI GitHub repo for full documentation and source code.

  • Improvement: Adding Options for Client (#264)
  • Bugfix: Bugfix for property mapping in nested objects (#260)
  • Bugfix: Bugfix removing the internal usage of Thread.threadDictionary to avoid memory leaks (#263)
  • Bugfix: Memory leak fixed around object mapping. (#262)
  • Improvement: Make the page size adjustable for auto pagination. (#259)
  • Improvement: Removing warnings for Swift 4 and above. (#256)
  • Bugfix: Find by ID must return Error.entityNotFound error when no entity was found. (#257)

Install the latest beta using npm install -g kinvey-cli@next.

  • Support for using multiple Kinvey accounts through profiles
  • All Flex-related commands move under the flex namespace (e.g. status becomes flex status)
  • New commands:
    • init—Initializes Kinvey CLI by prompting for credentials and configurations options
    • flex init—Configures Kinvey CLI to work with a specific Flex Service
  • All commands (except for init) can now take credentials as command-line options or ENV variables
  • Removed commands:
    • config
    • logout
  • New command-line options specific to commands under the flex namespace
  • The request timeout has been increased to 10 s
  • Improvement: Upgrade dependencies to Realm 3.x, ObjectMapper 3.x and XCGLogger 6.x.
  • Bugfix: User.socialIdentity was not being persisted. (#255)
  • Bugfix: Binary compatibility for Xcode 9.1 / Swift 4.0.2
  • Roles - Created roles guide.
  • status command now reports the email address (plus first/last name, if set) of deployer and the date/time at which service was deployed
  • Improvement: New enumeration added: ValidationStrategy. A ValidationStrategy allows you to validate data from the backend before it is parsed into your client-side model. You can choose from predefined options: .all, .randomSample(percentage:) or define your own strategy with .custom(validationBlock: (Array<Dictionary<String, Any>>) -> Swift.Error?). By default, the SDK does not validate individual entities before they are parsed. Please see Reference Docs for details on using ValidationStrategy. (#248)
let dataStore = DataStore<Person>.collection(.network, validationStrategy: .all)
  • Bugfix: Transforms were being ignored when saving objects that requires transformations, such as Date objects for example (#250)
  • status command now reports the version of the most recently-deployed service
  • logs command enhancements
    • [from] and [to] optional arguments replaced with --from and --to flags
    • Added -n (--number) and --page flags
    • Only 100 entries are returned by default unless the -n flag is supplied
  • Improvement: Better Support for Xcode 9 and Swift 4.0 while keeps support for Swift 3.2 (#245)
  • Improvement: FileStore.create() creates a file entry in the server so the fileId can be used to perform resumable uploads (#239)
  • Improvement: Allow custom URLSession for each call using Options (#244)
  • Improvement: Support for SFAuthenticationSession for iOS 11, otherwise use SFSafariViewController (#246)
  • Bugfix: Register for push notifications not being called in main thread (#240)
  • Bugfix: Infinite loop if they keyword dynamic not being used in the property declaration on Entity subclasses (#243)
  • Bugfix: DataStore.syncCount() and DataStore.sync() considering entities that are not the generic class specified on DataStore (#247)
  • Improvement: Make explicit that _id is required (#234)
  • Improvement: New Feature: DataStore<T>.collection(autoPagination: true) enables auto pagination, so no need to do it manually. This feature is disabled by default, so DataStore<T>.collection() means DataStore<T>.collection(autoPagination: false) (#231)
  • Improvement: User.logout() is now async since it performs a network request to invalidate the token in the backend (#237)
  • Bugfix: File.mapping() was not open (#233)
  • Bugfix: During save() the cache implementation now performs deletes on nested objects (#229)
  • Bugfix: Cache path on macOS was ~/Documents/<kinvey app key>, but should be ~/Library/Application Support/<bundle id>/<kinvey app key> (#236)
  • Breaking Change: The clientId parameter was renamed to authServiceId in User.presentMICViewController(), User.login() and Options() (#238)
  • Breaking Change: Now Kinvey.Error.unauthorized also includes a debug property. So now a switch case should look like case .unauthorized(let httpResponse, let data, let error, let debug, let description): (#235)
  • Improvement: Better performance and lower memory consumption by overloading the methods find(), pull() and sync() that now has a Result<AnyRandomAccessCollection<T>, Swift.Error> as the result for the completion handler.
  • Fixed bug resulting in 2FA login crash
  • ES6 rewrite
  • Support 2FA token login
  • Add ability to login to the CLI using ENV variables
  • Improvement: Better support for tvOS, watchOS and macOS
  • Improvement: Minor fix for reference documentation on DataStore.count()
  • Improvement: Better reference documentation
  • Improvement: pull() has now a new (optional) parameter called deltaSetCompletionHandler which is a completion block that returns only the results that have changed during the delta set computation. The regular completionHandler parameter will continue to return all the results (including the unchanged results)
  • Improvement: New struct Options is introduced to hold custom optional values such as client, clientId, ttl, deltaSet, readPolicy, writePolicy, timeout, clientAppVersion and customRequestProperties. Maybe more to be added in the future.
  • Bugfix: count() were not translating queries when alias were used
  • Bugfix: Crashing when an error was returned from the backend but with an empty body
  • Deprecated: All methods in the DataStore class that takes a Client instance, ReadPolicy, WritePolicy, deltaSet and timeout values as optional parameters are now deprecated in favor of the Options new struct.
  • Breaking Change: Client.clientAppVersion and Client.customRequestProperties were removed in favor of Client.options which contains both clientAppVersion and customRequestProperties.
  • Improvement: Live Service is now EA (Early Adopter) for our Swift SDK. Please check our Live Service documentation
  • Bugfix: User.refresh() was losing authentication
  • Bugfix: Query objects with values containing the character + were causing a wrong URL encoding
  • Fixed bug where instance param was not respected when running config [instance] in a fresh environment
  • Bugfix: Compilation errors after ObjectMapper 2.2.7 Release
  • Improvement: Files are now able to have custom properties subclassing the File class and specifying when create your FileStore instance, for example: let fileStore = FileStore<MyFileSubclass>()
  • Improvement: Push.unRegisterDeviceToken() now returns an error instead of crash if the device token was not found
  • Improvement: Support for MIC authentication service selection using the clientId parameter when called MIC.urlForLogin() or User.presentMICViewController()
  • Bugfix: Query using dates were being misconstructed when sent to the backend
  • Deprecated: FileStore.getInstance() in favor of the usage of constructors FileStore<File>()
  • Deprecated: Global constants PersistableIdKey, PersistableAclKey and PersistableMetadataKey in favor of Entity.Key.entityId, Entity.Key.acl and Entity.Key.metadata respectively
  • Deprecated: Metadata.LmtKey, Metadata.EctKey and Metadata.AuthTokenKey in favor of Metadata.Key.lastModifiedTime, Metadata.Key.entityCreationTime and Metadata.Key.authToken respectively
  • Fixed crash on config against the default instance (under certain scenarios)
  • Bugfix: User.socialIdentity properties were not public
  • Bugfix: User custom type was not properly loaded after a relaunch
  • Improvement: Client class now have a new method ping() to test if the client was initialized correctly.
Kinvey.sharedClient.ping() { (result: Result<EnvironmentInfo, Swift.Error>) in
    switch result {
    case .success(let envInfo):
        //succeed
    case .failure(let error):
        //failed
    }
}
  • Improvement: DataStore.group() is a set of new methods that allows group / aggregation functions. You can write your own reduce function using JavaScript or use pre-defined functions like count, sum, avg (average), min (minimum) and max (maximum).
dataStore.group(keys: ["country"], avg: "age") { (result: Result<[AggregationAvgResult<Person, Int>], Swift.Error>) in
    switch result {
    case .success(let array):
        //succeed
    case .failure(let error):
        //failed
    }
}
  • Improvement: a new method User.refresh() will reload the user's data. Also applies for Client.activeUser which will refresh and persist the new user's data.
Kinvey.sharedClient.activeUser?.refresh() { result in
    switch result {
    case .success:
        //succeed
    case .failure(let error):
        //failed
    }
}
  • Improvement: a new pattern for all completionHandlers in the library was introduced. All methods containing completionHandlers has now overloaded versions which returns a Result<SuccessType, FailureType> instance where you can use a switch statement to figure if the call succeed (case .success(let successObject):) or failed (case .failure(let error):)

  • Bugfix: User.lookup() now returns the correct User type if a custom user type was set.

  • Breaking Change: User.destroy(), User.sendEmailConfirmation(), User.resetPassword() and User.forgotUsername() were changed to have the completionHandler block following the Result enumeration pattern described above.

user.sendEmailConfirmation() { result in
    switch result {
    case .success:
        //succeed
    case .failure:
        //failed
    }
}
  • Improvement: Support for Swift 3.1 / Xcode 8.3
  • Improvement: Better support for upload data from an input stream
  • Improvement: Better performance for DataStore.push() and DataStore.sync()
  • Improvement: Device token is now deleted on the device after call Push.unRegisterDeviceToken()
  • Improvement: Added a new Error case for situations when there's some missing configuration in the console
  • Bugfix: Local query crashing when a field was not found on entity
  • Bugfix: User credentials lost after upgrade to a newer version of the SDK. Versions affected: 3.3.8 and 3.3.9
  • Deprecated: DataStore.removeById() method is now deprecated
  • Bugfix: crash when trying to upload a file with a pre-defined fileId
  • Bugfix: crash when a protocol marked as @objc is used inside of an Entity subclass
  • Bugfix: warning about pending promises being deallocated while using FileStore
  • Deprecated: FileStore.download(_ file: inout File) is now deprecated. Please use FileStore.download(_ file: File). The download method does not require you to pass the file reference anymore.
  • Added HTTPS proxy usage information to README
  • Bug fix: Acl and Metadata fixed for File objects
  • Improvement: add support for geolocation queries. You should now use GeoPoint class to store geolocation coordinates (latitude, longitude)
class Vehicle: Entity {

    dynamic var name: String?
    dynamic var geolocation: GeoPoint?

    override class func collectionName() -> String {
        return "Vehicle"
    }

    override func propertyMapping(_ map: Map) {
        super.propertyMapping(map)

        name <- ("name", map["name"])
        geolocation <- ("geolocation", map["geolocation"])
    }
}

let deliveryTruck = Person()
deliveryTruck.name = "Package Delivery Truck"
deliveryTruck.geolocation = GeoPoint(latitude: 42.3133521, longitude: -71.1271963)
  • Improvement: add support for mapping list of String, Int, Float, Double and Bool
import Kinvey

class Book: Entity {

    dynamic var title: String?
    let authorNames = List<StringValue>()

    override class func collectionName() -> String {
        return "Book"
    }

    override func propertyMapping(_ map: Map) {
        super.propertyMapping(map)

        title <- ("title", map["title"])
        authorNames <- ("authorNames", map["authorNames"])
    }

}

let book = Book()
book.title = "Swift for the win!"
book.authorNames.append("Victor Barros")
  • Improvement: Kinvey.Error objects now conforms to LocalizedError
  • Improvement: Legacy code from version 1.x is now completely removed
  • Bug fix: MIC was not refreshing the authentication token
  • Fixed bug which resulted in a 'ProjectNotConfigured' error when running the list command with a successfully configured project
  • Fixed bug which resulted in a CLI crash when parsing/printing non-string log message data
    • Skip log entries which have no corresponding message (and report which entries have been skipped when running CLI in verbose mode)
  • Improvement: CustomEndpoint now supports arrays and custom types
  • Bug fix: Updates of existing objects causing a crash
  • Bug fix: KinveyDateTransform missing a public constructor
  • Bug fix: incorrect access modifiers on UserMetadata properties
  • Bug fix: crash on FileStore.getInstance() if invoked before the creation of a DataStore instance
  • Deploy fix: zip distribution of SDK was missing XCGLogger 3rd party library
  • Bug fix: KinveyDateTransform missing a public constructor
  • Bug fix: UserMetadata properties without a public access
  • CLI now supports operations against data links backed by Kinvey organizations
  • kinvey config targets the default Kinvey instance for data link selection if a host is not provided (even if the CLI was previously configured with a custom host)
  • Fixed 'Archive Limit Exceeded' bug occasionally encountered during deployment of valid Kinvey services from within Windows environments
  • Update CLI update check frequency (interval shortened to 30 minutes)
  • Fixed bug where 'ProjectNotConfigured' was not correctly displayed after attempting to execute commands without a valid CLI configuration
  • Improvement: throw an error if super.propertyMapping() was not called inside of the propertyMapping() method for a Entity subclass
  • Improvement: logging is now done by a 3rd party library called XCGLogger.
  • Improvement: Push now supports the new Push API in iOS 10. A new method was added for apps to register for push: Push.registerForNotifications() (all parameters optional). The previous method Push.registerForPush() is now deprecated for iOS 10 and above.
Kinvey.sharedClient.push.registerForNotifications { granted, error in
    if granted {
        //registered successfully
    } else {
        //failed to register
    }
}
  • Bug fix: User object nil after MIC login succeeds
  • Improvement: Kinvey.Error now implements CustomStringConvertible and CustomDebugStringConvertible which means you can now print() and debugPrint() errors. Also, errors now have the httpResponse and data properties, which allows you to check http status codes and the response body.
  • Deprecation: class method User.resetPassword(email:) and User.resetPassword(username:) are now deprecated. Please use the class method User.resetPassword(usernameOrEmail:) instead.
  • Bug fix: Fix for CocoaPods and Carthage.
  • Bug fix: Temporary _ids values are being sent to the backend.
  • Bug fix: If a migration schema block is not provided, the local cache is deleted on a schema mismatch between versions.
  • Bug fix: Progress not being reported if the Content-Length header was not present in the response.
  • Improvement: Kinvey.Error now implements CustomStringConvertible and CustomDebugStringConvertible which means you can now print() and debugPrint() errors. Also errors now also have the httpResponse and data properties allowing you to check things like http status codes and the response body for example.
  • Improvement: adding custom fields during sign up.
client.userType = MyUser.self

let user = MyUser()
user.foo = "bar"
User.signup(user: user) { user, error in
    if let user = user {
        //success
    } else {
        //failure
    }
}
  • Bug fix: updated the following request headers -
    • User-Agent
    • X-Kinvey-Client-App-Version
    • X-Kinvey-Device-Information
  • Enhancement: New API added for the developer to set an app version. This value is sent to the backend as the X-Kinvey-Client-App-Version request header.
Kinvey.sharedClient.clientAppVersion = "1.0.0"
  • Bug fix: migration schema not being executed is now fixed. If you made changes to your entity classes, make sure that you increase the schema version and provide a migration block as shown below:
// Version 1
class Person: Entity {

    dynamic var firstName: String?
    dynamic var lastName: String?

    override class func collectionName() -> String {
        return "Person"
    }

    override func propertyMapping(_ map: Map) {
        super.propertyMapping(map)

        firstName <- map["firstName"]
        lastName <- map["lastName"]
    }

}

// Version 2
class Person: Entity {

    dynamic var fullName: String?

    override class func collectionName() -> String {
        return "Person"
    }

    override func propertyMapping(_ map: Map) {
        super.propertyMapping(map)

        fullName <- map["fullName"]
    }

}

// Migrating your data during client initialization
Kinvey.sharedClient.initialize(appKey: "<#appKey#>", appSecret: "<#appSecret#>", schemaVersion: 2) { migration, oldSchemaVersion in
    migration.execute(Person.self) { (oldEntity) in
        var newEntity = oldEntity
        if oldSchemaVersion < 2 {
            newEntity["fullName"] = "\(oldEntity["firstName"]!) \(oldEntity["lastName"]!)"
            newEntity.removeValue(forKey: "firstName")
            newEntity.removeValue(forKey: "lastName")
        }

        return newEntity
    }
}
  • Same changes presented in the 3.3.3 version, but for projects using Swift 2.3
  • Remove duplicate 'host' output during config command when using custom Kinvey instance
  • Cache last recycle job ID
  • Update session storage filename
  • Add support for refactored KBW/KMR 'status' command. Repurpose existing 'status' command into 'job'
  • Cache last deploy job for ease of retrieval using kinvey job
  • Add support for logging thresholds (requires Flex SDK >= 1.0.0)
  • Allow setting of persistent host via kinvey config [instance]
  • config command now prompts for a new service on every run (fixed prior bug where it did nothing if saved data was already present)
  • Upgrade CLI to check for kinvey-flex-sdk (instead of kinvey-backend-sdk)
  • logs command now takes optional runtime arguments (instead of prompting for log filters)
  • Obfuscate instance URLs at configuration time (e.g. kinvey config acme-us1)
  • Fixed bug where credentials were improperly cleared during logout/refresh
  • Fixed bug where status command (no arg command) crashed if supplied with an argument
  • Support for Xcode 8.1 and Swift 3.0.1
  • Minimum iOS version is now iOS 9
  • Improvement: User.presentMICViewController() now uses SFSafariViewController as the default option to login using MIC. To explore other options add the parameter micUserInterface using one of the options in the MICUserInterface enum.
User.presentMICViewController(redirectURI: URL(string: "<#myRedirectURL://#>")!) { (user, error) -> Void in
    if let user = user {
        self.userIdLabel.text = user.userId
    }
    self.completionHandler?(user, error)
}

If you are using the default .safari option for the micUserInterface, remember to add the code below in your app delegate.

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    if User.login(redirectURI: URL(string: "<#myRedirectURL://#>")!, micURL: url) {
        return true
    }

    return false
}
  • Minimum iOS version is now iOS 9
  • Improvement: User.presentMICViewController() now uses SFSafariViewController as the default option to login using MIC. To explore other options add the parameter micUserInterface using one of the options in the MICUserInterface enum.
User.presentMICViewController(redirectURI: NSURL(string: "<#myRedirectURL://#>")!) { (user, error) -> Void in
    if let user = user {
        self.userIdLabel.text = user.userId
    }
    self.completionHandler?(user, error)
}

If you are using the default .Safari option for the micUserInterface, remember to add the code below in your app delegate.

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
    if User.login(redirectURI: NSURL(string: "<#myRedirectURL://#>")!, micURL: url) {
        return true
    }

    return false
}
  • Fix for CocoaPods
  • Fix for CocoaPods
  • Support for Swift 3 and Xcode 8

  • This version of the SDK requires Swift 3 and XCode 8 (or above).

  • Known issue: several Kinvey app developers have reported seeing a Keychain issue when the app logs in a user on iOS 10 Simulator. The error message looks like the following: Terminating app due to uncaught exception 'KinveyException', reason: 'Could not write token to keychain. Err (null) (-34018)' This is a known issue with the iOS 10 simulator. To work around it, you can share the keychain.

  • Support for Swift 2.3 and Xcode 8

  • This version of the SDK requires Swift 2.3 and XCode 8 (or above). If you are using Swift 2.2, please refer to the SDK release 3.1.x.

  • Bug fix: Regular expressions for Query objects not working properly
  • Improvement: Upload, download and a few DataStore operations like find() and pull() can now report progress of the request
let request = store.find() { (events, error) in
    //completion handler
}

request.progress = {
    //progress handler
    print("Progress: \($0.countOfBytesReceived)/\($0.countOfBytesExpectedToReceive)")
}
  • Improvement: New method DataStore.count() returns the total number of records in a colletion.
let store = DataStore<Event>.collection(.Network)
store.count { (count, error) in
    //completion handler
}
  • Improvement: Query now supports skip and limit modifiers, enabling support for pagination.
let query = Query {
    $0.skip = 10
    $0.limit = 50
}

store.find(query) {
    //it will get max of 50 results starting from the 11th record
}
User.loginWithAuthorization(redirectURI: "myRedirectURI://", username: "myUsername", password: "myPassword") { user, error in
    if (user != nil) {
        //logged in successfully
    } else if (error != nil) {
        //something went wrong if the error object is not nil
    } else {
        //should never happen!
    }
}
  • Bug fix: find() operations returning wrong results for StoreType.Network
  • Improvement: Forgot username method is now available:
User.forgotUsername(email: "your@email.com") { error in
}
  • Improvement: User lookup method is now available:
let userQuery = UserQuery {
    $0.username = username
}
user.lookup(userQuery) { users, error in
}
  • Improvement: Files are now cached by default:
let file: File = ...
fileStore.download(file) { (file, url: NSURL?, error) in
    //file is now cached
}

With an optional parameter to not cache the downloaded files:

let file: File = ...
fileStore.download(file, storeType: .Network) { (file, url: NSURL?, error) in
    //file is not cached
}
  • Improvement: MIC API Version is not available:
client.micApiVersion = "v2" //v1 is the default value
  • Improvement: Better errro handling returning more appropriate error types
  • Bugfix: deltaSet parameter was not being considered for sync operations
  • Bugfix: custom User types are not working correctly
  • Bugfix: DeltaSet requests being wrongly built
  • Bugfix: Pull requests are now consistent between platforms
  • Support node 6.x
  • Fixing dependencies for CocoaPods spec.
  • API breaking changes:
    • Object Mapping has changed: Please check out our Data Store Guide how to do object mapping now.
    • Method renaming: To get an instance of DataStore you now have to call the collection() method instead of getInstance()
  • Improvement: Change user's password
let user: User = ...
user.changePassword(newPassword: "myNewPassword") { user, error in
}
  • Improvement: Send user's email verification
let user: User = ...
user.sendEmailConfirmation { error in
}
  • Improvement: Social login for Facebook, Twitter, Google+ and LinkedIn
User.login(authSource: .Facebook, facebookAuthDictionary) { user, error in
}
  • Improvement: Added support for push(), pull(), sync() and purge() operations on DataStoreType.Cache
  • Improvement: DataStore.syncCount() method added
  • Improvement: Client.logNetworkEnabled enables the ability of log network requests and responses. Default value is false
Kinvey.sharedClient.logNetworkEnabled = true //it will start log network requests and responses
  • Improvement: Better error handling checking pre-required conditions
  • Bugfix: not crashing for non-supported types and support for NSCoding objects, more support types to come
  • Bug fix: Login with MIC sending wrong authorization headers.
  • Support for split the local cache data in multiple files using tags. For example: DataStore<MyCollection>.getInstance(.Network, tag: "MyCustomDataContainer")
  • Acl now includes readers and writers permissions.
  • Error now includes a localized description error. Available only in English for now.
  • FileStore now supports resumable uploads and downloads.
  • Delta Set Cache is not enabled by default anymore. To enable Delta Set Cache now you can call something like DataStore<MyCollection>.getInstance(.Network, deltaSet: true)
  • Bug fix: Login with MIC when the user does not exists yet.
  • Bug fix: returning wrong results when there's an empty DataStore with delta set cache enabled.
  • Allow encryption on your local DataStores
  • Better handling for push() method
  • Bug fix: returning wrong results when there's no change in a DataStore with delta set cache enabled.
  • Performance improvements on delta set caching
  • Bug fix: allow custom serialize and deserialize Persistable objects using fromJson() and toJson() methods
  • Handle authentication errors when deploying.
  • Add support for custom endpoints
  • Allow custom file path for DataStore
let store = DataStore<MyPersistableClass>.getInstance(filePath: customPath)
  • Bug fixes
    • Logout User
    • ACL as a mandatory field
    • Register for Push
  • Bug fixes
  • Xcode 7.3 and Swift 2.2 ready
  • Delta Set Cache implemented
  • Bug fixes
  • Do not display progress message for completed jobs.
  • Display progress and error messages when retrieving deploy status.
  • Universal binary Framework available
  • Bug fixes:
    • Purge, push and sync reviewed
    • Metadata entities removed when related entities are removed
    • Some queries causing crashes

The beta version of the iOS 3.0 SDK is now available!

New in this release:

  • Full support for data synchronization between your app and backend. Refer to the Data Store Guide to learn how to use the new data manipulation APIs.

  • We've simplified data stores and caching policies, making it easier for you to start building apps with caching and offline built in.

  • The Kinvey framework is now a published as a module.

Code samples and API docs for Objective-C are coming soon.

  • Implement logs command
  • RapidData - Added the documentation for zero-code SharePoint, SQL and Salesforce connectors.
  • Import/Export - Added the documentation for zero-code SharePoint, SQL and Salesforce connectors.
  • Refactor routes.
  • Upgraded request module to v2.65.0
  • Upgraded async module to v1.4.2
  • Upgraded moment to v2.10.6
  • Added modules.twilio library for twilio support
  • Renew expired tokens.
  • Updated dependencies.
  • Initial version.
  • When navigating to a collection that no longer exists, the link to the dashboard will now navigate to the environment dashboard.
  • Improved collection navigation for users with multiple browsers or computers
  • Verifying an email address no longer requires clicking a button
  • New underlying execution engine
  • Business Logic now includes access to node.js v0.10.38 core libraries and APIs
  • Added support for Bluebird promises and promise-enabled the Collection Access and Request modules.
  • Added cc and bcc to Email module
  • Methods in logger, push, and email moduels now take callbacks
  • New Kinvey Module, which allows creation/updating of metadata in Kinvey Entities, and allows for ACL management
  • Deprecated use of utils.kinvey in favor of the Kinvey module
  • Deprecated request.username in favor of requestContext.getAuthenticatedUsername
  • Added requestContext module with support for:
    • Retrieving request username and request userId
    • Retrieving and setting custom request properties
    • Retrieving client-side app version information
  • Deprecated use of backendContext.getAuthenticatedUsername() as it has been moved to requestContext
  • Internal Improvements
  • Data Browser - Fixed but where _kmd and _acl properties would not automatically update when editing other fields
  • Business Logic - Fixed a bug that was preventing business logic from being saved.
  • Data - Collection list refreshes it's content on environment change properly
  • Internal Improvements
  • Internal Improvements
  • Users - Fixed empty user splashscreen CSS issue
  • Users - Bypass business logic button is now functional
  • Small Bugfixes
  • Files - Max file size allowed in file uploads has been updated
  • File uploads across the entire application have been improved
  • Fixed issue when navigating in the databrowser with the arrow keys
  • API Console - Autocompletion is now improved
  • Data Browser - The filter panel is collapsed automatically on page transition
  • Environments - Archived environments have a better display, and will automatically unarchive
  • Business Logic - BL scripts can be renamed
  • Small Bugfixes
  • Bugfixes
  • Internal Improvements
  • New beta console released, designed from the ground up with your feedback along the way.
  • Internal improvements
  • Added collectionAccess.collection.collectionExists method to check if a collection exists
  • Internal Improvements
  • Internal improvements
  • Internal Improvements
  • Increased timeout for long running tasks.
  • Collaboration - Fixed bug where users could not be invited to collaborate to an environment when they already work on a different environment
  • API Console - Fixed bug with the DELETE method getting back an error related to missing a body
  • Databrowser - We no longer sort on collections that are too large to be sorted
  • Internal Improvements
  • Changes to moment module
    • Upgrade to moment 2.5.x
    • Adds new methods associated with moment 2.5
      • as
      • get
      • set
      • min
      • max
      • toISOString
      • quarter
      • weekday
      • isoWeekday
      • weekYear
      • zone
      • parseZone
      • isDSTShifted
    • Adds support for duration objects
    • Fixes several methods that accepted moments as arguments
  • New tempObjectStore in utils module, for storing transient data and objects within the same request
  • New backendContext method getAuthenticatedUsername for retrieving the name of the user who initiated the request
  • Internal improvements
  • Users - Fixed bugs when trying to fetch a user that does not pass form validation
  • Scheudled Code - Added new shorter intervals to schedules
  • Internal Stability Improvements
  • Versioning - Added notification to users that they have a stale version of the client
  • Custom Endpoints - Improved error handling
  • Users - You can now add users when the collection is configured as read-only from the console
  • Import - Added better file validation
  • Internal Stability Improvements
  • BL-CLI - Fixed issue when trying to get hooks that are defined against data links for the CLI.
  • Internal Improvements
  • Internal Stability Improvements
  • Internal Stability Improvements
  • Users - When creating users through the console and the email verification flag is set, the email field will be required
  • Push - Fixed a bug that would cause a failure of push if a user's configuration was in an inconsistent state
  • Data Store - Fixed incorrect errors that would render on destroying or renaming a collection
  • Error Handling - Drastically reduced the number of "Uh, oh" and "broken pipes" style errors across the board.
  • API Console - Added support for using Microsoft Dynamics Data Links
  • Collection Hooks - Fixed issue that prevented the page from loading when custom data links are enabled
  • Internal Stability Improvements
  • Internal Stability Improvements
  • Custom Data Link - Unified interface to match how the other data links function
  • Internal Improvements
  • In email module, if reply to is null, reply to is now set to the from address.
  • Internal Improvements
  • Internal Stability Improvements
  • Fixed issue with scheduled tasks not running properly
  • Fixed bug with icons not showing up for apps
  • Internal Stability Improvements
  • Updated copyright to 2014
  • Internal Stability Improvements
  • Internal Stability Improvements
  • Added tooling to better track down future errors
  • Fixed a bug with Business Logic logs that would cause slowdowns
  • Internal Stability Improvements
  • Internal Improvements
  • Fix for some outbound requests using the request module timing out too quickly
  • Internal Improvements
  • Decreased error rates across the board with better error handling
  • Internal Stability Improvements
  • Internal Improvements
  • Outbound requests using the request module are now limited to 20 per second per app environment
  • url argument now accepted as an alias to uri in request module
  • Fix issue where errors logged through the logger module would be written to the log as an empty object
  • Internal Improvements
  • Removed Yahoo Local addon.
  • Fixed bug with links being generated with .... instead of the characters in the name
  • Internal Stability Improvements
  • Business Logic - Added support for common Business Logic from the command line tool.
  • Users - Added configuration for password reset URL in settings page
  • Internal Stability Improvements
  • Internal Stability Improvements
  • Updated support phone number
  • Improved error handling when rolling back business logic
  • Improved error handling when there is a password error on push certificate upload.
  • Improved error handling when rate limit is encountered
  • Added an "add column" button in the Users addon table view
  • Added the ability to lockdown a user (which triggers a wipe of the device cache)
  • Fixed Files addon rendering to support non-string filenames
  • Security improvements
  • Fixed bug related to adding custom data links when the current plan does not have support for them
  • Minor placeholder changes to forms
  • Internal Stability Improvements
  • Users - Fixed bug with exporting of large datasets not preforming well
  • Internal Stability Improvements
  • Added new method getSecurityContext to backendContext module, which returns 'app', 'master', or 'user' depending on the type of security credentials that were passed in the request
  • Changed blacklist violation error to include the name of the script that triggered the blacklisting event
  • Internal improvements
  • Fixed issue where navigation out of the billing page was not possible
  • Made enterprise dashboard dismissable
  • Fixed some databrowser filter issues regarding case sensitivity
  • Internal Stability Improvements
  • Added self-serve unarchiving support
  • Scheduled Code - Added support for running business logic on a schedule basis
  • Internal Stability Improvements
  • Fixed a bug with regards to environment creation limits
  • Internal Stability Improvements
  • Internal Stability Improvements
  • Billing - Fixed navigation issues with page reloads and paths with a trailing slash not redirecting properly
  • Analytics - Fixed a bug with the retrieval of analytics data from the server
  • Support - Updated links around the site to give people ways to connect with all their support options available
  • Pricing - Updated the interface for the new pricing model, including support to upgrade your plan
  • Analytics - Updated analytics styling to fix a bunch of UI bugs
  • Internal Stability Improvements
  • Collection Hooks - Added support to allow for collection hooks to be created for the Files API
  • API Console - Fixed a bug where the request body would not reset it's value from previous requests properly
  • Internal Stability Improvements
  • Business Logic - Rollbacks are now ran on a background task, similar to how cloning is done
  • Updated the interface to archived apps to present a more friendly display
  • Users - When cloning user records the groups are now also cloned.
  • Business Logic - Fixed a bug with verisoning where saving with a message would not actually update your code
  • Added support for archived environments which was causing some users to get a non-responsive web console
  • Internal Stability Improvements
  • Microsoft Dynamics® CRM Data Link - Added a new data link to connect with your Microsoft Dynamics® CRM
  • Internal Stability Improvements
  • Internal Stability Improvements
  • Business Logic - Added revision support to business logic, including adding a command line tool to manage your logic.
  • Collaboration - Fixed an issue where admins could not invite other admins or collaborators.
  • Environment Management - Fixed bug where no addons would show up on the left when selecting clone from a different environment than is currently selected
  • Push - Added support for iOS push certificate password
  • Billing - Fixed a bug where a user could not select a different billing month. Also fixed the default month to be displayed to be the latest statement instead of the first statement.
  • Collection Hooks/Custom Endpoints - Updated the way logs are returned from the system, previously after 100 logs now new logs would be returned. Now the latest logs are always returned.
  • API Console - Refactored the way the API console makes requests. They are now sent direct from the browser instead of passed through the management console backend.
  • Fixed a bug with iOS Push
  • Internal improvements
  • Users - Add information about email verification options, as well as the new HTML Templates addon and its support for customizing the email verification 'success' page.
  • API Console - Removed temporary measure of limit of 100 records on every request that was added in 3.7.8.
  • Updated display case when an app is suspended, it now renders a proper message.
  • Internal Stability Improvements
  • Internal Stability Improvements
  • API Console - Added a limit of 100 records to every request as a temporary bugfix until a permanent fix is ready for deployment.
  • Environment Management - Fixed a bug with jobs not clearing their update when they get removed from the collection.
  • Internal Stability Improvements
  • Internal stability and speed improvements
  • App Settings - Ownership display no longer attempts to use a variable that might not exist
  • Environments:
    • Fixed a bug with ownership being assigned to the wrong user on environment creation. This was causing some bad behavior when trying to update owner of the app or manage billing.
    • Collaborators can no longer create or delete environments
  • HTML Templates - Released a new addon to manage your HTML templates
  • Users - Added the ability to force email verification
  • Environment Cloning - Increased clone duration timeouts
  • Administration - Updated ownership display to only show ownership transfer form when the user is the owner
  • Internal stability improvements
  • Internal improvements release
  • Internal stability improvements
  • Environment Cloning:
    • Clicking clone on an app with only one environment no longer causes a javascript failure on the page.
    • Files now correctly show up on the batch clone dialog.
  • Business Logic Logs:
    • Logs now sort with the proper timestamps.
    • Logs no longer seem to "fill up" over time. Old logs will get automatically removed after a threshold of new logs being created.
  • Internal stability improvements
  • Environments - Updated interface so only addons with differences show up in the clone page
  • Internal stability improvements
  • Internal improvements release
  • Environments - Added environment management, with the ability to copy data and settings from one environment to the other.
  • Added UI elements for viewing task status on clone operations.
  • Starting Your First App - Removed Airship installation and note about implicit users.
  • Users - Updated for removal of implict users in KinveyKit 1.19.0. Added "forgot username".
  • Added support in email module for sending HTML Emails
  • Added a new module, backendContext, with helper methods for obtaining the current app's appKey, appSecret, and masterSecret
  • Internal Improvements
  • Files - Updated for new file API, including added migration guide.
  • Analytics - Fixed a display issue causing timezone offset to show data in the wrong day
  • Fixed bug in push processing that prevented pushing to both Android and iOS devices for the same user
  • Internal Improvements
  • Internal improvements release
  • Users - Fixed a bug where users with invalid email address were not showing up in the user listing
  • API Version - Fixed a bug where the API Version could get set to a string instead of a number
  • Push Triggers - Fixed a bug that was causing the addon to fail loading
  • Added timeline link to the dashboard
  • Internal stability improvements
  • Files - Fixed bug with old entries that were causing the UI to crash
  • Datastore - Internal improvements
  • Users - Updated validation handlers
  • Added support for running Business Logic on Google App Engine
  • Internal improvements release
  • Fixed handling of unknown mime types for file uploads
  • Internal improvements
  • Bugfixes for Premium Analytics UI
  • Fixed bug for User UI where id cells were not linking properly
  • Changed the regex patters on the query builder to be case insensitive by default
  • Internal improvements release
  • Added support for Google Cloud Storage as the underlying service for Files.
  • Internal improvements release
  • Internal improvements release
  • Fixed bug with missing argument in collectionAccess.findAndModify
  • Added support Google Cloud Messaging
  • Added appKey as modules.request parameter
  • Business Logic - Updated guide with information about Custom Endpoints
  • Release of Premium Analytics (beta)
  • Added support for Custom Endpoints in Business Logic
  • Fixed bug with billing UI where it displayed wrong dollar amount
  • Internal improvements
  • Fixed async.js bug where series, parallel, and parallel limit functions only supported arrays and not objects
  • Internal improvements release
  • Added the ability to clear Users
  • Fixed a bug with sorting users
  • Fixed a bug where collaboration was not able to be edited
  • Fixed a bug where the user page was not showing users with invalid emails
  • Made the export code streaming for collections
  • Internal improvements release
  • Added the ability to have multiple custom data links
  • Removed UI for non-admins to be able to edit collaborators or remove/change owner of the app
  • Fixed bug where the Azure blob container was not being created on app creation
  • Internal improvements
  • Fixed a bug with a failing collection destroy for externally created collections
  • Added error display to settings page.
  • Added UI state memory BL addon - now remembers which collection and stage of BL you last edited, per app per user
  • Updated importer so it will throttle based on if the item has BL or not, it will also now detect filetype and throw errors if the filetype does not match a predefined list.
  • Internal improvements
  • Fixed a bug with setting the content length incorrectly causing documents to get cut off
  • Added the "Building For" question to new apps
  • Updated request to force API v1 when streaming requests.
  • Fixed bug with request form handling.
  • Added support for GCM push
  • Enabled blacklisting support
  • Upgraded the request library and fixed content length while streaming from Azure
  • Updated the exposure of Business Logic logs in the Management Console
  • Upgraded MongoDB driver version
  • Support for POSTing formdata
  • Support for streaming Kinvey Files to formdata
  • Internal improvements
  • Internal improvements release
  • Added support for modules.request to allow creation of outgoing HTTP requests