From 04210b8a1464ab760be61611c309421a61d499d5 Mon Sep 17 00:00:00 2001 From: Miguel Alatzar Date: Tue, 12 Nov 2019 15:45:11 -0700 Subject: [PATCH 1/5] [MM-19968] Ensure SELECT_CHANNEL_WITH_MEMBER is dispatched when app opened from a push notification (#3533) * Dispatch SELECT_CHANNEL_WITH_MEMBER * Call handleSelectChannel with true when from any push notification * Always dispatch SELECT_CHANNEL_WITH_MEMBER with passed channelId * Add missing comma * Update unit tests * Fix makrChannelViewedAndRead call --- app/actions/views/channel.js | 64 ++++++++++--------- app/actions/views/channel.test.js | 51 ++++++++++++--- app/actions/views/root.js | 4 +- .../__snapshots__/notification.test.js.snap | 3 + app/screens/notification/notification.test.js | 60 +++++++++++++++++ app/utils/push_notifications.js | 2 +- test/setup.js | 7 ++ 7 files changed, 147 insertions(+), 44 deletions(-) create mode 100644 app/screens/notification/__snapshots__/notification.test.js.snap create mode 100644 app/screens/notification/notification.test.js diff --git a/app/actions/views/channel.js b/app/actions/views/channel.js index 122901c02..de59441e3 100644 --- a/app/actions/views/channel.js +++ b/app/actions/views/channel.js @@ -379,45 +379,23 @@ export function handleSelectChannel(channelId, fromPushNotification = false) { dispatch(loadPostsIfNecessaryWithRetry(channelId)); } + let previousChannelId; + if (!fromPushNotification && !sameChannel) { + previousChannelId = currentChannelId; + } + const actions = [ selectChannel(channelId), getChannelStats(channelId), setChannelDisplayName(channel.display_name), - { - type: ViewTypes.SET_INITIAL_POST_VISIBILITY, - data: channelId, - }, + setInitialPostVisibility(channelId), setChannelLoading(false), - { - type: ViewTypes.SET_LAST_CHANNEL_FOR_TEAM, - teamId: currentTeamId, - channelId, - }, + setLastChannelForTeam(currentTeamId, channelId), + selectChannelWithMember(channelId, channel, member), + markChannelViewedAndRead(channelId, previousChannelId), ]; - let markPreviousChannelId; - if (!fromPushNotification && !sameChannel) { - markPreviousChannelId = currentChannelId; - actions.push({ - type: ViewTypes.SELECT_CHANNEL_WITH_MEMBER, - data: currentChannelId, - channel: getChannel(state, currentChannelId), - member: getMyChannelMember(state, currentChannelId), - }); - } - - if (!fromPushNotification) { - actions.push({ - type: ViewTypes.SELECT_CHANNEL_WITH_MEMBER, - data: channelId, - channel, - member, - }); - } - dispatch(batchActions(actions)); - - dispatch(markChannelViewedAndRead(channelId, markPreviousChannelId)); }; } @@ -686,3 +664,27 @@ function setLoadMorePostsVisible(visible) { data: visible, }; } + +function setInitialPostVisibility(channelId) { + return { + type: ViewTypes.SET_INITIAL_POST_VISIBILITY, + data: channelId, + }; +} + +function setLastChannelForTeam(teamId, channelId) { + return { + type: ViewTypes.SET_LAST_CHANNEL_FOR_TEAM, + teamId, + channelId, + }; +} + +function selectChannelWithMember(channelId, channel, member) { + return { + type: ViewTypes.SELECT_CHANNEL_WITH_MEMBER, + data: channelId, + channel, + member, + }; +} diff --git a/app/actions/views/channel.test.js b/app/actions/views/channel.test.js index 3af66604b..350e02b40 100644 --- a/app/actions/views/channel.test.js +++ b/app/actions/views/channel.test.js @@ -5,27 +5,24 @@ import configureStore from 'redux-mock-store'; import thunk from 'redux-thunk'; import initialState from 'app/initial_state'; +import {ViewTypes} from 'app/constants'; import testHelper from 'test/test_helper'; -import { +import * as ChannelActions from 'app/actions/views/channel'; +const { + handleSelectChannel, handleSelectChannelByName, loadPostsIfNecessaryWithRetry, -} from 'app/actions/views/channel'; +} = ChannelActions; import postReducer from 'mattermost-redux/reducers/entities/posts'; -jest.mock('mattermost-redux/selectors/entities/channels', () => ({ - getChannel: () => ({data: 'received-channel-id'}), - getCurrentChannelId: () => 'current-channel-id', - getMyChannelMember: () => ({data: {member: {}}}), -})); - jest.mock('mattermost-redux/actions/channels', () => { const channelActions = require.requireActual('mattermost-redux/actions/channels'); return { ...channelActions, - markChannelAsRead: jest.fn(), - markChannelAsViewed: jest.fn(), + markChannelAsRead: jest.fn().mockReturnValue({type: ''}), + markChannelAsViewed: jest.fn().mockReturnValue({type: ''}), }; }); @@ -130,6 +127,11 @@ describe('Actions.Views.Channel', () => { }, }; + const channelSelectors = require('mattermost-redux/selectors/entities/channels'); + channelSelectors.getChannel = jest.fn((state, channelId) => ({data: channelId})); + channelSelectors.getCurrentChannelId = jest.fn(() => currentChannelId); + channelSelectors.getMyChannelMember = jest.fn(() => ({data: {member: {}}})); + test('handleSelectChannelByName success', async () => { store = mockStore(storeObj); @@ -238,4 +240,33 @@ describe('Actions.Views.Channel', () => { expect(postActions.getPostsSince).toHaveBeenCalledWith(currentChannelId, store.getState().views.channel.lastGetPosts[currentChannelId]); expect(receivedPostsSince).not.toBe(null); }); + + const handleSelectChannelCases = [ + [currentChannelId, true], + [currentChannelId, false], + [`not-${currentChannelId}`, true], + [`not-${currentChannelId}`, false], + ]; + test.each(handleSelectChannelCases)('handleSelectChannel dispatches selectChannelWithMember', async (channelId, fromPushNotification) => { + store = mockStore({...storeObj}); + + await store.dispatch(handleSelectChannel(channelId, fromPushNotification)); + const storeBatchActions = store.getActions().find(({type}) => type === 'BATCHING_REDUCER.BATCH'); + const selectChannelWithMember = storeBatchActions.payload.find(({type}) => type === ViewTypes.SELECT_CHANNEL_WITH_MEMBER); + + const expectedSelectChannelWithMember = { + type: ViewTypes.SELECT_CHANNEL_WITH_MEMBER, + data: channelId, + channel: { + data: channelId, + }, + member: { + data: { + member: {}, + }, + }, + + }; + expect(selectChannelWithMember).toStrictEqual(expectedSelectChannelWithMember); + }); }); diff --git a/app/actions/views/root.js b/app/actions/views/root.js index 8d3077c3c..6bed1877d 100644 --- a/app/actions/views/root.js +++ b/app/actions/views/root.js @@ -47,7 +47,7 @@ export function loadConfigAndLicense() { }; } -export function loadFromPushNotification(notification, startAppFromPushNotification) { +export function loadFromPushNotification(notification) { return async (dispatch, getState) => { const state = getState(); const {data} = notification; @@ -84,7 +84,7 @@ export function loadFromPushNotification(notification, startAppFromPushNotificat dispatch(selectTeam({id: teamId})); } - dispatch(handleSelectChannel(channelId, startAppFromPushNotification)); + dispatch(handleSelectChannel(channelId, true)); }; } diff --git a/app/screens/notification/__snapshots__/notification.test.js.snap b/app/screens/notification/__snapshots__/notification.test.js.snap new file mode 100644 index 000000000..87b26a683 --- /dev/null +++ b/app/screens/notification/__snapshots__/notification.test.js.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Notification should match snapshot 1`] = `null`; diff --git a/app/screens/notification/notification.test.js b/app/screens/notification/notification.test.js new file mode 100644 index 000000000..b89a5c4c1 --- /dev/null +++ b/app/screens/notification/notification.test.js @@ -0,0 +1,60 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React from 'react'; +import {shallow} from 'enzyme'; + +import Preferences from 'mattermost-redux/constants/preferences'; + +import Notification from './notification.js'; + +jest.mock('react-native-navigation', () => ({ + Navigation: { + events: jest.fn(() => ({ + registerComponentDidDisappearListener: jest.fn(), + })), + }, +})); + +describe('Notification', () => { + const baseProps = { + actions: { + loadFromPushNotification: jest.fn(), + }, + componentId: 'component-id', + deviceWidth: 100, + notification: {}, + theme: Preferences.THEMES.default, + }; + + test('should match snapshot', () => { + const wrapper = shallow( + , + ); + + expect(wrapper.getElement()).toMatchSnapshot(); + }); + + test('should call loadFromPushNotification on notification tap for non-local notification', () => { + const props = { + ...baseProps, + notification: { + localNotification: true, + }, + }; + const wrapper = shallow( + , + ); + const instance = wrapper.instance(); + + instance.notificationTapped(); + expect(baseProps.actions.loadFromPushNotification).not.toHaveBeenCalled(); + + const notification = { + localNotification: false, + }; + wrapper.setProps({notification}); + instance.notificationTapped(); + expect(baseProps.actions.loadFromPushNotification).toHaveBeenCalledWith(notification); + }); +}); diff --git a/app/utils/push_notifications.js b/app/utils/push_notifications.js index 29e4dc274..f296c139c 100644 --- a/app/utils/push_notifications.js +++ b/app/utils/push_notifications.js @@ -47,7 +47,7 @@ class PushNotificationUtils { loadFromNotification = async (notification) => { // Set appStartedFromPushNotification to avoid channel screen to call selectInitialChannel EphemeralStore.appStartedFromPushNotification = true; - await this.store.dispatch(loadFromPushNotification(notification, true)); + await this.store.dispatch(loadFromPushNotification(notification)); // if we have a componentId means that the app is already initialized const componentId = EphemeralStore.getNavigationTopComponentId(); diff --git a/test/setup.js b/test/setup.js index 73bb310d6..1833f6182 100644 --- a/test/setup.js +++ b/test/setup.js @@ -23,6 +23,7 @@ jest.doMock('react-native', () => { ImagePickerManager, requireNativeComponent, Alert: RNAlert, + InteractionManager: RNInteractionManager, NativeModules: RNNativeModules, } = ReactNative; @@ -31,6 +32,11 @@ jest.doMock('react-native', () => { alert: jest.fn(), }; + const InteractionManager = { + ...RNInteractionManager, + runAfterInteractions: jest.fn((cb) => cb()), + }; + const NativeModules = { ...RNNativeModules, UIManager: { @@ -87,6 +93,7 @@ jest.doMock('react-native', () => { ImagePickerManager, requireNativeComponent, Alert, + InteractionManager, NativeModules, }, ReactNative); }); From 78cbcf14376d06013f25a52a77eafec454b8d6fb Mon Sep 17 00:00:00 2001 From: CJ <38697367+imisshtml@users.noreply.github.com> Date: Tue, 12 Nov 2019 17:48:14 -0500 Subject: [PATCH 2/5] MM-19966 Fixed Notification Settings (#3535) * MM-19966 Fixed Notification Settings Fixed the save functionality for props. There was a change to combine notification settings that then did a deep comparison on two like objects. This change makes the comparison of the newly changed notification props and the previous props. * Fix unit test --- .../notification_settings/notification_settings.js | 5 +++-- .../notification_settings.test.js | 14 +++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/screens/settings/notification_settings/notification_settings.js b/app/screens/settings/notification_settings/notification_settings.js index 9c832cd07..a878b43ea 100644 --- a/app/screens/settings/notification_settings/notification_settings.js +++ b/app/screens/settings/notification_settings/notification_settings.js @@ -134,12 +134,13 @@ export default class NotificationSettings extends PureComponent { saveNotificationProps = (notifyProps) => { const {currentUser} = this.props; + const prevProps = getNotificationProps(currentUser); const updatedProps = { - ...getNotificationProps(currentUser), + ...prevProps, ...notifyProps, }; - if (!deepEqual(updatedProps, notifyProps)) { + if (!deepEqual(prevProps, notifyProps)) { this.props.actions.updateMe({notify_props: updatedProps}); } }; diff --git a/app/screens/settings/notification_settings/notification_settings.test.js b/app/screens/settings/notification_settings/notification_settings.test.js index 96cacca59..863a966f6 100644 --- a/app/screens/settings/notification_settings/notification_settings.test.js +++ b/app/screens/settings/notification_settings/notification_settings.test.js @@ -9,13 +9,16 @@ import {shallowWithIntl} from 'test/intl-test-helper'; import NotificationSettings from './notification_settings.js'; +import {getNotificationProps} from 'app/utils/notify_props'; + describe('NotificationSettings', () => { + const currentUser = {id: 'current_user_id'}; const baseProps = { actions: { updateMe: jest.fn(), }, componentId: 'component-id', - currentUser: {id: 'current_user_id'}, + currentUser, theme: Preferences.THEMES.default, updateMeRequest: {}, currentUserStatus: 'status', @@ -32,17 +35,22 @@ describe('NotificationSettings', () => { }); test('should include previous notification props when saving new ones', () => { - baseProps.currentUser.notify_props = {previous: 'previous'}; const wrapper = shallowWithIntl( ); const instance = wrapper.instance(); + + const defaultNotifyProps = getNotificationProps(currentUser); + instance.saveNotificationProps(defaultNotifyProps); + expect(baseProps.actions.updateMe).toHaveBeenCalledTimes(0); + const newProps = {new: 'new'}; instance.saveNotificationProps(newProps); + expect(baseProps.actions.updateMe).toHaveBeenCalledTimes(1); expect(baseProps.actions.updateMe).toHaveBeenCalledWith({ notify_props: { - ...baseProps.currentUser.notify_props, + ...defaultNotifyProps, ...newProps, }, }); From e5e3bcc84441ed20eb5060bf64f6312b396c9041 Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Tue, 12 Nov 2019 18:45:43 -0500 Subject: [PATCH 3/5] Bump app build number to 244 (#3548) --- android/app/build.gradle | 2 +- ios/Mattermost.xcodeproj/project.pbxproj | 4 ++-- ios/Mattermost/Info.plist | 2 +- ios/MattermostShare/Info.plist | 2 +- ios/MattermostTests/Info.plist | 2 +- ios/NotificationService/Info.plist | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 35cd1ccb1..89d2e15ab 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -140,7 +140,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion missingDimensionStrategy "RNN.reactNativeVersion", "reactNative60" - versionCode 243 + versionCode 244 versionName "1.25.0" multiDexEnabled = true ndk { diff --git a/ios/Mattermost.xcodeproj/project.pbxproj b/ios/Mattermost.xcodeproj/project.pbxproj index 29bc87906..1d5f68890 100644 --- a/ios/Mattermost.xcodeproj/project.pbxproj +++ b/ios/Mattermost.xcodeproj/project.pbxproj @@ -1060,7 +1060,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 243; + CURRENT_PROJECT_VERSION = 244; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; @@ -1098,7 +1098,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 243; + CURRENT_PROJECT_VERSION = 244; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; diff --git a/ios/Mattermost/Info.plist b/ios/Mattermost/Info.plist index 4fd49fdc3..cb1a4700d 100644 --- a/ios/Mattermost/Info.plist +++ b/ios/Mattermost/Info.plist @@ -34,7 +34,7 @@ CFBundleVersion - 243 + 244 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/ios/MattermostShare/Info.plist b/ios/MattermostShare/Info.plist index 2aa2a57c8..19bb7f690 100644 --- a/ios/MattermostShare/Info.plist +++ b/ios/MattermostShare/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.25.0 CFBundleVersion - 243 + 244 NSAppTransportSecurity NSAllowsArbitraryLoads diff --git a/ios/MattermostTests/Info.plist b/ios/MattermostTests/Info.plist index ae0cd033f..9898ab5bb 100644 --- a/ios/MattermostTests/Info.plist +++ b/ios/MattermostTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 243 + 244 diff --git a/ios/NotificationService/Info.plist b/ios/NotificationService/Info.plist index 47766f21b..70e19fd7a 100644 --- a/ios/NotificationService/Info.plist +++ b/ios/NotificationService/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.25.0 CFBundleVersion - 243 + 244 NSExtension NSExtensionPointIdentifier From dc830c56be555dcf5b841d4d0f41ea6a983a4a33 Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Wed, 13 Nov 2019 13:38:20 -0500 Subject: [PATCH 4/5] MM-20149 Fix marking channels as read (#3549) * MM-20149 Fix marking channels as read * empty commit --- app/actions/views/channel.js | 2 +- app/actions/views/channel.test.js | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/actions/views/channel.js b/app/actions/views/channel.js index de59441e3..4d89dcd77 100644 --- a/app/actions/views/channel.js +++ b/app/actions/views/channel.js @@ -392,10 +392,10 @@ export function handleSelectChannel(channelId, fromPushNotification = false) { setChannelLoading(false), setLastChannelForTeam(currentTeamId, channelId), selectChannelWithMember(channelId, channel, member), - markChannelViewedAndRead(channelId, previousChannelId), ]; dispatch(batchActions(actions)); + dispatch(markChannelViewedAndRead(channelId, previousChannelId)); }; } diff --git a/app/actions/views/channel.test.js b/app/actions/views/channel.test.js index 350e02b40..de26b10c7 100644 --- a/app/actions/views/channel.test.js +++ b/app/actions/views/channel.test.js @@ -17,12 +17,15 @@ const { import postReducer from 'mattermost-redux/reducers/entities/posts'; +const MOCK_CHANNEL_MARK_AS_READ = 'MOCK_CHANNEL_MARK_AS_READ'; +const MOCK_CHANNEL_MARK_AS_VIEWED = 'MOCK_CHANNEL_MARK_AS_VIEWED'; + jest.mock('mattermost-redux/actions/channels', () => { const channelActions = require.requireActual('mattermost-redux/actions/channels'); return { ...channelActions, - markChannelAsRead: jest.fn().mockReturnValue({type: ''}), - markChannelAsViewed: jest.fn().mockReturnValue({type: ''}), + markChannelAsRead: jest.fn().mockReturnValue({type: 'MOCK_CHANNEL_MARK_AS_READ'}), + markChannelAsViewed: jest.fn().mockReturnValue({type: 'MOCK_CHANNEL_MARK_AS_VIEWED'}), }; }); @@ -251,8 +254,11 @@ describe('Actions.Views.Channel', () => { store = mockStore({...storeObj}); await store.dispatch(handleSelectChannel(channelId, fromPushNotification)); - const storeBatchActions = store.getActions().find(({type}) => type === 'BATCHING_REDUCER.BATCH'); + const storeActions = store.getActions(); + const storeBatchActions = storeActions.find(({type}) => type === 'BATCHING_REDUCER.BATCH'); const selectChannelWithMember = storeBatchActions.payload.find(({type}) => type === ViewTypes.SELECT_CHANNEL_WITH_MEMBER); + const viewedAction = storeActions.find(({type}) => type === MOCK_CHANNEL_MARK_AS_VIEWED); + const readAction = storeActions.find(({type}) => type === MOCK_CHANNEL_MARK_AS_READ); const expectedSelectChannelWithMember = { type: ViewTypes.SELECT_CHANNEL_WITH_MEMBER, @@ -268,5 +274,7 @@ describe('Actions.Views.Channel', () => { }; expect(selectChannelWithMember).toStrictEqual(expectedSelectChannelWithMember); + expect(viewedAction).not.toBe(null); + expect(readAction).not.toBe(null); }); }); From 37e715ac8a80f4fb85c6dd90ebf2469239e7c3ec Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Wed, 13 Nov 2019 14:46:30 -0500 Subject: [PATCH 5/5] Bump app build number to 245 (#3551) --- android/app/build.gradle | 2 +- ios/Mattermost.xcodeproj/project.pbxproj | 4 ++-- ios/Mattermost/Info.plist | 2 +- ios/MattermostShare/Info.plist | 2 +- ios/MattermostTests/Info.plist | 2 +- ios/NotificationService/Info.plist | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 89d2e15ab..2f38a30ed 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -140,7 +140,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion missingDimensionStrategy "RNN.reactNativeVersion", "reactNative60" - versionCode 244 + versionCode 245 versionName "1.25.0" multiDexEnabled = true ndk { diff --git a/ios/Mattermost.xcodeproj/project.pbxproj b/ios/Mattermost.xcodeproj/project.pbxproj index 1d5f68890..5b90b036a 100644 --- a/ios/Mattermost.xcodeproj/project.pbxproj +++ b/ios/Mattermost.xcodeproj/project.pbxproj @@ -1060,7 +1060,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 244; + CURRENT_PROJECT_VERSION = 245; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; @@ -1098,7 +1098,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 244; + CURRENT_PROJECT_VERSION = 245; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; diff --git a/ios/Mattermost/Info.plist b/ios/Mattermost/Info.plist index cb1a4700d..f15b3e80a 100644 --- a/ios/Mattermost/Info.plist +++ b/ios/Mattermost/Info.plist @@ -34,7 +34,7 @@ CFBundleVersion - 244 + 245 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/ios/MattermostShare/Info.plist b/ios/MattermostShare/Info.plist index 19bb7f690..15f3ed814 100644 --- a/ios/MattermostShare/Info.plist +++ b/ios/MattermostShare/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.25.0 CFBundleVersion - 244 + 245 NSAppTransportSecurity NSAllowsArbitraryLoads diff --git a/ios/MattermostTests/Info.plist b/ios/MattermostTests/Info.plist index 9898ab5bb..fe65b8357 100644 --- a/ios/MattermostTests/Info.plist +++ b/ios/MattermostTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 244 + 245 diff --git a/ios/NotificationService/Info.plist b/ios/NotificationService/Info.plist index 70e19fd7a..541cacf20 100644 --- a/ios/NotificationService/Info.plist +++ b/ios/NotificationService/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.25.0 CFBundleVersion - 244 + 245 NSExtension NSExtensionPointIdentifier