Overview
Tags help categorize devices and users for segmentation and targeted messaging. The Mapp Engage iOS SDK exposes two distinct tag scopes:
Device tags — tags assigned to the current device. Use these to segment users.
Application tags — the whitelist of tag names defined for the application as a whole. Use this to discover which tag names are valid before assigning them.
Use Case
Purpose:
Label devices with specific attributes (for example,
"NewsletterSubscriber","GamingEnthusiast").Drive dynamic segmentation for personalized notifications.
Benefits:
Improved targeting for push and inbox messages.
Simpler user management and reporting.
Implementation Details
All tag completion handlers use the standard AppoxeeCompletionHandler signature: ^(NSError * _Nullable error, id _Nullable data).
Add tags to the device
Appoxee.shared()?.addTags(toDevice: ["NewsletterSubscriber", "FrequentBuyer"]) { error, data in
if error == nil { print("Tags added.") }
}[[Appoxee shared] addTagsToDevice:@[@"NewsletterSubscriber", @"FrequentBuyer"]
withCompletionHandler:^(NSError * _Nullable error, id _Nullable data) {
if (!error) {
NSLog(@"Tags added.");
}
}];Remove tags from the device
Appoxee.shared()?.removeTags(fromDevice: ["NewsletterSubscriber"]) { error, data in
if error == nil { print("Tags removed.") }
}[[Appoxee shared] removeTagsFromDevice:@[@"NewsletterSubscriber"]
withCompletionHandler:^(NSError * _Nullable error, id _Nullable data) {
if (!error) {
NSLog(@"Tags removed.");
}
}];Add and remove tags in a single call
Appoxee.shared()?.addTags(toDevice: ["VIP"], andRemove: ["Trial"]) { error, data in
if error == nil { print("Tags updated atomically.") }
}[[Appoxee shared] addTagsToDevice:@[@"VIP"]
andRemove:@[@"Trial"]
withCompletionHandler:^(NSError * _Nullable error, id _Nullable data) {
if (!error) {
NSLog(@"Tags updated atomically.");
}
}];Fetch device tags
Returns the tags currently assigned to this device.
Appoxee.shared()?.fetchDeviceTags { error, data in
if error == nil, let tags = data as? [String] {
print("Device tags: \(tags)")
}
}[[Appoxee shared] fetchDeviceTags:^(NSError * _Nullable error, id _Nullable data) {
if (!error) {
NSArray<NSString *> *tags = (NSArray<NSString *> *)data;
NSLog(@"Device tags: %@", tags);
}
}];Fetch application tags (whitelist)
Returns the tag names that are configured at the application level. Use this list to validate tag names before assigning them to a device.
Appoxee.shared()?.fetchApplicationTags { error, data in
if error == nil, let whitelist = data as? [String] {
print("Application tags: \(whitelist)")
}
}[[Appoxee shared] fetchApplicationTags:^(NSError * _Nullable error, id _Nullable data) {
if (!error) {
NSArray<NSString *> *whitelist = (NSArray *)data;
NSLog(@"Application tags: %@", whitelist);
}
}];Clear the tags cache
Forces the next fetch to hit the server.
Appoxee.shared()?.clearTagsCache { error, data in
if error == nil { print("Tags cache cleared.") }
}[[Appoxee shared] clearTagsCacheWithCompletionhandler:^(NSError * _Nullable error, id _Nullable data) {
if (!error) {
NSLog(@"Tags cache cleared.");
}
}];Warning:
The Objective-C selector exported by the SDK is
clearTagsCacheWithCompletionhandler:— note the lowercasehinCompletionhandler. Use the symbol exactly as shown in Objective-C.
Keep in mind:
Only tag names defined at the application level (
fetchApplicationTags:) can be assigned to a device. Adding an unknown tag is a no-op or error depending on backend configuration.Use consistent and descriptive tag names so segmentation rules stay legible.
Test add, remove, and retrieve flows together — including the combined
addTagsToDevice:andRemove:withCompletionHandler:form.