|
|
|
//
|
|
|
|
// 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 (nonatomic, copy) void (^PushRegisteringSuccessBlock)();
|
|
|
|
@property (nonatomic, copy) void (^PushRegisteringFailureBlock)();
|
|
|
|
|
|
|
|
@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;
|
|
|
|
|
|
|
|
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)askForPushRegistrationWithSuccess:(void (^)())success failure:(void (^)())failure{
|
|
|
|
self.PushRegisteringSuccessBlock = success;
|
|
|
|
self.PushRegisteringFailureBlock = failure;
|
|
|
|
[self askForPushRegistration];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)askForPushRegistration{
|
|
|
|
|
|
|
|
if(SYSTEM_VERSION_LESS_THAN(_iOS_8_0)){
|
|
|
|
[UIApplication.sharedApplication registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge)];
|
|
|
|
} else{
|
|
|
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1
|
|
|
|
UIMutableUserNotificationAction *action_accept = [[UIMutableUserNotificationAction alloc]init];
|
|
|
|
action_accept.identifier = @"Signal_Call_Accept";
|
|
|
|
action_accept.title = @"Pick up";
|
|
|
|
action_accept.activationMode = UIUserNotificationActivationModeForeground;
|
|
|
|
action_accept.destructive = YES;
|
|
|
|
action_accept.authenticationRequired = NO;
|
|
|
|
|
|
|
|
UIMutableUserNotificationAction *action_decline = [[UIMutableUserNotificationAction alloc]init];
|
|
|
|
action_decline.identifier = @"Signal_Call_Decline";
|
|
|
|
action_decline.title = @"Pick up";
|
|
|
|
action_decline.activationMode = UIUserNotificationActivationModeForeground;
|
|
|
|
action_decline.destructive = YES;
|
|
|
|
action_decline.authenticationRequired = NO;
|
|
|
|
|
|
|
|
UIMutableUserNotificationCategory *callCategory = [[UIMutableUserNotificationCategory alloc] init];
|
|
|
|
callCategory.identifier = @"Signal_IncomingCall";
|
|
|
|
[callCategory setActions:@[action_accept, action_decline] forContext:UIUserNotificationActionContextDefault];
|
|
|
|
|
|
|
|
NSSet *categories = [NSSet setWithObject:callCategory];
|
|
|
|
|
|
|
|
[UIApplication.sharedApplication registerForRemoteNotifications];
|
|
|
|
[UIApplication.sharedApplication registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound) categories:categories]];
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
self.retries = 3;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)registerForPushWithToken:(NSData*)token{
|
|
|
|
[CallServerRequestsManager.sharedInstance 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];
|
|
|
|
if (self.PushRegisteringSuccessBlock) {
|
|
|
|
self.PushRegisteringSuccessBlock();
|
|
|
|
self.PushRegisteringSuccessBlock = nil;
|
|
|
|
}
|
|
|
|
} else{
|
|
|
|
[self registerFailureWithToken:token];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} failure:^(NSURLSessionDataTask *task, NSError *error) {
|
|
|
|
[self registerFailureWithToken:token];
|
|
|
|
}];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Token was not sucessfully register. Try again / deal with failure
|
|
|
|
*
|
|
|
|
* @param token Token to register
|
|
|
|
*/
|
|
|
|
|
|
|
|
- (void)registerFailureWithToken:(NSData*)token{
|
|
|
|
if (self.retries > 0) {
|
|
|
|
[self registerForPushWithToken:token];
|
|
|
|
self.retries--;
|
|
|
|
} else{
|
|
|
|
if (self.PushRegisteringFailureBlock) {
|
|
|
|
self.PushRegisteringFailureBlock();
|
|
|
|
self.PushRegisteringFailureBlock = nil;
|
|
|
|
}
|
|
|
|
[[Environment preferences] setRevokedPushPermission:YES];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@end
|