diff --git a/CHANGES.rst b/CHANGES.rst index a6bade52f..99bf249ce 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,13 +1,19 @@ -Changes in 0.8.3 (2019-xx-xx) +Changes in 0.8.3 (2019-03-13) =============================================== +Improvements: + * Upgrade MatrixKit version ([v0.9.7](https://github.com/matrix-org/matrix-ios-kit/releases/tag/v0.9.7)). + +Bug fix: + * Widgets: Attempt to re-register for a scalar token if ours is invalid (#2326). + * Widgets: Pass scalar_token only when required. Changes in 0.8.2 (2019-03-11) =============================================== Improvements: - * Upgrade MatrixKit version ([v0.9.6](https://github.com/matrix-org/matrix-ios-kit/releases/tag/v0.9.6). + * Upgrade MatrixKit version ([v0.9.6](https://github.com/matrix-org/matrix-ios-kit/releases/tag/v0.9.6)). * Maintenance: Update cocopoads and pods. Automatic update to Swift4.2. * Add app store description as app string resource to make them available for translation on weblate (#2201). * Update deprecated contact availability checks (#2222). diff --git a/Podfile b/Podfile index a7ac4d707..531d95c29 100644 --- a/Podfile +++ b/Podfile @@ -7,7 +7,7 @@ use_frameworks! # Different flavours of pods to MatrixKit # The current MatrixKit pod version -$matrixKitVersion = '0.9.6' +$matrixKitVersion = '0.9.7' # The develop branch version #$matrixKitVersion = 'develop' diff --git a/Podfile.lock b/Podfile.lock index a8d29c768..e0324ce2a 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -44,21 +44,21 @@ PODS: - HPGrowingTextView (1.1) - libbase58 (0.1.4) - libPhoneNumber-iOS (0.9.13) - - MatrixKit (0.9.6): + - MatrixKit (0.9.7): - cmark (~> 0.24.1) - DTCoreText (~> 1.6.21) - HPGrowingTextView (~> 1.1) - libPhoneNumber-iOS (~> 0.9.13) - - MatrixKit/Core (= 0.9.6) + - MatrixKit/Core (= 0.9.7) - MatrixSDK (= 0.12.3) - - MatrixKit/AppExtension (0.9.6): + - MatrixKit/AppExtension (0.9.7): - cmark (~> 0.24.1) - DTCoreText (~> 1.6.21) - DTCoreText/Extension - HPGrowingTextView (~> 1.1) - libPhoneNumber-iOS (~> 0.9.13) - MatrixSDK (= 0.12.3) - - MatrixKit/Core (0.9.6): + - MatrixKit/Core (0.9.7): - cmark (~> 0.24.1) - DTCoreText (~> 1.6.21) - HPGrowingTextView (~> 1.1) @@ -102,8 +102,8 @@ DEPENDENCIES: - cmark - DTCoreText - GBDeviceInfo (~> 5.2.0) - - MatrixKit (= 0.9.6) - - MatrixKit/AppExtension (= 0.9.6) + - MatrixKit (= 0.9.7) + - MatrixKit/AppExtension (= 0.9.7) - MatrixSDK/JingleCallStack - MatrixSDK/SwiftSupport - OLMKit @@ -154,7 +154,7 @@ SPEC CHECKSUMS: HPGrowingTextView: 88a716d97fb853bcb08a4a08e4727da17efc9b19 libbase58: 7c040313537b8c44b6e2d15586af8e21f7354efd libPhoneNumber-iOS: e444379ac18bbfbdefad571da735b2cd7e096caa - MatrixKit: 3cc6fdb1254a076875215d43b5b8100f136634c7 + MatrixKit: da43b16842298fe0987ca8a98267bee775c10a35 MatrixSDK: 36c1a0da01a2745d4ffcca73e080610f05d47009 OLMKit: 88eda69110489f817d59bcb4353b7c247570aa4f PiwikTracker: 42862c7b13028065c3dfd36b4dc38db8a5765acf @@ -165,6 +165,6 @@ SPEC CHECKSUMS: WebRTC: f2a6203584745fe53532633397557876b5d71640 zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c -PODFILE CHECKSUM: 1f4241c97f15817bdef6c94f78a778f7d175e103 +PODFILE CHECKSUM: 033d67e4bbc8604bb6e37bac1d0ca1d90b8688dd COCOAPODS: 1.6.1 diff --git a/Riot/Assets/Riot-Defaults.plist b/Riot/Assets/Riot-Defaults.plist index 9c18e135d..7ad072f6b 100644 --- a/Riot/Assets/Riot-Defaults.plist +++ b/Riot/Assets/Riot-Defaults.plist @@ -28,6 +28,11 @@ https://scalar-staging.riot.im/scalar-web/ integrationsRestUrl https://scalar-staging.riot.im/scalar/api + integrationsWidgetsUrls + + https://scalar-staging.riot.im/scalar/api + https://scalar.vector.im/api + piwik url diff --git a/Riot/Generated/RiotDefaults.swift b/Riot/Generated/RiotDefaults.swift index 5c063181b..51897ad61 100644 --- a/Riot/Generated/RiotDefaults.swift +++ b/Riot/Generated/RiotDefaults.swift @@ -21,6 +21,7 @@ internal enum RiotDefaults { internal static let identityserverurl: String = _document["identityserverurl"] internal static let integrationsRestUrl: String = _document["integrationsRestUrl"] internal static let integrationsUiUrl: String = _document["integrationsUiUrl"] + internal static let integrationsWidgetsUrls: [String] = _document["integrationsWidgetsUrls"] internal static let matrixApps: Bool = _document["matrixApps"] internal static let maxAllowedMediaCacheSize: Int = _document["maxAllowedMediaCacheSize"] internal static let pinRoomsWithMissedNotif: Bool = _document["pinRoomsWithMissedNotif"] diff --git a/Riot/Managers/Widgets/Widget.m b/Riot/Managers/Widgets/Widget.m index 3831d9a02..482f54e9c 100644 --- a/Riot/Managers/Widgets/Widget.m +++ b/Riot/Managers/Widgets/Widget.m @@ -49,68 +49,73 @@ - (MXHTTPOperation *)widgetUrl:(void (^)(NSString * _Nonnull))success failure:(void (^)(NSError * _Nonnull))failure { - // Format the url string with user data (including their scalar token) - __weak typeof(self) weakSelf = self; - return [[WidgetManager sharedManager] getScalarTokenForMXSession:_mxSession success:^(NSString *scalarToken) { + __block NSString *widgetUrl = _url; - if (weakSelf) + // Format the url string with user data + NSString *userId = self.mxSession.myUser.userId; + NSString *displayName = self.mxSession.myUser.displayname ? self.mxSession.myUser.displayname : self.mxSession.myUser.userId; + NSString *avatarUrl = self.mxSession.myUser.avatarUrl ? self.mxSession.myUser.avatarUrl : @""; + + // Escape everything to build a valid URL string + // We can't know where the values escaped here will be inserted in the URL, so the alphanumeric charset is used + userId = [MXTools encodeURIComponent:userId]; + displayName = [MXTools encodeURIComponent:displayName]; + avatarUrl = [MXTools encodeURIComponent:avatarUrl]; + + widgetUrl = [widgetUrl stringByReplacingOccurrencesOfString:@"$matrix_user_id" withString:userId]; + widgetUrl = [widgetUrl stringByReplacingOccurrencesOfString:@"$matrix_display_name" withString:displayName]; + widgetUrl = [widgetUrl stringByReplacingOccurrencesOfString:@"$matrix_avatar_url" withString:avatarUrl]; + + // Integrate widget data into widget url + for (NSString *key in _data) + { + NSString *paramKey = [NSString stringWithFormat:@"$%@", key]; + + NSString *dataString; + MXJSONModelSetString(dataString, _data[key]); + + // Fix number data instead of expected string data + if (!dataString && [_data[key] isKindOfClass:NSNumber.class]) { - typeof(self) self = weakSelf; - NSString *userId = self.mxSession.myUser.userId; - NSString *displayName = self.mxSession.myUser.displayname ? self.mxSession.myUser.displayname : self.mxSession.myUser.userId; - NSString *avatarUrl = self.mxSession.myUser.avatarUrl ? self.mxSession.myUser.avatarUrl : @""; - - // Escape everything to build a valid URL string - // We can't know where the values escaped here will be inserted in the URL, so the alphanumeric charset is used - userId = [MXTools encodeURIComponent:userId]; - displayName = [MXTools encodeURIComponent:displayName]; - avatarUrl = [MXTools encodeURIComponent:avatarUrl]; - - NSString *widgetUrl = _url; - widgetUrl = [widgetUrl stringByReplacingOccurrencesOfString:@"$matrix_user_id" withString:userId]; - widgetUrl = [widgetUrl stringByReplacingOccurrencesOfString:@"$matrix_display_name" withString:displayName]; - widgetUrl = [widgetUrl stringByReplacingOccurrencesOfString:@"$matrix_avatar_url" withString:avatarUrl]; - - // Integrate widget data into widget url - for (NSString *key in _data) - { - NSString *paramKey = [NSString stringWithFormat:@"$%@", key]; - - NSString *dataString; - MXJSONModelSetString(dataString, _data[key]); - - // Fix number data instead of expected string data - if (!dataString && [_data[key] isKindOfClass:NSNumber.class]) - { - dataString = [((NSNumber*)_data[key]) stringValue]; - } - - if (dataString) - { - // same question as above - NSString *value = [MXTools encodeURIComponent:dataString]; - - widgetUrl = [widgetUrl stringByReplacingOccurrencesOfString:paramKey - withString:value]; - } - else - { - NSLog(@"[Widget] Error: Invalid data field value in %@ for key %@ in data %@", self, key, _data); - } - } - - // Add the user scalar token - widgetUrl = [widgetUrl stringByAppendingString:[NSString stringWithFormat:@"%@scalar_token=%@", - [widgetUrl containsString:@"?"] ? @"&" : @"?", - scalarToken]]; - - // Add the widget id - widgetUrl = [widgetUrl stringByAppendingString:[NSString stringWithFormat:@"&widgetId=%@", _widgetId]]; - - success(widgetUrl); + dataString = [((NSNumber*)_data[key]) stringValue]; } - } failure:failure]; + if (dataString) + { + // same question as above + NSString *value = [MXTools encodeURIComponent:dataString]; + + widgetUrl = [widgetUrl stringByReplacingOccurrencesOfString:paramKey + withString:value]; + } + else + { + NSLog(@"[Widget] Error: Invalid data field value in %@ for key %@ in data %@", self, key, _data); + } + } + + // Add the widget id + widgetUrl = [widgetUrl stringByAppendingString:[NSString stringWithFormat:@"%@widgetId=%@", + [widgetUrl containsString:@"?"] ? @"&" : @"?", + _widgetId]]; + + // Check if their scalar token must added + if ([WidgetManager isScalarUrl:widgetUrl]) + { + return [[WidgetManager sharedManager] getScalarTokenForMXSession:_mxSession validate:NO success:^(NSString *scalarToken) { + // Add the user scalar token + widgetUrl = [widgetUrl stringByAppendingString:[NSString stringWithFormat:@"&scalar_token=%@", + scalarToken]]; + + success(widgetUrl); + } failure:failure]; + } + else + { + success(widgetUrl); + } + + return nil; } - (BOOL)isActive diff --git a/Riot/Managers/Widgets/WidgetManager.h b/Riot/Managers/Widgets/WidgetManager.h index a95ba83e1..83b41ac2f 100644 --- a/Riot/Managers/Widgets/WidgetManager.h +++ b/Riot/Managers/Widgets/WidgetManager.h @@ -187,12 +187,22 @@ WidgetManagerErrorCode; to get one. @param mxSession the session to check. + @param validate if it is cached, check its validity on the scalar server. @param success A block object called when the operation succeeds. @param failure A block object called when the operation fails. */ - (MXHTTPOperation *)getScalarTokenForMXSession:(MXSession*)mxSession + validate:(BOOL)validate success:(void (^)(NSString *scalarToken))success failure:(void (^)(NSError *error))failure; +/** + Returns true if specified url is a scalar URL, typically https://scalar.vector.im/api + + @param urlString the URL to check. + @return YES if specified URL is a scalar URL. + */ ++ (BOOL)isScalarUrl:(NSString*)urlString; + @end diff --git a/Riot/Managers/Widgets/WidgetManager.m b/Riot/Managers/Widgets/WidgetManager.m index c225e140e..8f761bf08 100644 --- a/Riot/Managers/Widgets/WidgetManager.m +++ b/Riot/Managers/Widgets/WidgetManager.m @@ -442,6 +442,7 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain"; #pragma mark - Modular interface - (MXHTTPOperation *)getScalarTokenForMXSession:(MXSession*)mxSession + validate:(BOOL)validate success:(void (^)(NSString *scalarToken))success failure:(void (^)(NSError *error))failure; { @@ -450,65 +451,156 @@ NSString *const WidgetManagerErrorDomain = @"WidgetManagerErrorDomain"; __block NSString *scalarToken = [self scalarTokenForMXSession:mxSession]; if (scalarToken) { - success(scalarToken); + if (!validate) + { + success(scalarToken); + } + else + { + operation = [self validateScalarToken:scalarToken forMXSession:mxSession complete:^(BOOL valid) { + + if (valid) + { + success(scalarToken); + } + else + { + NSLog(@"[WidgetManager] getScalarTokenForMXSession: Invalid stored token. Need to register for a new token"); + MXHTTPOperation *operation2 = [self registerForScalarToken:mxSession success:success failure:failure]; + [operation mutateTo:operation2]; + } + + } failure:failure]; + } } else { - NSLog(@"[WidgetManager] getScalarTokenForMXSession: Need to register to get a token"); - - __weak __typeof__(self) weakSelf = self; - operation = [mxSession.matrixRestClient openIdToken:^(MXOpenIdToken *tokenObject) { - - typeof(self) self = weakSelf; - - if (self) - { - // Exchange the token for a scalar token - NSString *modularRestUrl = [[NSUserDefaults standardUserDefaults] objectForKey:@"integrationsRestUrl"]; - - MXHTTPClient *httpClient = [[MXHTTPClient alloc] initWithBaseURL:modularRestUrl andOnUnrecognizedCertificateBlock:nil]; - - MXHTTPOperation *operation2 = [httpClient requestWithMethod:@"POST" - path:@"register" - parameters:tokenObject.JSONDictionary - success:^(NSDictionary *JSONResponse) { - - MXJSONModelSetString(scalarToken, JSONResponse[@"scalar_token"]) - self->scalarTokens[mxSession.myUser.userId] = scalarToken; - - [self save]; - - if (success) - { - success(scalarToken); - } - - } failure:^(NSError *error) { - NSLog(@"[WidgetManager] getScalarTokenForMXSession. Error in modular/register request"); - - if (failure) - { - failure(error); - } - }]; - - [operation mutateTo:operation2]; - - } - - } failure:^(NSError *error) { - NSLog(@"[WidgetManager] getScalarTokenForMXSession. Error in openIdToken request"); - - if (failure) - { - failure(error); - } - }]; + NSLog(@"[WidgetManager] getScalarTokenForMXSession: Need to register for a token"); + operation = [self registerForScalarToken:mxSession success:success failure:failure]; } return operation; } +- (MXHTTPOperation *)registerForScalarToken:(MXSession*)mxSession + success:(void (^)(NSString *scalarToken))success + failure:(void (^)(NSError *error))failure +{ + MXHTTPOperation *operation; + + MXWeakify(self); + operation = [mxSession.matrixRestClient openIdToken:^(MXOpenIdToken *tokenObject) { + MXStrongifyAndReturnIfNil(self); + + // Exchange the token for a scalar token + NSString *modularRestUrl = [[NSUserDefaults standardUserDefaults] objectForKey:@"integrationsRestUrl"]; + + MXHTTPClient *httpClient = [[MXHTTPClient alloc] initWithBaseURL:modularRestUrl andOnUnrecognizedCertificateBlock:nil]; + + MXHTTPOperation *operation2 = + [httpClient requestWithMethod:@"POST" + path:@"register?v=1.1" + parameters:tokenObject.JSONDictionary + success:^(NSDictionary *JSONResponse) + { + + NSString *scalarToken; + MXJSONModelSetString(scalarToken, JSONResponse[@"scalar_token"]) + self->scalarTokens[mxSession.myUser.userId] = scalarToken; + + [self save]; + + if (success) + { + success(scalarToken); + } + + } failure:^(NSError *error) { + NSLog(@"[WidgetManager] registerForScalarToken. Error in modular/register request"); + + if (failure) + { + failure(error); + } + }]; + + [operation mutateTo:operation2]; + + } failure:^(NSError *error) { + NSLog(@"[WidgetManager] registerForScalarToken. Error in openIdToken request"); + + if (failure) + { + failure(error); + } + }]; + + return operation; +} + +- (MXHTTPOperation *)validateScalarToken:(NSString*)scalarToken forMXSession:(MXSession*)mxSession + complete:(void (^)(BOOL valid))complete + failure:(void (^)(NSError *error))failure +{ + NSString *modularRestUrl = [[NSUserDefaults standardUserDefaults] objectForKey:@"integrationsRestUrl"]; + MXHTTPClient *httpClient = [[MXHTTPClient alloc] initWithBaseURL:modularRestUrl andOnUnrecognizedCertificateBlock:nil]; + + return [httpClient requestWithMethod:@"GET" + path:[NSString stringWithFormat:@"account?v=1.1&scalar_token=%@", scalarToken] + parameters:nil + success:^(NSDictionary *JSONResponse) { + + NSString *userId; + MXJSONModelSetString(userId, JSONResponse[@"user_id"]) + + if ([userId isEqualToString:mxSession.myUser.userId]) + { + complete(YES); + } + else + { + NSLog(@"[WidgetManager] validateScalarToken. Unexpected modular/account response: %@", JSONResponse); + complete(NO); + } + + } failure:^(NSError *error) { + NSHTTPURLResponse *urlResponse = [MXHTTPOperation urlResponseFromError:error]; + + NSLog(@"[WidgetManager] validateScalarToken. Error in modular/account request. statusCode: %@", @(urlResponse.statusCode)); + + if (urlResponse && urlResponse.statusCode / 100 != 2) + { + complete(NO); + } + else if (failure) + { + failure(error); + } + }]; +} + ++ (BOOL)isScalarUrl:(NSString *)urlString +{ + BOOL isScalarUrl = NO; + + NSArray *scalarUrlStrings = [[NSUserDefaults standardUserDefaults] objectForKey:@"integrationsWidgetsUrls"]; + if (scalarUrlStrings.count == 0) + { + scalarUrlStrings = @[[[NSUserDefaults standardUserDefaults] objectForKey:@"integrationsRestUrl"]]; + } + + for (NSString *scalarUrlString in scalarUrlStrings) + { + if ([urlString hasPrefix:scalarUrlString]) + { + isScalarUrl = YES; + break; + } + } + + return isScalarUrl; +} + #pragma mark - Private methods - (NSString *)scalarTokenForMXSession:(MXSession *)mxSession diff --git a/Riot/Modules/Integrations/IntegrationManagerViewController.m b/Riot/Modules/Integrations/IntegrationManagerViewController.m index b8dd28448..37bab65fa 100644 --- a/Riot/Modules/Integrations/IntegrationManagerViewController.m +++ b/Riot/Modules/Integrations/IntegrationManagerViewController.m @@ -73,7 +73,7 @@ NSString *const kIntegrationManagerAddIntegrationScreen = @"add_integ"; // Make sure we have a scalar token MXWeakify(self); - operation = [[WidgetManager sharedManager] getScalarTokenForMXSession:mxSession success:^(NSString *theScalarToken) { + operation = [[WidgetManager sharedManager] getScalarTokenForMXSession:mxSession validate:YES success:^(NSString *theScalarToken) { MXStrongifyAndReturnIfNil(self); self->operation = nil; diff --git a/Riot/Modules/Integrations/Widgets/WidgetViewController.m b/Riot/Modules/Integrations/Widgets/WidgetViewController.m index 64e9be433..f67456292 100644 --- a/Riot/Modules/Integrations/Widgets/WidgetViewController.m +++ b/Riot/Modules/Integrations/Widgets/WidgetViewController.m @@ -172,12 +172,7 @@ NSString *const kJavascriptSendResponseToPostMessageAPI = @"riotIOS.sendResponse { // Filter out the users's scalar token NSString *errorDescription = error.description; - NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"scalar_token=\\w*" - options:NSRegularExpressionCaseInsensitive error:nil]; - errorDescription = [regex stringByReplacingMatchesInString:errorDescription - options:0 - range:NSMakeRange(0, errorDescription.length) - withTemplate:@"scalar_token=..."]; + errorDescription = [self stringByReplacingScalarTokenInString:errorDescription byScalarToken:@"..."]; NSLog(@"[WidgetVC] didFailLoadWithError: %@", errorDescription); @@ -185,6 +180,24 @@ NSString *const kJavascriptSendResponseToPostMessageAPI = @"riotIOS.sendResponse [self showErrorAsAlert:error]; } +- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler { + + if ([navigationResponse.response isKindOfClass:[NSHTTPURLResponse class]]) + { + NSHTTPURLResponse * response = (NSHTTPURLResponse *)navigationResponse.response; + if (response.statusCode != 200) + { + NSLog(@"[WidgetVC] decidePolicyForNavigationResponse: statusCode: %@", @(response.statusCode)); + } + + if (response.statusCode == 403 && [WidgetManager isScalarUrl:self.URL]) + { + [self fixScalarToken]; + } + } + decisionHandler(WKNavigationResponsePolicyAllow); +} + #pragma mark - postMessage API - (void)onPostMessageRequest:(NSString*)requestId data:(NSDictionary*)requestData @@ -315,4 +328,50 @@ NSString *const kJavascriptSendResponseToPostMessageAPI = @"riotIOS.sendResponse [self sendError:NSLocalizedStringFromTable(errorKey, @"Vector", nil) toRequest:requestId]; } + +#pragma mark - Private methods + +- (NSString *)stringByReplacingScalarTokenInString:(NSString*)string byScalarToken:(NSString*)scalarToken +{ + if (!string) + { + return nil; + } + + NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"scalar_token=\\w*" + options:NSRegularExpressionCaseInsensitive error:nil]; + return [regex stringByReplacingMatchesInString:string + options:0 + range:NSMakeRange(0, string.length) + withTemplate:[NSString stringWithFormat:@"scalar_token=%@", scalarToken]]; +} + +/** + Reset the scalar token used in the webview URL. + */ +- (void)fixScalarToken +{ + NSLog(@"[WidgetVC] fixScalarToken"); + + self->webView.hidden = YES; + + // Get a fresh new scalar token + [WidgetManager.sharedManager deleteDataForUser:widget.mxSession.myUser.userId]; + + MXWeakify(self); + [WidgetManager.sharedManager getScalarTokenForMXSession:widget.mxSession validate:NO success:^(NSString *scalarToken) { + MXStrongifyAndReturnIfNil(self); + + NSLog(@"[WidgetVC] fixScalarToken: DONE"); + + self.URL = [self stringByReplacingScalarTokenInString:self.URL byScalarToken:scalarToken]; + + self->webView.hidden = NO; + + } failure:^(NSError *error) { + NSLog(@"[WidgetVC] fixScalarToken: Error: %@", error); + [self showErrorAsAlert:error]; + }]; +} + @end diff --git a/Riot/SupportingFiles/Info.plist b/Riot/SupportingFiles/Info.plist index d09dfaa69..0ba03b225 100644 --- a/Riot/SupportingFiles/Info.plist +++ b/Riot/SupportingFiles/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.8.2 + 0.8.3 CFBundleSignature ???? CFBundleVersion - 0.8.2 + 0.8.3 ITSAppUsesNonExemptEncryption ITSEncryptionExportComplianceCode diff --git a/RiotShareExtension/Managers/ShareExtensionManager.m b/RiotShareExtension/Managers/ShareExtensionManager.m index 7816130e0..823993423 100644 --- a/RiotShareExtension/Managers/ShareExtensionManager.m +++ b/RiotShareExtension/Managers/ShareExtensionManager.m @@ -67,6 +67,9 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode) // Add observer on the Extension host [[NSNotificationCenter defaultCenter] addObserver:sharedInstance selector:@selector(checkUserAccount) name:NSExtensionHostWillEnterForegroundNotification object:nil]; + // Add observer to handle memory warning + [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(didReceiveMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; + MXSDKOptions *sdkOptions = [MXSDKOptions sharedInstance]; // Apply the application group sdkOptions.applicationGroupIdentifier = @"group.im.vector"; @@ -840,6 +843,11 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode) } } +- (void)didReceiveMemoryWarning:(NSNotification*)notification +{ + NSLog(@"[ShareExtensionManager] Did receive memory warning"); +} + #pragma mark - Sharing - (void)sendText:(NSString *)text toRoom:(MXRoom *)room successBlock:(dispatch_block_t)successBlock failureBlock:(void(^)(NSError *error))failureBlock diff --git a/RiotShareExtension/SupportingFiles/Info.plist b/RiotShareExtension/SupportingFiles/Info.plist index a6bd2c237..a536a94bb 100644 --- a/RiotShareExtension/SupportingFiles/Info.plist +++ b/RiotShareExtension/SupportingFiles/Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 0.8.2 + 0.8.3 CFBundleVersion - 0.8.2 + 0.8.3 NSExtension NSExtensionAttributes diff --git a/SiriIntents/Info.plist b/SiriIntents/Info.plist index d7700d65c..665cb5cd9 100644 --- a/SiriIntents/Info.plist +++ b/SiriIntents/Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 0.8.2 + 0.8.3 CFBundleVersion - 0.8.2 + 0.8.3 NSExtension NSExtensionAttributes