Activation iOS SDK 1.14.0
1.14.0 builds on 1.13.0. Its headline addition is the Client-Side Offer Feed — a data API that lets you render the SDK's offers in your own UI while the SDK still owns the detail experience.
This release contains a breaking change for Swift integrations that call BlinkEngageSDK.start(debugMode:) from a nonisolated context. See Breaking changes and the Upgrade checklist.
Installation
Update your Swift Package Manager or CocoaPods dependency to 1.14.0.
.package(url: "https://github.com/BlinkReceipt/blink-engage-ios", from: "1.14.0")
What's new
Client-Side Offer Feed
BlinkEngageSDK.shared.loadOfferFeed(completion:) returns the SDK's offers as plain data — BlinkEngageOfferGroup values, each with a title and an array of offers — for you to render natively in your own UI. When the user makes a selection, offerDetailsViewController(for:) or offerGroupViewController(for:) hands back the SDK's own detail or group screen, so taps still land on the full offer experience.
Use this when OffersWallViewController doesn't fit your layout or design system but you still want the SDK to handle the detail flow, analytics attribution, and offer state.
See Client-Side Offer Feed for the full integration guide.
Changed
Missed earnings after missing information
Receipts that reached the receipt summary screen by entering a missing date or total no longer show the Report button or the "Missing rewards?" footer. That path already submitted a review request for the receipt, and a missed-earnings correction on top of it is not offered. The suppression is stored with the session so it also applies when the receipt is reopened later from history.
Fixed
- Camera focus — The product capture and barcode scan camera now refocuses when the subject changes.
- Product capture on small screens — The take-photo button is now visible on smaller iPhones, where it was previously clipped off-screen.
- Receipt total — Totals on the receipt summary screen always show two decimal places (e.g.
$5.00).
Breaking changes
BlinkEngageSDK.start(debugMode:) is now @MainActor
start(debugMode:) is now annotated @MainActor, matching the main-thread requirement it already enforced at runtime. Calls from an app delegate, a SwiftUI App initializer, or Objective-C are unchanged — those contexts are already on the main actor.
A Swift call from a nonisolated context no longer compiles. Previously such a call would crash at runtime; this surfaces the failure earlier as a compile error.
Fix: mark the calling function @MainActor, or wrap the call in MainActor.assumeIsolated { } if you already guarantee the main thread through other means.
// If your call site is not already @MainActor:
// Option A — annotate the caller
@MainActor
func setupSDK() {
BlinkEngageSDK.start(debugMode: false)
}
// Option B — assert main thread at the call site
MainActor.assumeIsolated {
BlinkEngageSDK.start(debugMode: false)
}
See the Migration guide for details.
Upgrade checklist
- Update the dependency to
1.14.0. - If you call
BlinkEngageSDK.start(debugMode:)from a nonisolated Swift context, add@MainActorto the caller or wrap inMainActor.assumeIsolated { }. - Optionally adopt the Client-Side Offer Feed if you want to render offers in your own UI.