Skip to content

Commit

Permalink
[StripeConnect] Add onboarding component. (#4031)
Browse files Browse the repository at this point in the history
## Summary
This change:
- Implements the onboarding component (UI still work in progress)
- Updates the onSetterFunction. The previous implementation was
incorrect because it assumed adding the onSetterFunction message handler
for each setter. You can only add 1 message handler per name, so this
makes it so you add setter handlers to the primary
OnSetterFunctionCalledMessageHandler instead.
- Updates a few unit tests to not load web content.
- Adds an activity indicator.
[MXMOBILE-2743](https://jira.corp.stripe.com/browse/MXMOBILE-2743)

## Demo
Video recorded before using StripeSpinner

https://github.com/user-attachments/assets/84e29814-ec25-4f9a-b7d6-d4167c4872c2


Video with Stripe spinner


https://github.com/user-attachments/assets/fbf1ae6c-7ee5-42ab-ac81-9e331bf47760



https://jira.corp.stripe.com/browse/MXMOBILE-2483
  • Loading branch information
nschris-stripe authored Sep 23, 2024
1 parent 138aa77 commit a4f6390
Show file tree
Hide file tree
Showing 22 changed files with 489 additions and 91 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
413D18422C7FA30A0051AA42 /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 413D18412C7FA30A0051AA42 /* TextInput.swift */; };
413D18442C7FAE280051AA42 /* OptionListRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 413D18432C7FAE280051AA42 /* OptionListRow.swift */; };
413D184A2C7FCE5E0051AA42 /* StripeConnectExample.xctestplan in Resources */ = {isa = PBXBuildFile; fileRef = 413D18492C7FCE5E0051AA42 /* StripeConnectExample.xctestplan */; };
4161C2892CA1B438005BD67C /* StripeUICore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4161C2882CA1B438005BD67C /* StripeUICore.framework */; };
4161C28A2CA1B438005BD67C /* StripeUICore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4161C2882CA1B438005BD67C /* StripeUICore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
416E9E972C76BD4400A0B917 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416E9E962C76BD4400A0B917 /* AppDelegate.swift */; };
416E9E992C76BD4400A0B917 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416E9E982C76BD4400A0B917 /* SceneDelegate.swift */; };
416E9E9B2C76BD4400A0B917 /* AppStartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416E9E9A2C76BD4400A0B917 /* AppStartViewController.swift */; };
Expand Down Expand Up @@ -56,6 +58,7 @@
files = (
E62B3CD82C99EA020098B607 /* StripeCore.framework in Embed Frameworks */,
416E9ECC2C76BE0C00A0B917 /* StripeConnect.framework in Embed Frameworks */,
4161C28A2CA1B438005BD67C /* StripeUICore.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
Expand All @@ -69,6 +72,7 @@
413D18412C7FA30A0051AA42 /* TextInput.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextInput.swift; sourceTree = "<group>"; };
413D18432C7FAE280051AA42 /* OptionListRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionListRow.swift; sourceTree = "<group>"; };
413D18492C7FCE5E0051AA42 /* StripeConnectExample.xctestplan */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = StripeConnectExample.xctestplan; sourceTree = "<group>"; };
4161C2882CA1B438005BD67C /* StripeUICore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = StripeUICore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
416E9E932C76BD4400A0B917 /* StripeConnect Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "StripeConnect Example.app"; sourceTree = BUILT_PRODUCTS_DIR; };
416E9E962C76BD4400A0B917 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
416E9E982C76BD4400A0B917 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -101,6 +105,7 @@
files = (
E62B3CD72C99EA020098B607 /* StripeCore.framework in Frameworks */,
416E9ECB2C76BE0C00A0B917 /* StripeConnect.framework in Frameworks */,
4161C2892CA1B438005BD67C /* StripeUICore.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -185,6 +190,7 @@
416E9EC62C76BDFE00A0B917 /* Frameworks */ = {
isa = PBXGroup;
children = (
4161C2882CA1B438005BD67C /* StripeUICore.framework */,
E62B3CD62C99EA020098B607 /* StripeCore.framework */,
416E9EC72C76BDFE00A0B917 /* StripeConnect.framework */,
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class MainViewController: UITableViewController {

/// Rows that display inside this table
enum Row: String, CaseIterable {
case onboarding = "Onboarding"
case payouts = "Payouts"

var label: String { rawValue }
Expand Down Expand Up @@ -104,6 +105,8 @@ class MainViewController: UITableViewController {
let viewControllerToPush: UIViewController

switch row {
case .onboarding:
viewControllerToPush = embeddedComponentManager.createAccountOnboardingViewController(fullTermsOfServiceUrl: nil, recipientTermsOfServiceUrl: nil, privacyPolicyUrl: nil, skipTermsOfServiceCollection: nil, collectionOptions: .init())
case .payouts:
viewControllerToPush = embeddedComponentManager.createPayoutsViewController()
}
Expand Down
56 changes: 51 additions & 5 deletions StripeConnect/StripeConnect.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@
413D18482C7FBAA70051AA42 /* CSSHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 413D18472C7FBAA70051AA42 /* CSSHelpers.swift */; };
41542A692C88B6F2004E728E /* JSONEncoder+extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41542A682C88B6F2004E728E /* JSONEncoder+extension.swift */; };
41542A6B2C88B79E004E728E /* JSONSerialization+extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41542A6A2C88B79E004E728E /* JSONSerialization+extension.swift */; };
4161C2732C9D0A8A005BD67C /* AccountOnboardingViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4161C2722C9D0A8A005BD67C /* AccountOnboardingViewControllerTests.swift */; };
4161C2752C9DB1B9005BD67C /* StripeUICore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4161C2742C9DB1B9005BD67C /* StripeUICore.framework */; };
4161C2792C9DB1CE005BD67C /* StripeUICore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4161C2782C9DB1CE005BD67C /* StripeUICore.framework */; };
4161C27E2C9DB566005BD67C /* AccountCollectionOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4161C27D2C9DB566005BD67C /* AccountCollectionOptions.swift */; };
4161C28C2CA1B54E005BD67C /* OnSetterFunctionCalledMessageHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4161C28B2CA1B54E005BD67C /* OnSetterFunctionCalledMessageHandlerTests.swift */; };
416E9E742C751A1A00A0B917 /* ConnectComponentWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416E9E732C751A1A00A0B917 /* ConnectComponentWebView.swift */; };
416E9E762C751B0500A0B917 /* EmbeddedComponentManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416E9E752C751B0500A0B917 /* EmbeddedComponentManager.swift */; };
416E9E782C753B7900A0B917 /* ConnectComponentWebViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416E9E772C753B7900A0B917 /* ConnectComponentWebViewTests.swift */; };
Expand All @@ -48,6 +53,7 @@
416E9ECF2C77EAA400A0B917 /* EmbeddedComponentError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416E9ECE2C77EAA400A0B917 /* EmbeddedComponentError.swift */; };
416E9ED22C77F6E000A0B917 /* Locale+extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416E9ED12C77F6E000A0B917 /* Locale+extension.swift */; };
416E9ED42C77F90600A0B917 /* WKScriptMessage+extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 416E9ED32C77F90600A0B917 /* WKScriptMessage+extension.swift */; };
4171B1592C9A5EEC00547F7D /* AccountOnboardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4171B1582C9A5EEC00547F7D /* AccountOnboardingViewController.swift */; };
41810D692C88C4B100F10EB7 /* AppearanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41810D682C88C4B100F10EB7 /* AppearanceTests.swift */; };
41810D6B2C88E71D00F10EB7 /* Appearance+Encoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41810D6A2C88E71D00F10EB7 /* Appearance+Encoding.swift */; };
41810D7A2C8A0AAD00F10EB7 /* CustomFontSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41810D792C8A0AAC00F10EB7 /* CustomFontSource.swift */; };
Expand Down Expand Up @@ -175,6 +181,11 @@
413D18472C7FBAA70051AA42 /* CSSHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CSSHelpers.swift; sourceTree = "<group>"; };
41542A682C88B6F2004E728E /* JSONEncoder+extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JSONEncoder+extension.swift"; sourceTree = "<group>"; };
41542A6A2C88B79E004E728E /* JSONSerialization+extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JSONSerialization+extension.swift"; sourceTree = "<group>"; };
4161C2722C9D0A8A005BD67C /* AccountOnboardingViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountOnboardingViewControllerTests.swift; sourceTree = "<group>"; };
4161C2742C9DB1B9005BD67C /* StripeUICore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = StripeUICore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
4161C2782C9DB1CE005BD67C /* StripeUICore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = StripeUICore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
4161C27D2C9DB566005BD67C /* AccountCollectionOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountCollectionOptions.swift; sourceTree = "<group>"; };
4161C28B2CA1B54E005BD67C /* OnSetterFunctionCalledMessageHandlerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnSetterFunctionCalledMessageHandlerTests.swift; sourceTree = "<group>"; };
416E9E732C751A1A00A0B917 /* ConnectComponentWebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectComponentWebView.swift; sourceTree = "<group>"; };
416E9E752C751B0500A0B917 /* EmbeddedComponentManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmbeddedComponentManager.swift; sourceTree = "<group>"; };
416E9E772C753B7900A0B917 /* ConnectComponentWebViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectComponentWebViewTests.swift; sourceTree = "<group>"; };
Expand All @@ -185,6 +196,7 @@
416E9ECE2C77EAA400A0B917 /* EmbeddedComponentError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmbeddedComponentError.swift; sourceTree = "<group>"; };
416E9ED12C77F6E000A0B917 /* Locale+extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Locale+extension.swift"; sourceTree = "<group>"; };
416E9ED32C77F90600A0B917 /* WKScriptMessage+extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WKScriptMessage+extension.swift"; sourceTree = "<group>"; };
4171B1582C9A5EEC00547F7D /* AccountOnboardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountOnboardingViewController.swift; sourceTree = "<group>"; };
41810D682C88C4B100F10EB7 /* AppearanceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearanceTests.swift; sourceTree = "<group>"; };
41810D6A2C88E71D00F10EB7 /* Appearance+Encoding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Appearance+Encoding.swift"; sourceTree = "<group>"; };
41810D792C8A0AAC00F10EB7 /* CustomFontSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomFontSource.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -276,6 +288,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4161C2792C9DB1CE005BD67C /* StripeUICore.framework in Frameworks */,
41A2A5682C5AC5120077FC74 /* StripeCore.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand All @@ -284,6 +297,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4161C2752C9DB1B9005BD67C /* StripeUICore.framework in Frameworks */,
41D17A4B2C5A73A7007C6EE6 /* StripeConnect.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand All @@ -304,11 +318,11 @@
413987BD2C63F34B001D375E /* MessageHandlers */ = {
isa = PBXGroup;
children = (
4171B15C2C9B3AA300547F7D /* Onboarding */,
413987D92C64093C001D375E /* Helpers */,
413987B82C63F34B001D375E /* DebugMessageHandler.swift */,
413987B92C63F34B001D375E /* FetchClientSecretMessageHandler.swift */,
413987DC2C640A29001D375E /* FetchInitParamsMessageHandler.swift */,
413987DE2C640C50001D375E /* OnExitMessageHandler.swift */,
4186664B2C66AC8C003DB62E /* OnLoaderStartMessageHandler.swift */,
4186664D2C66ACB3003DB62E /* OnLoadErrorMessageHandler.swift */,
413987E02C641688001D375E /* PageDidLoadMessageHandler.swift */,
Expand Down Expand Up @@ -365,18 +379,36 @@
path = Helpers;
sourceTree = "<group>";
};
4161C2692C9CD0B1005BD67C /* Onboarding */ = {
isa = PBXGroup;
children = (
41814EF02C6BF94B0014EB5E /* OnExitMessageHandlerTests.swift */,
);
path = Onboarding;
sourceTree = "<group>";
};
4161C27C2C9DB53C005BD67C /* Models */ = {
isa = PBXGroup;
children = (
4161C27D2C9DB566005BD67C /* AccountCollectionOptions.swift */,
);
path = Models;
sourceTree = "<group>";
};
416E9E792C762C6E00A0B917 /* Components */ = {
isa = PBXGroup;
children = (
416E9E852C76B35E00A0B917 /* PayoutsViewController.swift */,
416E9E832C76AE0900A0B917 /* ComponentType.swift */,
4171B1582C9A5EEC00547F7D /* AccountOnboardingViewController.swift */,
);
path = Components;
sourceTree = "<group>";
};
416E9E882C76B36F00A0B917 /* Components */ = {
isa = PBXGroup;
children = (
4161C2722C9D0A8A005BD67C /* AccountOnboardingViewControllerTests.swift */,
416E9E872C76B36F00A0B917 /* PayoutsViewControllerTests.swift */,
);
path = Components;
Expand All @@ -394,6 +426,14 @@
path = Extensions;
sourceTree = "<group>";
};
4171B15C2C9B3AA300547F7D /* Onboarding */ = {
isa = PBXGroup;
children = (
413987DE2C640C50001D375E /* OnExitMessageHandler.swift */,
);
path = Onboarding;
sourceTree = "<group>";
};
41814EE52C6BC8610014EB5E /* Webview */ = {
isa = PBXGroup;
children = (
Expand All @@ -417,15 +457,16 @@
41814EE92C6BCA970014EB5E /* MessageHandlers */ = {
isa = PBXGroup;
children = (
4161C2692C9CD0B1005BD67C /* Onboarding */,
41814EEA2C6BCAB30014EB5E /* DebugMessageHandlerTests.swift */,
41814EEC2C6BED8C0014EB5E /* FetchClientSecretMessageHandlerTests.swift */,
41814EEE2C6BEF2C0014EB5E /* FetchInitParamsMessageHandlerTests.swift */,
41814EF02C6BF94B0014EB5E /* OnExitMessageHandlerTests.swift */,
41814EF22C6BFA4B0014EB5E /* OnLoaderStartMessageHandlerTests.swift */,
410D0FC92C6CFE27009B0E26 /* OnLoadErrorMessageHandlerTests.swift */,
410D0FCF2C6D0319009B0E26 /* PageDidLoadMessageHandlerTests.swift */,
410D0FD12C6D047A009B0E26 /* AccountSessionClaimedMessageHandlerTests.swift */,
410D0FD32C6D051B009B0E26 /* OpenAuthenticatedWebViewMessageHandlerTests.swift */,
4161C28B2CA1B54E005BD67C /* OnSetterFunctionCalledMessageHandlerTests.swift */,
);
path = MessageHandlers;
sourceTree = "<group>";
Expand All @@ -434,8 +475,9 @@
isa = PBXGroup;
children = (
416E9E792C762C6E00A0B917 /* Components */,
413987C62C63F34B001D375E /* Internal */,
41A2A5FF2C5ACD3E0077FC74 /* Helpers */,
413987C62C63F34B001D375E /* Internal */,
4161C27C2C9DB53C005BD67C /* Models */,
416E9E752C751B0500A0B917 /* EmbeddedComponentManager.swift */,
413D18452C7FB75B0051AA42 /* EmbeddedComponentManager+Appearance.swift */,
41810D792C8A0AAC00F10EB7 /* CustomFontSource.swift */,
Expand All @@ -446,6 +488,8 @@
41A2A5662C5AC5110077FC74 /* Frameworks */ = {
isa = PBXGroup;
children = (
4161C2782C9DB1CE005BD67C /* StripeUICore.framework */,
4161C2742C9DB1B9005BD67C /* StripeUICore.framework */,
41A2A5672C5AC5120077FC74 /* StripeCore.framework */,
);
name = Frameworks;
Expand Down Expand Up @@ -833,6 +877,7 @@
413987C92C63F34B001D375E /* FetchClientSecretMessageHandler.swift in Sources */,
41BCCFEB2C8B348500797E01 /* AppearanceWrapper.swift in Sources */,
413987E12C641688001D375E /* PageDidLoadMessageHandler.swift in Sources */,
4171B1592C9A5EEC00547F7D /* AccountOnboardingViewController.swift in Sources */,
41054E432C989AAD00383C09 /* Font+Extension.swift in Sources */,
41542A692C88B6F2004E728E /* JSONEncoder+extension.swift in Sources */,
416E9E842C76AE0A00A0B917 /* ComponentType.swift in Sources */,
Expand All @@ -841,6 +886,7 @@
413987CD2C63F34B001D375E /* MessageSender.swift in Sources */,
41A2A6012C5ACD9F0077FC74 /* STPLocalizedString.swift in Sources */,
41BCCFF52C8B5A0A00797E01 /* CustomFontSourceWrapper.swift in Sources */,
4161C27E2C9DB566005BD67C /* AccountCollectionOptions.swift in Sources */,
413987CE2C63F34B001D375E /* UpdateConnectInstanceSender.swift in Sources */,
416E9ED42C77F90600A0B917 /* WKScriptMessage+extension.swift in Sources */,
410D0FE32C6D31C6009B0E26 /* StripeConnectConstants.swift in Sources */,
Expand Down Expand Up @@ -882,6 +928,7 @@
41810D692C88C4B100F10EB7 /* AppearanceTests.swift in Sources */,
410D0FD22C6D047A009B0E26 /* AccountSessionClaimedMessageHandlerTests.swift in Sources */,
41814EF12C6BF94B0014EB5E /* OnExitMessageHandlerTests.swift in Sources */,
4161C2732C9D0A8A005BD67C /* AccountOnboardingViewControllerTests.swift in Sources */,
416E9E782C753B7900A0B917 /* ConnectComponentWebViewTests.swift in Sources */,
410D0FD42C6D051B009B0E26 /* OpenAuthenticatedWebViewMessageHandlerTests.swift in Sources */,
410D0FCA2C6CFE27009B0E26 /* OnLoadErrorMessageHandlerTests.swift in Sources */,
Expand All @@ -894,6 +941,7 @@
41BCCFF02C8B3C8900797E01 /* AppearanceWrapper+Default.swift in Sources */,
416E9E822C76994C00A0B917 /* WebView+Tests.swift in Sources */,
41BCCFFB2C8B95BB00797E01 /* CustomFontSourceTests.swift in Sources */,
4161C28C2CA1B54E005BD67C /* OnSetterFunctionCalledMessageHandlerTests.swift in Sources */,
41814EF32C6BFA4B0014EB5E /* OnLoaderStartMessageHandlerTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down Expand Up @@ -1374,7 +1422,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 41D17A5D2C5A7429007C6EE6 /* StripeiOS Tests-Debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = Y28TH9SHX7;
GENERATE_INFOPLIST_FILE = YES;
Expand All @@ -1391,7 +1438,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 41D17A5E2C5A7429007C6EE6 /* StripeiOS Tests-Release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = Y28TH9SHX7;
GENERATE_INFOPLIST_FILE = YES;
Expand Down
Loading

0 comments on commit a4f6390

Please sign in to comment.