mirror of https://github.com/oxen-io/session-ios
- Use of new Keychain Access attribute - Error management (notifying the user) when opening app without required push and microphone permission - Enforcing APNID are sent to server, retry later if not able to reach serverpull/1/head
parent
3113665f08
commit
60fb869baa
@ -0,0 +1,23 @@
|
||||
//
|
||||
// PushManager.h
|
||||
// Signal
|
||||
//
|
||||
// Created by Frederic Jacobs on 31/07/14.
|
||||
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface PushManager : NSObject
|
||||
|
||||
+ (instancetype)sharedManager;
|
||||
|
||||
|
||||
- (void)verifyPushActivated;
|
||||
|
||||
- (void)askForPushRegistration;
|
||||
|
||||
- (void)registerForPushWithToken:(NSData*)token;
|
||||
|
||||
@end
|
||||
|
@ -0,0 +1,88 @@
|
||||
//
|
||||
// PushManager.m
|
||||
// Signal
|
||||
//
|
||||
// Created by Frederic Jacobs on 31/07/14.
|
||||
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
#import "PreferencesUtil.h"
|
||||
#import "PushManager.h"
|
||||
#import "Environment.h"
|
||||
#import "CallServerRequestsManager.h"
|
||||
|
||||
@interface PushManager ()
|
||||
|
||||
@property int retries;
|
||||
|
||||
@end
|
||||
|
||||
@implementation PushManager
|
||||
|
||||
+ (instancetype)sharedManager {
|
||||
static PushManager *sharedManager = nil;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
sharedManager = [[self alloc] init];
|
||||
});
|
||||
return sharedManager;
|
||||
}
|
||||
|
||||
- (void)verifyPushActivated{
|
||||
UIRemoteNotificationType notificationTypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
|
||||
|
||||
BOOL needsPushSettingChangeAlert = NO;
|
||||
|
||||
// enhancement: do custom message depending on the setting?
|
||||
|
||||
if (notificationTypes == UIRemoteNotificationTypeNone) {
|
||||
needsPushSettingChangeAlert = YES;
|
||||
} else if (notificationTypes == UIRemoteNotificationTypeBadge) {
|
||||
needsPushSettingChangeAlert = YES;
|
||||
} else if (notificationTypes == UIRemoteNotificationTypeAlert) {
|
||||
needsPushSettingChangeAlert = YES;
|
||||
} else if (notificationTypes == UIRemoteNotificationTypeSound) {
|
||||
needsPushSettingChangeAlert = YES;
|
||||
} else if (notificationTypes == (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert)) {
|
||||
needsPushSettingChangeAlert = YES;
|
||||
} else if (notificationTypes == (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)) {
|
||||
needsPushSettingChangeAlert = YES;
|
||||
}
|
||||
|
||||
if (needsPushSettingChangeAlert) {
|
||||
[[Environment preferences] setRevokedPushPermission:YES];
|
||||
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"ACTION_REQUIRED_TITLE", @"") message:NSLocalizedString(@"PUSH_SETTINGS_MESSAGE", @"") delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"") otherButtonTitles:nil, nil];
|
||||
[alertView show];
|
||||
} else if (!needsPushSettingChangeAlert){
|
||||
if ([[Environment preferences] encounteredRevokedPushPermission]) {
|
||||
[self askForPushRegistration];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
- (void)askForPushRegistration{
|
||||
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge)];
|
||||
self.retries = 3;
|
||||
}
|
||||
|
||||
- (void)registerForPushWithToken:(NSData*)token{
|
||||
[[CallServerRequestsManager sharedManager] registerPushToken:token success:^(NSURLSessionDataTask *task, id responseObject) {
|
||||
if ([task.response isKindOfClass: [NSHTTPURLResponse class]]){
|
||||
NSInteger statusCode = [(NSHTTPURLResponse*) task.response statusCode];
|
||||
if (statusCode == 200) {
|
||||
DDLogInfo(@"Device sent push ID to server");
|
||||
[[Environment preferences] setRevokedPushPermission:NO];
|
||||
}
|
||||
}
|
||||
} failure:^(NSURLSessionDataTask *task, NSError *error) {
|
||||
if (self.retries > 0) {
|
||||
[self registerForPushWithToken:token];
|
||||
self.retries--;
|
||||
} else{
|
||||
[[Environment preferences] setRevokedPushPermission:YES];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
|
||||
@end
|
@ -0,0 +1,18 @@
|
||||
//
|
||||
// CallServerRequests.h
|
||||
// Signal
|
||||
//
|
||||
// Created by Frederic Jacobs on 31/07/14.
|
||||
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <AFNetworking/AFNetworking.h>
|
||||
|
||||
@interface CallServerRequestsManager : NSObject
|
||||
|
||||
+ (instancetype)sharedManager;
|
||||
|
||||
- (void)registerPushToken:(NSData*)deviceToken success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure;
|
||||
|
||||
@end
|
@ -0,0 +1,63 @@
|
||||
//
|
||||
// CallServerRequests.m
|
||||
// Signal
|
||||
//
|
||||
// Created by Frederic Jacobs on 31/07/14.
|
||||
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
#import "HttpRequest.h"
|
||||
#import "CallServerRequestsManager.h"
|
||||
#import "DataUtil.h"
|
||||
#import "Environment.h"
|
||||
#import "HostNameEndPoint.h"
|
||||
#import "SGNKeychainUtil.h"
|
||||
|
||||
#define defaultRequestTimeout
|
||||
|
||||
@interface CallServerRequestsManager ()
|
||||
|
||||
@property (nonatomic, retain)AFHTTPSessionManager *operationManager;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation CallServerRequestsManager
|
||||
|
||||
+ (instancetype)sharedManager {
|
||||
static CallServerRequestsManager *sharedManager = nil;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
sharedManager = [[self alloc] init];
|
||||
});
|
||||
return sharedManager;
|
||||
}
|
||||
|
||||
- (id)init{
|
||||
self = [super init];
|
||||
|
||||
if (self) {
|
||||
HostNameEndPoint *endpoint = [[[Environment getCurrent]masterServerSecureEndPoint] hostNameEndPoint];
|
||||
NSURL *endPointURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://%@:%hu", endpoint.hostname, endpoint.port]];
|
||||
NSURLSessionConfiguration *sessionConf = [NSURLSessionConfiguration ephemeralSessionConfiguration];
|
||||
self.operationManager = [[AFHTTPSessionManager alloc] initWithBaseURL:endPointURL sessionConfiguration:sessionConf];
|
||||
[self.operationManager setSecurityPolicy:[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]];
|
||||
self.operationManager.securityPolicy.allowInvalidCertificates = YES; // We use a custom certificate, not signed by a CA.
|
||||
self.operationManager.responseSerializer = [AFJSONResponseSerializer serializer];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)registerPushToken:(NSData*)deviceToken success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
|
||||
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure{
|
||||
self.operationManager.requestSerializer = [self basicAuthenticationSerializer];
|
||||
|
||||
[self.operationManager PUT:[NSString stringWithFormat:@"/apn/%@",[deviceToken encodedAsHexString]] parameters:@{} success:success failure:failure];
|
||||
}
|
||||
|
||||
- (AFHTTPRequestSerializer*)basicAuthenticationSerializer{
|
||||
AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
|
||||
[serializer setValue:[HttpRequest computeBasicAuthorizationTokenForLocalNumber:[SGNKeychainUtil localNumber]andPassword:[SGNKeychainUtil serverAuthPassword]] forHTTPHeaderField:@"Authorization"];
|
||||
return serializer;
|
||||
}
|
||||
|
||||
@end
|
Loading…
Reference in New Issue