summaryrefslogtreecommitdiff
path: root/Juick/AppDelegate.m
blob: cf2afa8a678409c474a87a7ec7ed70a72612a390 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//
//  AppDelegate.m
//  Juick
//
//  Created by Vitaly Takmazov on 26.10.13.
//  Copyright (c) 2013 com.juick. All rights reserved.
//

#import "AppDelegate.h"
#import "MessagesViewController.h"
#import "LoginViewController.h"

#import "APIClient.h"
#import "Message.h"
#import "User.h"
#import "DeviceRegistration.h"
#import "NewPostViewController.h"
#import "FeedViewController.h"

@interface AppDelegate()
-(void) parseNotificationPayload:(NSDictionary *)userInfo;
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[UINavigationBar appearance] setTintColor:[UIColor colorNamed:@"Title"]];
    [[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];
    [[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor colorNamed:@"Muted"]}];
    [[UINavigationBar appearance] setLargeTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor colorNamed:@"Muted"]}];
    [[UIToolbar appearance] setTintColor:[UIColor colorNamed:@"Title"]];
    [[UITabBar appearance] setTintColor:[UIColor colorNamed:@"Title"]];
    
    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
    
    [self registerForRemoteNotifications];
    NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
    if (userInfo) {
        [self parseNotificationPayload:userInfo];
    } else {
        if ([[NSUserDefaults standardUserDefaults] objectForKey:@"FirstRun"] == nil) {
            [SAMKeychain deletePasswordForService:[[NSBundle mainBundle] bundleIdentifier] account:@"com.juick.username"];
            [SAMKeychain deletePasswordForService:[[NSBundle mainBundle] bundleIdentifier] account:@"com.juick.password"];
            [SAMKeychain setAccessibilityType:kSecAttrAccessibleAfterFirstUnlock];
            [[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:@"FirstRun"];
        }
    }
    return YES;
}

- (void)registerForRemoteNotifications {
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    center.delegate = self;
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
        if (!error) {
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                [[UIApplication sharedApplication] registerForRemoteNotifications];
            }];
        }
    }];
}

-(void) application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
    [[NSOperationQueue new] addOperationWithBlock:^{
        DeviceRegistration *registration = [DeviceRegistration new];
        registration.type = @"apns";
        registration.token = token;
        [[APIClient sharedClient] refreshDeviceRegistration:registration callback:^(BOOL success) {
            if (success) {
                NSLog(@"successfully refreshed registration with %@", token);
            }
        }];
    }];
}

-(void) application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"Error: %@", [error debugDescription]);
}

//Called when a notification is delivered to a foreground app.
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{
    completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
}

//Called to let your app know which action was selected by the user for a given notification.
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler{
    NSDictionary *userInfo = response.notification.request.content.userInfo;
    [self parseNotificationPayload:userInfo];
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        UITabBarController *main = (UITabBarController *)self.window.rootViewController;
        if ([self.pushedThread integerValue] > 0) {
            [main setSelectedIndex:0];
            UINavigationController *discover = (UINavigationController *)[main.viewControllers objectAtIndex:0];
            [discover popToRootViewControllerAnimated:NO];
            [[discover.viewControllers objectAtIndex:0] performSegueWithIdentifier:@"threadViewSegue" sender:discover];
        } else {
            [main setSelectedIndex:1];
            UINavigationController *dialogs = (UINavigationController *)[main.viewControllers objectAtIndex:1];
            [[dialogs.viewControllers objectAtIndex:0] performSegueWithIdentifier:@"chatSegue" sender:dialogs];
        }
    }];
    completionHandler();
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    if (userInfo[@"service"]) {
        application.applicationIconBadgeNumber = [userInfo[@"user"][@"unreadCount"] integerValue];
        [[UNUserNotificationCenter currentNotificationCenter] getDeliveredNotificationsWithCompletionHandler:^(NSArray<UNNotification *> * _Nonnull notifications) {
            for (UNNotification* notification in notifications) {
                if ([notification.request.content.userInfo[@"mid"] integerValue] == [userInfo[@"mid"] integerValue]) {
                    [[UNUserNotificationCenter currentNotificationCenter] removeDeliveredNotificationsWithIdentifiers:@[notification.request.identifier]];
                }
            }
        }];
    }
    completionHandler(UIBackgroundFetchResultNewData);
}

-(void) parseNotificationPayload:(NSDictionary *)userInfo {
    self.pushedThread = userInfo[@"mid"];
    self.pushedUname = userInfo[@"uname"];
}

+(AppDelegate *) shared {
    return (AppDelegate *)[UIApplication sharedApplication].delegate;
}

@end