# SDK Methods

## Manually Triggering the Permission Dialog

You may choose to disable automatic triggering of the permission dialog via the platform. In this scenario you would choose to trigger the dialog based on your own criteria (eg: after a visitor interacts with a modal / soft prompt, visits a specific screen/page, etc).

The following code will manually trigger the dialog:

{% tabs %}
{% tab title="Swift" %}

```swift
PushSDK.PushNotifications.showPermissionPrompt() { granted, settings, error in
    // optional callback
    print("User accepted permissions: \(granted)")
}
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
[PushSDKPushNotifications showPermissionPrompt:^(BOOL granted, UNNotificationSettings * _Nonnull settings, NSError * _Nullable error) {
    // optional callback
    NSLog(@"User accepted permissions: %d", granted);
}];
```

{% endtab %}
{% endtabs %}

## Adding Attributes to a Subscriber's Profile

You can add attributes to a subscriber's profile and later perform segmentation based on those attributes. For example, you may want to tag visitors who are interested in a specific type of news (eg: politics, sports) so that you can target them with specific notifications.

{% tabs %}
{% tab title="Swift" %}

```swift
PushSDK.UserProfile.set(["politics", "news"], forKey: "interests")
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
[PushSDKUserProfile set:@YES forKey:@"is_paying_subscriber"];
```

{% endtab %}
{% endtabs %}

If you want to set more than one attribute at a time you can also send a map of values. The following example sets both an `is_paying_subscriber` and `interests` attribute on the subscriber.

{% tabs %}
{% tab title="Swift" %}

```swift
PushSDK.UserProfile.set([
  "is_paying_subscriber": true,
  "interests": ["politics", "news"]
])
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
[PushSDKUserProfile set:@{
    @"is_paying_subscriber": @YES,
    @"interests": @[@"politics", @"news"]
}];
```

{% endtab %}
{% endtabs %}

If you're storing the value of a property as an array you can use the `append` and `remove` methods to add or remove values:

{% tabs %}
{% tab title="Swift" %}

```swift
// add 'sports' to the subscriber's existing interests
PushSDK.UserProfile.append(["sports"], to: "interests")

// remove 'fashion' and 'news' from the subscriber's interests
PushSDK.UserProfile.remove(["fashion", "news"], from: "interests")
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
// add 'sports' to the subscriber's existing interests
[PushSDKUserProfile append:@[@"sports"] to:@"interests"];

// remove 'fashion' and 'news' from the subscriber's interests
[PushSDKUserProfile remove:@[@"fashion", @"news"] from:@"interests"];
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
Properties using `append` will only store the most recent 20 values provided.
{% endhint %}

## Activity Tracking (URL / Screen Visits)

To track the subscriber flow through your application you can use activity tracking. You can track via screen or URL and pass associated metadata/tags if desired.

This information can then be used in segmentation to create cohorts of subscribers that have visited specific URLs or screens with tags based on number of visits and recency. For example: "Subscribers who have visited a page/screen tagged with "Astrology" at least 4 times in the last 30 days".

{% tabs %}
{% tab title="Swift" %}
To track a URL or screen visited along with the keyword/tag metadata:

```swift
PushSDK.UserProfile.trackActivity(name: "myapp://dashboard", withTags: ["my-tag"])
```

Or if there are no tags to be provided omit the `tags` parameter:

```swift
PushSDK.UserProfile.trackActivity(name: "https://www.pushly.com/article-1")
```

{% endtab %}

{% tab title="Objective-C" %}
To track a URL or screen visited along with the keyword/tag metadata:

```objectivec
[PushSDKUserProfile trackActivityWithName:@"myapp://dashboard" withTags:@[@"my-tag"]];
```

Or if there are no tags to be provided omit the `2nd` parameter:

```objectivec
[PushSDKUserProfile trackActivityWithName:@"https://www.pushly.com/article-1"];
```

{% endtab %}
{% endtabs %}

## Retrieving Your Anonymous Push ID

The PushSDK automatically assigns an anonymous Push ID for event tracking and debugging purposes.

Run the following code to return the Push ID:

{% tabs %}
{% tab title="Swift" %}

```swift
let pushId = PushSDK.UserProfile.anonymousId
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
NSString* pushId = PushSDKUserProfile.anonymousId;
```

{% endtab %}
{% endtabs %}

## Setting the Subscriber's External ID

Providing a unique User ID for your subscriber allows you to later interact with that subscriber via the API.

Once a subscriber's external ID has been set you may work with our team to set up bi-directional automated data syncs. The following use cases are common ways that publishers use the external ID via server-to-server requests:

* Sending notifications to individual subscribers programmatically
* Processing unsubscribe requests
* Adding and removing profile attributes and events to subscribers

{% tabs %}
{% tab title="Swift" %}

```swift
PushSDK.UserProfile.externalId = "external-id"
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
PushSDKUserProfile.externalId = @"external-id";
```

{% endtab %}
{% endtabs %}

You can also check to see if the subscriber is already tagged with an External ID:

{% tabs %}
{% tab title="Swift" %}

```swift
let currentExternalId = PushSDK.UserProfile.externalId
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
NSString* currentExternalId = PushSDKUserProfile.externalId;
```

{% endtab %}
{% endtabs %}

## Determining if a Visitor is Already Subscribed

If you need to know if a user is already subscribed to notifications the following snippet can be used:

{% tabs %}
{% tab title="Swift" %}

```swift
let subscribed = PushSDK.PushNotifications.isSubscribed
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
BOOL subscribed = PushSDKPushNotifications.isSubscribed;
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
If your application needs to react to a user's subscription status changing we recommend implementing [Permission Lifecycle Delegates](https://documentation.pushly.com/integration/implementation-steps/apple-ios/sdk-delegates#permission-lifecycle-delegates) to ensure you are immediately notified of any change.
{% endhint %}

## Determining if a Visitor is Eligible to Prompt

{% tabs %}
{% tab title="Swift" %}

```swift
let isEligible = PushSDK.PushNotifications.isEligibleToPrompt
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
BOOL isEligible = PushSDKPushNotifications.isEligibleToPrompt;
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
If your application needs to react to a user's subscription status changing we recommend implementing [Permission Lifecycle Delegates](https://documentation.pushly.com/integration/implementation-steps/apple-ios/sdk-delegates#permission-lifecycle-delegates) to ensure you are immediately notified of any change.
{% endhint %}

## Pausing / Resuming a User's Notifications (Soft Unsubscribe)

A user's notifications can be paused by calling the following method:

{% tabs %}
{% tab title="Swift" %}

```swift
PushSDK.PushNotifications.pause()
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
[PushSDKPushNotifications pause];
```

{% endtab %}
{% endtabs %}

If the user's notifications should be resumed call the following method:

{% tabs %}
{% tab title="Swift" %}

```swift
PushSDK.PushNotifications.resume()
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
[PushSDKPushNotifications resume];
```

{% endtab %}
{% endtabs %}

To check if the user's notifications are currently paused:

{% tabs %}
{% tab title="Swift" %}

```swift
PushSDK.PushNotifications.isPaused
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
BOOL isPaused = PushSDKPushNotifications.isPaused;
```

{% endtab %}
{% endtabs %}

## Permanently Delete a User

If the user should be excluded from all notifications and tracking run the following method:

{% tabs %}
{% tab title="Swift" %}

```swift
PushSDK.UserProfile.requestUserDeletion()
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
[PushSDKUserProfile requestUserDeletion];
```

{% endtab %}
{% endtabs %}

## Setting the SDK Log Level

The PushSDK log level is set to `none` by default. Supported log levels are: `verbose`, `debug`, `info`, `warn`, `error`, `critical`, and `none`.

{% tabs %}
{% tab title="Swift" %}

```swift
PushSDK.logLevel = .info
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
PushSDK.logLevel = PNLogLevelInfo
```

{% endtab %}
{% endtabs %}
