private void UpdatePluginPlatforms(ApplicationSettings.Features _supportedFeatures) { foreach (PluginImporter plugin in PluginImporter.GetAllImporters()) { if (plugin == null || Path.IsPathRooted(plugin.assetPath)) // Skip null or inbuilt plugins { continue; } string filename = Path.GetFileName(plugin.assetPath); if (plugin.assetPath.Contains(Constants.kAndroidPluginsPath)) { // Debug.Log("[Updating Plugin Properties] " + plugin.assetPath); if (filename.Equals(Constants.kTwitterLibraryName)) { plugin.SetCompatibleWithAnyPlatform(false); plugin.SetCompatibleWithPlatform(BuildTarget.Android, _supportedFeatures.UsesTwitter); } if (filename.Equals(Constants.kYoutubeLibraryName)) { plugin.SetCompatibleWithAnyPlatform(false); plugin.SetCompatibleWithPlatform(BuildTarget.Android, _supportedFeatures.UsesMediaLibrary); } } } }
private static void ProcessFeatureSpecificOperations() { // Remove NP temp folder if (Directory.Exists(kRelativePathNativePluginsSDKFolder)) { IOExtensions.AssignPermissionRecursively(kRelativePathNativePluginsSDKFolder, FileAttributes.Normal); Directory.Delete(kRelativePathNativePluginsSDKFolder, true); } // Create temp folder to place extracted files Directory.CreateDirectory(kRelativePathNativePluginsSDKFolder); // Add player settings info to receipt verification code ApplicationSettings.Features _supportedFeatures = NPSettings.Application.SupportedFeatures; if (_supportedFeatures.UsesBilling) { AddBuildInfoToReceiptVerificationManger(); } // Decompress zip files and add it to project if (_supportedFeatures.UsesTwitter) { DecompressTwitterSDKFiles(); } }
private void UpdateResourcesBasedOnFeaturesUsage() { ApplicationSettings.Features _supportedFeatures = m_applicationSettings.SupportedFeatures; ApplicationSettings.AddonServices _supportedAddOnServices = m_applicationSettings.SupportedAddonServices; UpdateJARFile(_supportedFeatures.UsesAddressBook, Constants.kAddressBookJARName); UpdateJARFile(_supportedFeatures.UsesBilling, Constants.kBillingJARName); UpdateJARFile(_supportedFeatures.UsesBilling, Constants.kBillingAmazonJARName); UpdateJARFile(_supportedFeatures.UsesCloudServices, Constants.kCloudServicesJARName); UpdateJARFile(_supportedFeatures.UsesGameServices, Constants.kGameServicesJARName); UpdateJARFile(_supportedFeatures.UsesMediaLibrary, Constants.kMediaLibraryJARName); UpdateJARFile(_supportedFeatures.UsesNotificationService, Constants.kNotificationJARName); UpdateJARFile(_supportedFeatures.UsesNetworkConnectivity, Constants.kNetworkConnectivityJARName); UpdateJARFile(_supportedFeatures.UsesSharing, Constants.kSharingJARName); UpdateJARFile(_supportedFeatures.UsesTwitter, Constants.kSocialNetworkTwitterJARName); UpdateJARFile(_supportedFeatures.UsesWebView, Constants.kWebviewJARName); //External Additional Support UpdateJARFile(_supportedAddOnServices.UsesSoomlaGrow, Constants.kSoomlaIntegrationJARName); UpdateJARFile(_supportedFeatures.UsesNotificationService || NPSettings.Utility.Android.ModifiesApplicationBadge, Constants.kExternalNotificationLibJARName); // For Shortcut Badger #if (UNITY_5 || UNITY_2017_1_OR_NEWER) // Update external libraries/plugins properties UpdatePluginPlatforms(_supportedFeatures); #endif }
private void UpdatePluginResources() { ApplicationSettings.Features _supportedFeatures = m_applicationSettings.SupportedFeatures; // Update JAR files UpdateJARFile(_supportedFeatures.UsesBilling, Constants.kBillingInterfaceJARName, Constants.kDisabledBillingWarning); // Copy required assets CopyNotificationAssets(); }
private static void ProcessFeatureSpecificOperations() { ApplicationSettings.Features _supportedFeatures = NPSettings.Application.SupportedFeatures; if (_supportedFeatures.UsesBilling) { AddBuildInfoToReceiptVerificationManger(); } // Decompress zip files and add it to project if (_supportedFeatures.UsesTwitter) { DecompressTwitterFrameworkFiles(); } }
private void UpdateDefineSymbols() { foreach (BuildTargetGroup _curBuildTargetGroup in buildTargetGroups) { string[] _curDefineSymbols = UnityPlayerSettings.GetScriptingDefineSymbolsForGroup(_curBuildTargetGroup).Split(defineSeperators, StringSplitOptions.RemoveEmptyEntries); List <string> _newDefineSymbols = new List <string>(_curDefineSymbols); // Asset type #pragma warning disable if (kIsFullVersion) { if (_newDefineSymbols.Contains(kLiteVersionMacro)) { _newDefineSymbols.Remove(kLiteVersionMacro); } } else { if (!_newDefineSymbols.Contains(kLiteVersionMacro)) { _newDefineSymbols.Add(kLiteVersionMacro); } } #pragma warning restore ApplicationSettings.Features _supportedFeatures = m_applicationSettings.SupportedFeatures; ApplicationSettings.AddonServices _supportedAddonServices = m_applicationSettings.SupportedAddonServices; // Regarding supported features AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesAddressBook, kMacroAddressBook); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesBilling, kMacroBilling); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesCloudServices, kMacroCloudServices); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesGameServices, kMacroGameServices); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesMediaLibrary, kMacroMediaLibrary); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesNetworkConnectivity, kMacroNetworkConnectivity); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesNotificationService, kMacroNotificationService); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesSharing, kMacroSharin); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesTwitter, kMacroTwitter); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesWebView, kMacroWebView); // Regarding supported addon features AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedAddonServices.UsesSoomlaGrow, kMacroSoomlaGrowService); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedAddonServices.UsesOneSignal, kMacroOneSignalService); // Now save these changes UnityPlayerSettings.SetScriptingDefineSymbolsForGroup(_curBuildTargetGroup, string.Join(";", _newDefineSymbols.ToArray())); } }
// { // "Fabric": { // "APIKey": "{0}", // "Kits": [ // { // "KitInfo": { // "consumerKey": "", // "consumerSecret": "" // }, // "KitName": "Twitter" // } // ] // } // } private static void ModifyInfoPlist(string _buildPath) { ApplicationSettings.Features _supportedFeatures = NPSettings.Application.SupportedFeatures; if (!(_supportedFeatures.UsesTwitter || _supportedFeatures.UsesGameServices)) { return; } string _path2InfoPlist = Path.Combine(_buildPath, kInfoPlistFileRelativePath); string _path2InfoPlistBackupFile = Path.Combine(_buildPath, kInfoPlistBackupFileRelativePath); Plist _infoPlist = Plist.LoadPlistAtPath(_path2InfoPlist); // Create backup _infoPlist.Save(_path2InfoPlistBackupFile); // Adding twitter settings if (_supportedFeatures.UsesTwitter) { TwitterSettings _twitterSettings = NPSettings.SocialNetworkSettings.TwitterSettings; string _fabricJsonStr = string.Format(kFabricKitJsonStringFormat, _twitterSettings.ConsumerKey); IDictionary _fabricJsonDictionary = JSONUtility.FromJSON(_fabricJsonStr) as IDictionary; // Add fabric _infoPlist.AddValue(kFabricKitRootKey, _fabricJsonDictionary[kFabricKitRootKey] as IDictionary); } // Adding gamecenter settings if (_supportedFeatures.UsesGameServices) { IList _deviceCapablitiesList = _infoPlist.GetKeyPathValue(kDeviceCapablitiesKey) as IList; if (_deviceCapablitiesList == null) { _deviceCapablitiesList = new List <string>(); } if (!_deviceCapablitiesList.Contains("gamekit")) { _deviceCapablitiesList.Add("gamekit"); } _infoPlist.AddValue(kDeviceCapablitiesKey, _deviceCapablitiesList); } // Save _infoPlist.Save(_path2InfoPlist); }
private void UpdateJARFilesBasedOnFeaturesUsage() { ApplicationSettings.Features _supportedFeatures = m_applicationSettings.SupportedFeatures; ApplicationSettings.AddonServices _supportedAddOnServices = m_applicationSettings.SupportedAddonServices; UpdateJARFile(_supportedFeatures.UsesAddressBook, Constants.kAddressBookJARName); UpdateJARFile(_supportedFeatures.UsesBilling, Constants.kBillingJARName); UpdateJARFile(_supportedFeatures.UsesCloudServices, Constants.kCloudServicesJARName); UpdateJARFile(_supportedFeatures.UsesGameServices, Constants.kGameServicesJARName); UpdateJARFile(_supportedFeatures.UsesMediaLibrary, Constants.kMediaLibraryJARName); UpdateJARFile(_supportedFeatures.UsesNotificationService, Constants.kNotificationJARName); UpdateJARFile(_supportedFeatures.UsesNetworkConnectivity, Constants.kNetworkConnectivityJARName); UpdateJARFile(_supportedFeatures.UsesSharing, Constants.kSharingJARName); UpdateJARFile(_supportedFeatures.UsesTwitter, Constants.kSocialNetworkTwitterJARName); UpdateJARFile(_supportedFeatures.UsesWebView, Constants.kWebviewJARName); UpdateJARFile(_supportedAddOnServices.UsesSoomlaGrow, Constants.kSoomlaIntegrationJARName); }
public NPAndroidManifestGenerator () { m_supportedFeatures = NPSettings.Application.SupportedFeatures; }
private void UpdateDefineSymbols() { ApplicationSettings.Features _supportedFeatures = m_applicationSettings.SupportedFeatures; ApplicationSettings.AddonServices _supportedAddonServices = m_applicationSettings.SupportedAddonServices; #if UNITY_ANDROID if (_supportedFeatures.UsesCloudServices && !_supportedFeatures.UsesGameServices) { string _error = "Cloud Services on Android needs Game Services feature to be enabled. Please enable Game Services now."; Debug.LogWarning("[Cross Platform Native Plugins] " + _error); EditorUtility.DisplayDialog("Cross Platform Native Plugins - Alert", _error, "Ok"); } #if USES_BILLING if (string.IsNullOrEmpty(NPSettings.Billing.Android.PublicKey)) { string _error = "Please specify Public key in Billing Settings for using Billing feature. You can get this key from Google Play Developer Console -> Your App -> Development & Tools -> Services & API -> Licensing & in-app billing."; Debug.LogWarning("[Cross Platform Native Plugins] " + _error); } #endif #endif foreach (BuildTargetGroup _curBuildTargetGroup in buildTargetGroups) { string[] _curDefineSymbols = UnityPlayerSettings.GetScriptingDefineSymbolsForGroup(_curBuildTargetGroup).Split(defineSeperators, StringSplitOptions.RemoveEmptyEntries); List <string> _newDefineSymbols = new List <string>(_curDefineSymbols); // Asset type #pragma warning disable if (kIsFullVersion) { if (_newDefineSymbols.Contains(kLiteVersionMacro)) { _newDefineSymbols.Remove(kLiteVersionMacro); } } else { if (!_newDefineSymbols.Contains(kLiteVersionMacro)) { _newDefineSymbols.Add(kLiteVersionMacro); } } #pragma warning restore // Regarding supported features AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesAddressBook, kMacroAddressBook); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesBilling, kMacroBilling); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesCloudServices, kMacroCloudServices); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesGameServices, kMacroGameServices); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesMediaLibrary, kMacroMediaLibrary); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesNetworkConnectivity, kMacroNetworkConnectivity); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesNotificationService, kMacroNotificationService); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesSharing, kMacroSharin); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesTwitter, kMacroTwitter); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedFeatures.UsesWebView, kMacroWebView); // Regarding supported addon features AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedAddonServices.UsesSoomlaGrow, kMacroSoomlaGrowService); AddOrRemoveFeatureDefineSymbol(_newDefineSymbols, _supportedAddonServices.UsesOneSignal, kMacroOneSignalService); // Now save these changes UnityPlayerSettings.SetScriptingDefineSymbolsForGroup(_curBuildTargetGroup, string.Join(";", _newDefineSymbols.ToArray())); } }
// { // "Fabric": { // "APIKey": "{0}", // "Kits": [ // { // "KitInfo": { // "consumerKey": "", // "consumerSecret": "" // }, // "KitName": "Twitter" // } // ] // } // } private static void ModifyInfoPlist(string _buildPath) { ApplicationSettings.Features _supportedFeatures = NPSettings.Application.SupportedFeatures; Dictionary <string, object> _newPermissionsDict = new Dictionary <string, object>(); // Add twitter info #if USES_TWITTER { const string _kFabricKitRootKey = "Fabric"; TwitterSettings _twitterSettings = NPSettings.SocialNetworkSettings.TwitterSettings; string _fabricJsonStr = string.Format(kFabricKitJsonStringFormat, _twitterSettings.ConsumerKey); IDictionary _fabricJsonDictionary = (IDictionary)JSONUtility.FromJSON(_fabricJsonStr); // Add fabric _newPermissionsDict[_kFabricKitRootKey] = _fabricJsonDictionary[_kFabricKitRootKey]; } #endif // Add background process details #if USES_NOTIFICATION_SERVICE && USES_ONE_SIGNAL const string _kUIBackgroundModesKey = "UIBackgroundModes"; IList _backgroundModesList = (IList)infoPlist.GetKeyPathValue(_kUIBackgroundModesKey); if (_backgroundModesList == null) { _backgroundModesList = new List <string>(); } const string _kRemoteNotificationProcess = "remote-notification"; if (!_backgroundModesList.Contains(_kRemoteNotificationProcess)) { _backgroundModesList.Add(_kRemoteNotificationProcess); } _newPermissionsDict[_kUIBackgroundModesKey] = _backgroundModesList; #endif // Device capablities addition if (_supportedFeatures.UsesGameServices) { const string _kDeviceCapablitiesKey = "UIRequiredDeviceCapabilities"; const string _kGameKitKey = "gamekit"; IList _deviceCapablitiesList = (IList)infoPlist.GetKeyPathValue(_kDeviceCapablitiesKey); if (_deviceCapablitiesList == null) { _deviceCapablitiesList = new List <string>(); } if (!_deviceCapablitiesList.Contains(_kGameKitKey)) { _deviceCapablitiesList.Add(_kGameKitKey); } _newPermissionsDict[_kDeviceCapablitiesKey] = _deviceCapablitiesList; } // Query scheme related key inclusion if (_supportedFeatures.UsesSharing) { const string _kQuerySchemesKey = "LSApplicationQueriesSchemes"; const string _kWhatsAppKey = "whatsapp"; IList _queriesSchemesList = (IList)infoPlist.GetKeyPathValue(_kQuerySchemesKey); if (_queriesSchemesList == null) { _queriesSchemesList = new List <string>(); } if (!_queriesSchemesList.Contains(_kWhatsAppKey)) { _queriesSchemesList.Add(_kWhatsAppKey); } _newPermissionsDict[_kQuerySchemesKey] = _queriesSchemesList; } // Apple transport security if (_supportedFeatures.UsesNetworkConnectivity || _supportedFeatures.UsesWebView) { const string _kATSKey = "NSAppTransportSecurity"; const string _karbitraryLoadsKey = "NSAllowsArbitraryLoads"; IDictionary _transportSecurityDict = (IDictionary)infoPlist.GetKeyPathValue(_kATSKey); if (_transportSecurityDict == null) { _transportSecurityDict = new Dictionary <string, object>(); } _transportSecurityDict[_karbitraryLoadsKey] = true; _newPermissionsDict[_kATSKey] = _transportSecurityDict; } if (_newPermissionsDict.Count == 0) { return; } // First create a backup of old data string _infoPlistBackupSavePath = GetInfoPlistBackupFilePath(_buildPath); infoPlist.Save(_infoPlistBackupSavePath); // Now add new permissions foreach (string _key in _newPermissionsDict.Keys) { infoPlist.AddValue(_key, _newPermissionsDict[_key]); } // Save these changes string _infoPlistSavePath = GetInfoPlistFilePath(_buildPath); infoPlist.Save(_infoPlistSavePath); }
private static void GenerateXcodeModFiles() { string _xcodeModDataCollectionText = File.ReadAllText(kRelativePathXcodeModDataCollectionFile); if (_xcodeModDataCollectionText == null) { return; } IDictionary _xcodeModDataCollectionDict = JSONUtility.FromJSON(_xcodeModDataCollectionText) as IDictionary; ApplicationSettings.Features _supportedFeatures = NPSettings.Application.SupportedFeatures; ApplicationSettings.AddonServices _supportedAddonServices = NPSettings.Application.SupportedAddonServices; // Create mod file related to supported features ExtractAndSerializeXcodeModInfo(_xcodeModDataCollectionDict, kModKeyCommon, kRelativePathIOSNativeCodeFolder); if (_supportedFeatures.UsesAddressBook) { ExtractAndSerializeXcodeModInfo(_xcodeModDataCollectionDict, kModKeyAddressBook, kRelativePathIOSNativeCodeFolder); } if (_supportedFeatures.UsesBilling) { ExtractAndSerializeXcodeModInfo(_xcodeModDataCollectionDict, kModKeyBilling, kRelativePathIOSNativeCodeFolder); } if (_supportedFeatures.UsesCloudServices) { ExtractAndSerializeXcodeModInfo(_xcodeModDataCollectionDict, kModKeyCloudServices, kRelativePathIOSNativeCodeFolder); } if (_supportedFeatures.UsesGameServices) { ExtractAndSerializeXcodeModInfo(_xcodeModDataCollectionDict, kModKeyGameServices, kRelativePathIOSNativeCodeFolder); } if (_supportedFeatures.UsesMediaLibrary) { ExtractAndSerializeXcodeModInfo(_xcodeModDataCollectionDict, kModKeyMediaLibrary, kRelativePathIOSNativeCodeFolder); } if (_supportedFeatures.UsesNetworkConnectivity) { ExtractAndSerializeXcodeModInfo(_xcodeModDataCollectionDict, kModKeyNetworkConnectivity, kRelativePathIOSNativeCodeFolder); } if (_supportedFeatures.UsesNotificationService) { ExtractAndSerializeXcodeModInfo(_xcodeModDataCollectionDict, kModKeyNotification, kRelativePathIOSNativeCodeFolder); } if (_supportedFeatures.UsesSharing) { ExtractAndSerializeXcodeModInfo(_xcodeModDataCollectionDict, kModKeySharing, kRelativePathIOSNativeCodeFolder); } if (_supportedFeatures.UsesTwitter) { ExtractAndSerializeXcodeModInfo(_xcodeModDataCollectionDict, kModKeyTwitter, kRelativePathIOSNativeCodeFolder); ExtractAndSerializeXcodeModInfo(_xcodeModDataCollectionDict, kModKeyTwitterSDK, kRelativePathNativePluginsSDKFolder); } if (_supportedFeatures.UsesWebView) { ExtractAndSerializeXcodeModInfo(_xcodeModDataCollectionDict, kModKeyWebView, kRelativePathIOSNativeCodeFolder); } // Create mod file related to supported addon features if (_supportedAddonServices.UsesSoomlaGrow) { ExtractAndSerializeXcodeModInfo(_xcodeModDataCollectionDict, kModKeySoomlaGrow, kRelativePathIOSNativeCodeFolder); } }
public NPAndroidManifestGenerator() { m_supportedFeatures = NPSettings.Application.SupportedFeatures; }
// { // "Fabric": { // "APIKey": "{0}", // "Kits": [ // { // "KitInfo": { // "consumerKey": "", // "consumerSecret": "" // }, // "KitName": "Twitter" // } // ] // } // } private static void ModifyInfoPlist(string _buildPath) { Debug.Log("[PostProcessBuild] : ModifyInfoPlist : " + _buildPath); ApplicationSettings _applicationSettings = NPSettings.Application; ApplicationSettings.Features _supportedFeatures = NPSettings.Application.SupportedFeatures; Dictionary <string, object> _newPermissionsDict = new Dictionary <string, object>(); #if USES_TWITTER // Add twitter info if (_supportedFeatures.UsesTwitter) { const string _kFabricKitRootKey = "Fabric"; TwitterSettings _twitterSettings = NPSettings.SocialNetworkSettings.TwitterSettings; string _fabricJsonStr = string.Format(kFabricKitJsonStringFormat, _twitterSettings.ConsumerKey); IDictionary _fabricJsonDictionary = (IDictionary)JSONUtility.FromJSON(_fabricJsonStr); _newPermissionsDict[_kFabricKitRootKey] = _fabricJsonDictionary[_kFabricKitRootKey]; } #endif // Add permissions if (_supportedFeatures.UsesNotificationService) { #if !UNITY_4 if (_supportedFeatures.NotificationService.usesRemoteNotification) { const string _kUIBackgroundModesKey = "UIBackgroundModes"; const string _kRemoteNotificationProcess = "remote-notification"; IList _backgroundModesList = (IList)infoPlist.GetKeyPathValue(_kUIBackgroundModesKey); if (_backgroundModesList == null) { _backgroundModesList = new List <string>(); } if (!_backgroundModesList.Contains(_kRemoteNotificationProcess)) { _backgroundModesList.Add(_kRemoteNotificationProcess); } _newPermissionsDict[_kUIBackgroundModesKey] = _backgroundModesList; } #endif } if (_supportedFeatures.UsesGameServices) { const string _kDeviceCapablitiesKey = "UIRequiredDeviceCapabilities"; const string _kGameKitKey = "gamekit"; IList _deviceCapablitiesList = (IList)infoPlist.GetKeyPathValue(_kDeviceCapablitiesKey); if (_deviceCapablitiesList == null) { _deviceCapablitiesList = new List <string>(); } if (!_deviceCapablitiesList.Contains(_kGameKitKey)) { _deviceCapablitiesList.Add(_kGameKitKey); } _newPermissionsDict[_kDeviceCapablitiesKey] = _deviceCapablitiesList; } if (_supportedFeatures.UsesSharing) { const string _kQuerySchemesKey = "LSApplicationQueriesSchemes"; const string _kWhatsAppKey = "whatsapp"; IList _queriesSchemesList = (IList)infoPlist.GetKeyPathValue(_kQuerySchemesKey); if (_queriesSchemesList == null) { _queriesSchemesList = new List <string>(); } if (!_queriesSchemesList.Contains(_kWhatsAppKey)) { _queriesSchemesList.Add(_kWhatsAppKey); } _newPermissionsDict[_kQuerySchemesKey] = _queriesSchemesList; } if (_supportedFeatures.UsesNetworkConnectivity || _supportedFeatures.UsesWebView) { const string _kATSKey = "NSAppTransportSecurity"; const string _karbitraryLoadsKey = "NSAllowsArbitraryLoads"; IDictionary _transportSecurityDict = (IDictionary)infoPlist.GetKeyPathValue(_kATSKey); if (_transportSecurityDict == null) { _transportSecurityDict = new Dictionary <string, object>(); } _transportSecurityDict[_karbitraryLoadsKey] = true; _newPermissionsDict[_kATSKey] = _transportSecurityDict; } // Add privacy info const string _kPermissionContacts = "NSContactsUsageDescription"; const string _kPermissionCamera = "NSCameraUsageDescription"; const string _kPermissionPhotoLibrary = "NSPhotoLibraryUsageDescription"; const string _kPermissionModifyPhotoLibrary = "NSPhotoLibraryAddUsageDescription"; if (_supportedFeatures.UsesAddressBook) { _newPermissionsDict[_kPermissionContacts] = _applicationSettings.IOS.AddressBookUsagePermissionDescription; } if (_supportedFeatures.UsesMediaLibrary) { if (_supportedFeatures.MediaLibrary.usesCamera) { _newPermissionsDict[_kPermissionCamera] = _applicationSettings.IOS.CameraUsagePermissionDescription; } if (_supportedFeatures.MediaLibrary.usesPhotoAlbum) { _newPermissionsDict [_kPermissionPhotoLibrary] = _applicationSettings.IOS.PhotoAlbumUsagePermissionDescription; _newPermissionsDict [_kPermissionModifyPhotoLibrary] = _applicationSettings.IOS.PhotoAlbumModifyUsagePermissionDescription; } } if (_newPermissionsDict.Count == 0) { return; } // Create a backup of old plist string _infoPlistBackupSavePath = GetInfoPlistBackupFilePath(_buildPath); infoPlist.Save(_infoPlistBackupSavePath); // Save the plist with new permissions foreach (string _key in _newPermissionsDict.Keys) { infoPlist.AddValue(_key, _newPermissionsDict[_key]); } string _infoPlistSavePath = GetInfoPlistFilePath(_buildPath); infoPlist.Save(_infoPlistSavePath); }