Skip to main content

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.

warning

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.swift
.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 @MainActor to the caller or wrap in MainActor.assumeIsolated { }.
  • Optionally adopt the Client-Side Offer Feed if you want to render offers in your own UI.