# AddiCloud

> iCloud Storage APIs enable your apps to store data and documents in iCloud.

## Definition

* **Type:** Method
* **Namespace:** [UnityEditor.iOS.Xcode](/engine/6000.6/script-reference/unityeditor/ios/xcode.md)
* **Assembly:** UnityEditor.iOS.Extensions.Xcode

## AddiCloud(bool, bool, string\[])

iCloud Storage APIs enable your apps to store data and documents in iCloud.

```csharp
public void AddiCloud(bool enableKeyValueStorage, bool enableiCloudDocument, string[] customContainers)
```

### Parameters

**** (\[bool]\(https\://learn.microsoft.com/dotnet/api/system.boolean)): Enables or disables key-value Storage.**** (\[bool]\(https\://learn.microsoft.com/dotnet/api/system.boolean)): Enables or disables iCloud document storage.**** (\[string\[]]\(https\://learn.microsoft.com/dotnet/api/system.string)): Array of containers in which to store documents on iCloud. For more information about custom container types, refer to [Manage iCloud document storage and CloudKit containers](https://help.apple.com/xcode/maccurrent#/devcae40ccb9).

### Remarks

**Note**: When key-value storage is enabled, the entitlement `com.apple.developer.ubiquity-kvstore-identifier` is set to `$(TeamIdentifierPrefix)$(CFBundleIdentifier)` and can't be overridden using this method. Some scenarios require a custom value. In those cases, set `com.apple.developer.ubiquity-kvstore-identifier` manually in your entitlements file after building, or manage that key outside of `AddiCloud`.

### Examples

```csharp
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

public class Sample_AddiCloud  
{
    [PostProcessBuild]
    public static void OnPostprocessBuild(BuildTarget buildTarget, string pathToBuiltProject)
    {
        // Stop processing if build target isn't iOS

        if (buildTarget != BuildTarget.iOS)
            return;

        // Initialize PBXProject
        var projectPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);
        PBXProject pbxProject = new PBXProject();
        pbxProject.ReadFromFile(projectPath);

        // Get Main target GUID
        string mainTargetGuid = pbxProject.GetUnityMainTargetGuid();

        // Check if there's already an entitlements file created and use it. If not, create a new file called Example.entitlements
        string entitlementsFile = pbxProject.GetBuildPropertyForAnyConfig(mainTargetGuid, "CODE_SIGN_ENTITLEMENTS");
        if (entitlementsFile == null)
        {
            entitlementsFile = string.Format("Example.entitlements");
        }

        // Initialize ProjectCapabilityManager
        ProjectCapabilityManager capabilityManager = new ProjectCapabilityManager(projectPath, entitlementsFile, targetGuid: mainTargetGuid);

        // Add 'iCloud' capability and pass any arguments & custom containers to match your setup
        string[] containers = new string[] { "iCloud.com.example.container1", "iCloud.com.example.container2" };
        capabilityManager.AddiCloud(true, true, containers);

        // Call WriteToFile to save the changes to project file
        capabilityManager.WriteToFile();
    }

}
```

## AddiCloud(bool, bool, bool, bool, string\[])

iCloud Storage APIs enable your apps to store data and documents in iCloud.

```csharp
public void AddiCloud(bool enableKeyValueStorage, bool enableiCloudDocument, bool enablecloudKit, bool addDefaultContainers, string[] customContainers)
```

### Parameters

**** (\[bool]\(https\://learn.microsoft.com/dotnet/api/system.boolean)): Enables or disables key-value Storage.**** (\[bool]\(https\://learn.microsoft.com/dotnet/api/system.boolean)): Enables or disables iCloud document storage.**** (\[bool]\(https\://learn.microsoft.com/dotnet/api/system.boolean)): Enables cloudKit option.**** (\[bool]\(https\://learn.microsoft.com/dotnet/api/system.boolean)): Set to `true` to add default containers.**** (\[string\[]]\(https\://learn.microsoft.com/dotnet/api/system.string)): Array of containers in which to store documents on iCloud. For more information about custom container types, refer to [Manage iCloud document storage and CloudKit containers](https://help.apple.com/xcode/maccurrent#/devcae40ccb9).

### Remarks

**Note**: When key-value storage is enabled, the entitlement `com.apple.developer.ubiquity-kvstore-identifier` is set to `$(TeamIdentifierPrefix)$(CFBundleIdentifier)` and can't be overridden using this method. Some scenarios require a custom value. In those cases, set `com.apple.developer.ubiquity-kvstore-identifier` manually in your entitlements file after building, or manage that key outside of `AddiCloud`.

### Examples

```csharp
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

public class Sample_AddiCloud  
{
    [PostProcessBuild]
    public static void OnPostprocessBuild(BuildTarget buildTarget, string pathToBuiltProject)
    {
        // Stop processing if build target isn't iOS

        if (buildTarget != BuildTarget.iOS)
            return;

        // Initialize PBXProject
        var projectPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);
        PBXProject pbxProject = new PBXProject();
        pbxProject.ReadFromFile(projectPath);

        // Get Main target GUID
        string mainTargetGuid = pbxProject.GetUnityMainTargetGuid();

        // Check if there's already an entitlements file created and use it. If not, create a new file called Example.entitlements
        string entitlementsFile = pbxProject.GetBuildPropertyForAnyConfig(mainTargetGuid, "CODE_SIGN_ENTITLEMENTS");
        if (entitlementsFile == null)
        {
            entitlementsFile = string.Format("Example.entitlements");
        }

        // Initialize ProjectCapabilityManager
        ProjectCapabilityManager capabilityManager = new ProjectCapabilityManager(projectPath, entitlementsFile, targetGuid: mainTargetGuid);

        // Add 'iCloud' capability and pass any arguments & custom containers to match your setup
        string[] containers = new string[] { "iCloud.com.example.container1", "iCloud.com.example.container2" };
        capabilityManager.AddiCloud(true, true, containers);

        // Call WriteToFile to save the changes to project file
        capabilityManager.WriteToFile();
    }

}
```
