Repository navigation
iOS CCFrameworkOpen framework
CCFrameworkOpen-iOS gives client apps access to the Scope Connected Car backend. The public API is the Objective-C class CCOpenInterface, usable from Swift and Objective-C. Gamification is described on its own page: iOS CCFrameworkOpen — Gamification.
| Swift package | CCFrameworkOpenSPM-iOS |
| Product | CCFrameworkOpen_iOS |
| Module | CCFrameworkOpen_iOS |
| Binary | CCFrameworkOpen_iOS.xcframework |
| Minimum iOS | 15.6 |
| Platform | iOS 15.6 or later |
| Architectures | device arm64; simulator arm64 (Apple-silicon Macs) |
| Languages | Swift, Objective-C |
| Module | CCFrameworkOpen_iOS |
| Distribution | Swift Package Manager, binary XCFramework
|
A backend environment (base URL, URL suffix, protocol) and user credentials are provided by Scope Technologies.
Xcode: File → Add Package Dependencies…, enter the repository URL and add the product CCFrameworkOpen_iOS to your app target:
https://github.com/scopetech/CCFrameworkOpenSPM-iOS.git
Package.swift:
dependencies: [
.package(url: "https://github.com/scopetech/CCFrameworkOpenSPM-iOS.git", from: "<version>")
],
targets: [
.target(
name: "YourApp",
dependencies: [
.product(name: "CCFrameworkOpen_iOS", package: "CCFrameworkOpenSPM_iOS")
]
)
]Import the module:
import CCFrameworkOpen_iOS@import CCFrameworkOpen_iOS;The package name, the product name and the module name differ: you add the package CCFrameworkOpenSPM_iOS, link the product CCFrameworkOpen_iOS, and import the module CCFrameworkOpen_iOS.
The order is: initialize → log in → select vehicle → call APIs.
import CCFrameworkOpen_iOS
// 1. Initialize once, before login (e.g. in application(_:didFinishLaunchingWithOptions:))
let config = CCConfig()
config.baseUrl = "<base-url>"
config.urlSuffix = "<url-suffix>"
config.urlProtocol = "https://"
config.resetTokenAutomatically = true
CCOpenInterface.initialize(with: config)
// 2. Log in
CCOpenInterface.login(withUsername: username,
password: password,
policyNr: nil) { response in
guard let response, response.success else {
print("Login failed: \(String(describing: response?.error))")
return
}
// 3. Load account and select a vehicle
CCOpenInterface.getAccountByIgnoringCache(false) { _ in
if let vehicle = CCOpenInterface.getVehicles().first as? CCVehicle {
CCOpenInterface.selectVehicle(vehicle)
}
}
}
// Session state
CCOpenInterface.isAuthorized()
CCOpenInterface.getSelectedVehicle()
CCOpenInterface.logout()Swift names. The Objective-C selectors are imported into Swift using the standard Clang renaming rules, e.g.
getBadgesForVehicle:ignoreCache:completeBlock:becomesgetBadges(for:ignoreCache:completeBlock:). Xcode's generated interface forCCOpenInterface.h(Jump to Definition) shows the exact Swift signatures.
Every network call is asynchronous and returns a CCAPIResponse through OSCompleteBlock:
typedef void (^OSCompleteBlock)(CCAPIResponse * _Nullable response);| Property | Meaning |
|---|---|
success |
YES when the request succeeded |
error |
NSError for failed requests |
httpStatusCode |
HTTP status returned by the backend |
parsedObject |
Response mapped to an SDK model, where the endpoint has one |
rawResponse |
Raw JSON from the backend. The G-Zone APIs are read from here (see Gamification). |
The response itself is nullable. Always unwrap it before reading its properties:
CCOpenInterface.getCurrencyAmount(for: vehicle, ignoreCache: true) { response in
guard let response, response.success else { return }
let payload = response.parsedObject ?? response.rawResponse
// update UI on the main thread
}Methods with an ignoreCache: parameter can return cached data. Pass true when the UI must reflect the latest server state, for example after a trip.
The SDK posts these notifications through NotificationCenter.default:
| Constant | Posted when |
|---|---|
kNotificationLogout |
The user session ends (logout or expired token). Return the app to its login screen. |
kNotificationServerError |
The server returns an error response |
kNotificationResponseKey |
userInfo key of kNotificationServerError that holds the server response |
NotificationCenter.default.addObserver(forName: Notification.Name(kNotificationLogout),
object: nil, queue: .main) { _ in
// show login
}All methods are class methods on CCOpenInterface. Completion blocks are OSCompleteBlock unless stated otherwise.
| Method | Description |
|---|---|
initializeWithConfig: |
Configure the backend environment. Call before login. |
loginWithUsername:password:policyNr:completeBlock: |
Log in. policyNr is optional. |
isAuthorized |
YES if a user session exists |
logout |
End the session |
| Method | Description |
|---|---|
getAccount: / getAccountByIgnoringCache:completeBlock:
|
Load the account, including its vehicles |
getCurrentAccount |
Cached CCAccount (nullable) |
getUserId, getUsername, displayName
|
Current user info |
getCurrentServerUrl |
Active backend URL |
getUniqueDeviceIdentifierAsString |
Device identifier used by the SDK |
updateAccountEmail:completeBlock: |
Change email |
changePassword:oldPassword:completeBlock: |
Change password |
resetPassword:completeBlock:, sendNewPasswordWithCode:password:completeBlock:, sendNewPassword:confirmPassword:token:completeBlock:
|
Password reset flow |
deleteProfile: |
GDPR profile deletion request |
updatePushNotificationToken:completeBlock: |
Register the APNs token |
| Method | Description |
|---|---|
registerWithPolicyNumber:email:password:complete: |
Register with a policy number |
registerWithShareCode:email:password:complete: |
Register with a vehicle share code |
registerWithUsername:email:phone:gender:yearOfBirth:zipCode:termsDate:api:complete: |
Register with a profile |
loginWithPhone:username:api:complete: / loginWithCode:username:requestId:api:complete:
|
OTP login: request a code, then verify it |
| Method | Description |
|---|---|
getMobileSettings: |
Mobile settings (CCMobileSettings) |
getMProfilerSettingsWithCompleteBlock: |
Trip-profiler settings |
getAccelerationThreshold, getBrakingThreshold, getCorneringThreshold
|
Event thresholds |
| Method | Description |
|---|---|
updateTenantSettingsIfNeeded: |
Refresh tenant settings when they are out of date |
getTenantPropertiesWithCompleteBlock: |
Tenant properties |
getSettingsByNames:completeBlock: |
Named backend settings |
requestAssistanceForVehicle:at:type:location:trigger:complete: |
Request roadside assistance for a vehicle |
postUsageAdjustments:at:odometer:complete: |
Report an odometer adjustment for a vehicle |
getTermsAndConditionsMarkdown: |
Terms and conditions as Markdown |
| Method | Description |
|---|---|
getVehicles, selectVehicle:, getSelectedVehicle
|
Vehicle list and the active vehicle |
getVehicleDetailsForVehicle:ignoreCache:completeBlock: |
Vehicle details |
updateVehicleDetailsForVehicle:policyId:odometerUnit:completeBlock: |
Update vehicle details |
getLastKnownPosition:ignoreCache:completeBlock: |
Last known position |
requestOdometerValue: |
Odometer value |
getUsersForVehicle:completeBlock: |
Users sharing a vehicle |
getSharesWithCompleteBlock:, getVehicleSharingCode:, addShareCode:completeBlock:, revokeVehicleShare:forUser:completeBlock:, unsubscribeFromVehicle:completeBlock:
|
Vehicle sharing |
| Method | Description |
|---|---|
getTripsForTimeInterval:ignoreCache:completeBlock: |
Trips in an interval |
getTripDetailsForTimeInterval:ignoreCache:top:skip:completeBlock: |
Trip details, paged |
getMZoneTripsForTimeInterval:driverKeyCode:ignoreCache:tripSelect:top:skip:filter:completeBlock: |
MZone trips, paged and filtered |
getLightTripsForTimeInterval:ignoreCache:completeBlock: / getLightTripsForDate:vehicleUnitID:completeBlock:
|
Lightweight trip lists |
getMZoneTripDetailForTripID:ignoreCache:completeBlock: |
Trip detail |
getMZoneEventsForTimeInterval:completeBlock: / getMZoneEventTypesCompleteBlock:
|
Driving events and event types |
getStatsForTimeInterval:ignoreCache:completeBlock: |
Statistics |
getDashboardStatisticsForLastWeekWithCompleteBlock: |
Last-week dashboard |
getFeedbackForTimeInterval:…, getExpresionsForTimeInterval:…
|
Driver feedback and expressions |
markTripWithId:markAsBusiness:completeBlock: |
Mark a trip as business/private |
postTripEventBatch:completeBlock: |
Upload a batch of trip events |
| Method | Description |
|---|---|
getPlayerInfoForVehicleUnitId:complete: |
Player: experience and currency |
getGzonePlayerGroups:complete: |
Player groups |
getExperienceLevel:ignoreCache:completeBlock: |
Experience level definitions (name, point range) |
getCurrencyAmountForVehicle:ignoreCache:completeBlock: |
Reward currency balance |
getBadgesForVehicle:ignoreCache:completeBlock: |
Earned badges |
getBadgesForVehicleAll:ignoreCache:completeBlock: |
All badges for the vehicle |
getPlayerAvailableGamesForVehicleUnitId:complete: / …ForUserId:complete:
|
Available games |
getPlayerGameRoundsForVehicleUnitId:complete: / …ForUserId:complete: / …ForPolicyNumber:complete:
|
Player rounds (in progress and completed) with rewards |
getPlayerGameRounds:timeInterval:complete: |
Player rounds in a time interval |
getRoundCompletedNotifications: |
Completed-round notifications |
getLeaderboards:complete:, getAvailableLeaderboards:complete:, getAllLeaderboards:
|
Leaderboards |
getLeaderboardsRank:leaderboardName:startOn:rankFrom:rankTo:complete: |
Ranks around the player (paged) |
getAvailableRanks:startOn:rankFrom:rankTo:complete: |
Ranks in a leaderboard (paged) |
getUnqualifiedInProgressRanks:…, getUnqualifiedAvailableRanks:…
|
Unqualified in-progress / available ranks |
getGZoneResourceUrl: |
URL of a G-Zone image resource |
| Method | Description |
|---|---|
getQuantigoMarketPlaceName |
Marketplace name configured for the tenant |
isQuantigoTokenValid, getQuantigoToken:, resetQuantigoToken
|
Marketplace session token |
getQuantigoMarketplaces: |
Marketplaces |
getQuantigoAllPublications:, getQuantigoMarketplacePublications:complete:
|
Offers (publications), all or per marketplace |
getQuantigoMarketplaceBalance:complete:, getQuantigoTenantBalance:complete:
|
Balances |
getQuantigoOfferingMetadata:complete: |
Offer details |
buyQuantigoPublication:complete: |
Buy an offer |
getQuantigoUserVouchers: |
The user's vouchers |
getQuantigoMarketplaceStatistics:complete: |
Marketplace statistics |
| Method | Description |
|---|---|
getNotificationsWithParameters:policyId:ignoreCache:completeBlock: |
Notifications by filter |
getNotificationsById:complete: |
A single notification |
getOOANotifications:ignoreCache: |
Out-of-area notifications |
sendUserNotification:completeBlock: |
Send user feedback (CCFeedbackNotification) |
getUserPlaces:ignoreCache:, getUserPlacesWithPvu:completeBlock:ignoreCache:, createUserPlace:completeBlock:, updateUserPlace:completeBlock:, deleteUserPlaceWithId:completeBlock:, createUserRule:completeBlock:, updateUserRule:completeBlock:, getUserRulesOfType:policyVehicleUnitId:completeBlock:ignoreCache:, deleteUserRuleWithId:completeBlock:, getActivationsForUserRule:completeBlock:, getIsEffectiveForUserRule:completeBlock:
| Method | Description |
|---|---|
getInstalledBeaconForVehicleUnitId:completeBlock:, getDispatchedBeaconsForVehicleUnitId:completeBlock:
|
Installed and dispatched beacons |
installBeaconForVehicleUnitId:withMacAddress:complete:, installBeaconForVehicleUnitId:withMajorId:andMinorId:complete:
|
Link a beacon to a vehicle |
unlinkBeaconForVehicleUnitId:complete: |
Unlink the vehicle's beacon |
putBeaconWithParameters:complete: |
Update a beacon |
registerBeaconAsPossibleRecorderWithUUID:majorID:minorID:complete:, deleteBeaconWithUUID:majorID:minorID:complete:
|
Register / delete a recorder beacon |
getBeaconBatteryLevelFor:completeBlock:, postBeaconBatteryLevel:macAddress:reportedOn:complete:
|
Beacon battery level |
postActivityWithOldName:newName:complete:, putActivityWithParameters:complete:, deleteActivityWithName:complete:
|
Beacon activities |
getFuelEntryWith:complete:, addFuelEntryWith:…, updateFuelEntryWith:…, deleteFuelEntryWith:complete:, fuelEntriesSummaryWith:timeInterval:complete:, fuelEntriesSummaryDetailsWith:timeInterval:complete:, fuelEntriesConfigurationWith:complete:, updateFuelEntriesConfigurationWith:quantity:odomert:complete:
| Method | Description |
|---|---|
getSomethingFromURL:parameters:httpMethod:ignoreCache:completeBlock: |
Authenticated call to any backend path |
sendMultipartData:to:fileName:complete: |
Multipart upload |
- Games and rewards are evaluated on the backend. The app only derives display state (status split, current level) from the API data.
- No game notifications. Game updates are obtained by requesting the data again; see When to refresh.
- This is the open distribution. Endpoints written for one named customer are not part of the public API; the generic equivalents are.
- Network logging. Requests and responses are logged to the console at info level. The internal logging hooks used by Scope apps are not part of this build.
- Dispatch UI updates from completion blocks to the main queue explicitly.
Consolidated SDK
SmartDrive
PortalApiBase
PortalApiClient
Wellness
SBeacon
- Overview
- Installation
- Initialization
- Beacon Scanning
- Beacon Pairing
- Trip Management
- Driving Behavior
- Calibration
- Event Handling
- Data Models
- API Reference
Consolidated SPM
SDApiManager
CCFrameworkOpen
SmartDrive
SBeacon