From 45aac3e22791ae69a01e029cd91f0df0f4846ca8 Mon Sep 17 00:00:00 2001 From: Ilya Grechuhin Date: Tue, 19 Jul 2016 12:48:26 +0300 Subject: [PATCH] [ios] Fixed permissions request on app launch. --- .../Welcome/MWMFirstLaunchController.mm | 82 ++++++------------- .../Classes/Location/MWMLocationManager.mm | 19 ++++- iphone/Maps/Classes/MapsAppDelegate.h | 17 ++-- iphone/Maps/Classes/MapsAppDelegate.mm | 12 ++- 4 files changed, 59 insertions(+), 71 deletions(-) diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/Welcome/MWMFirstLaunchController.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/Welcome/MWMFirstLaunchController.mm index a5ee10b462..a3170aea74 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/Welcome/MWMFirstLaunchController.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/Welcome/MWMFirstLaunchController.mm @@ -1,56 +1,39 @@ -#import "MapsAppDelegate.h" -#import "MapViewController.h" #import "MWMFirstLaunchController.h" #import "MWMLocationManager.h" #import "MWMPageController.h" +#import "MapViewController.h" +#import "MapsAppDelegate.h" #include "Framework.h" @interface MWMLocationManager () -@property (nonatomic) BOOL started; +@property(nonatomic) BOOL started; + (MWMLocationManager *)manager; @end @interface MWMFirstLaunchController () -@property (weak, nonatomic) IBOutlet UIView * containerView; -@property (weak, nonatomic) IBOutlet UIImageView * image; -@property (weak, nonatomic) IBOutlet UILabel * alertTitle; -@property (weak, nonatomic) IBOutlet UILabel * alertText; -@property (weak, nonatomic) IBOutlet UIButton * nextPageButton; -@property (weak, nonatomic) IBOutlet NSLayoutConstraint * containerWidth; -@property (weak, nonatomic) IBOutlet NSLayoutConstraint * containerHeight; +@property(weak, nonatomic) IBOutlet UIView * containerView; +@property(weak, nonatomic) IBOutlet UIImageView * image; +@property(weak, nonatomic) IBOutlet UILabel * alertTitle; +@property(weak, nonatomic) IBOutlet UILabel * alertText; +@property(weak, nonatomic) IBOutlet UIButton * nextPageButton; +@property(weak, nonatomic) IBOutlet NSLayoutConstraint * containerWidth; +@property(weak, nonatomic) IBOutlet NSLayoutConstraint * containerHeight; -@property (weak, nonatomic) IBOutlet NSLayoutConstraint * imageMinHeight; -@property (weak, nonatomic) IBOutlet NSLayoutConstraint * imageHeight; +@property(weak, nonatomic) IBOutlet NSLayoutConstraint * imageMinHeight; +@property(weak, nonatomic) IBOutlet NSLayoutConstraint * imageHeight; -@property (weak, nonatomic) IBOutlet NSLayoutConstraint * titleTopOffset; -@property (weak, nonatomic) IBOutlet NSLayoutConstraint * titleImageOffset; +@property(weak, nonatomic) IBOutlet NSLayoutConstraint * titleTopOffset; +@property(weak, nonatomic) IBOutlet NSLayoutConstraint * titleImageOffset; @end namespace { -void requestNotifications() -{ - UIApplication * app = [UIApplication sharedApplication]; - UIUserNotificationType userNotificationTypes = - (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound); - if ([app respondsToSelector:@selector(registerUserNotificationSettings:)]) - { - UIUserNotificationSettings * settings = - [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil]; - [app registerUserNotificationSettings:settings]; - [app registerForRemoteNotifications]; - } - else - { - [app registerForRemoteNotificationTypes:userNotificationTypes]; - } -} - +void requestNotifications() { [MapsAppDelegate initPushNotificationsWithLaunchOptions:nil]; } void zoomToCurrentPosition() { auto & f = GetFramework(); @@ -66,8 +49,7 @@ NSInteger constexpr kRequestLocationPage = 2; NSInteger constexpr kRequestNotificationsPage = 3; NSArray * pagesConfigBlocks = @[ - [^(MWMFirstLaunchController * controller) - { + [^(MWMFirstLaunchController * controller) { controller.image.image = [UIImage imageNamed:@"img_onboarding_offline_maps"]; controller.alertTitle.text = L(@"onboarding_offline_maps_title"); controller.alertText.text = L(@"onboarding_offline_maps_message"); @@ -76,8 +58,7 @@ NSArray * pagesConfigBlocks = @[ action:@selector(nextPage) forControlEvents:UIControlEventTouchUpInside]; } copy], - [^(MWMFirstLaunchController * controller) - { + [^(MWMFirstLaunchController * controller) { controller.image.image = [UIImage imageNamed:@"img_onboarding_geoposition"]; controller.alertTitle.text = L(@"onboarding_location_title"); controller.alertText.text = L(@"onboarding_location_message"); @@ -86,8 +67,7 @@ NSArray * pagesConfigBlocks = @[ action:@selector(nextPage) forControlEvents:UIControlEventTouchUpInside]; } copy], - [^(MWMFirstLaunchController * controller) - { + [^(MWMFirstLaunchController * controller) { controller.image.image = [UIImage imageNamed:@"img_onboarding_notification"]; controller.alertTitle.text = L(@"onboarding_notifications_title"); controller.alertText.text = L(@"onboarding_notifications_message"); @@ -96,8 +76,7 @@ NSArray * pagesConfigBlocks = @[ action:@selector(nextPage) forControlEvents:UIControlEventTouchUpInside]; } copy], - [^(MWMFirstLaunchController * controller) - { + [^(MWMFirstLaunchController * controller) { controller.image.image = [UIImage imageNamed:@"img_onboarding_done"]; controller.alertTitle.text = L(@"first_launch_congrats_title"); controller.alertText.text = L(@"first_launch_congrats_text"); @@ -107,20 +86,12 @@ NSArray * pagesConfigBlocks = @[ forControlEvents:UIControlEventTouchUpInside]; } copy] ]; -} // namespace +} // namespace @implementation MWMFirstLaunchController -+ (NSString *)udWelcomeWasShownKey -{ - return @"FirstLaunchWelcomeWasShown"; -} - -+ (NSArray *)pagesConfig -{ - return pagesConfigBlocks; -} - ++ (NSString *)udWelcomeWasShownKey { return @"FirstLaunchWelcomeWasShown"; } ++ (NSArray *)pagesConfig { return pagesConfigBlocks; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; @@ -130,11 +101,7 @@ NSArray * pagesConfigBlocks = @[ requestNotifications(); } -- (void)requestLocation -{ - [MWMLocationManager manager].started = YES; -} - +- (void)requestLocation { [MWMLocationManager manager].started = YES; } - (void)close { [self.pageController close]; @@ -150,7 +117,8 @@ NSArray * pagesConfigBlocks = @[ CGFloat const width = newSize.width; CGFloat const height = newSize.height; BOOL const hideImage = (self.imageHeight.multiplier * height <= self.imageMinHeight.constant); - self.titleImageOffset.priority = hideImage ? UILayoutPriorityDefaultLow : UILayoutPriorityDefaultHigh; + self.titleImageOffset.priority = + hideImage ? UILayoutPriorityDefaultLow : UILayoutPriorityDefaultHigh; self.image.hidden = hideImage; self.containerWidth.constant = width; self.containerHeight.constant = height; diff --git a/iphone/Maps/Classes/Location/MWMLocationManager.mm b/iphone/Maps/Classes/Location/MWMLocationManager.mm index 19009e1eb5..b095479351 100644 --- a/iphone/Maps/Classes/Location/MWMLocationManager.mm +++ b/iphone/Maps/Classes/Location/MWMLocationManager.mm @@ -140,6 +140,20 @@ void sendInfoToFramework(dispatch_block_t block) }); } } + +NSString * const kLocationPermissionRequestedKey = @"kLocationPermissionRequestedKey"; + +BOOL isPermissionRequested() +{ + return [[NSUserDefaults standardUserDefaults] boolForKey:kLocationPermissionRequestedKey]; +} + +void setPermissionRequested() +{ + NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; + [ud setBool:YES forKey:kLocationPermissionRequestedKey]; + [ud synchronize]; +} } // namespace @interface MWMLocationManager () @@ -199,13 +213,13 @@ void sendInfoToFramework(dispatch_block_t block) + (void)applicationDidBecomeActive { - if (![Alohalytics isFirstSession]) + if (isPermissionRequested()) [MWMLocationManager manager].started = YES; } + (void)applicationWillResignActive { - BOOL const keepRunning = keepRunningInBackground(); + BOOL const keepRunning = isPermissionRequested() && keepRunningInBackground(); MWMLocationManager * manager = [MWMLocationManager manager]; CLLocationManager * locationManager = manager.locationManager; if ([locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) @@ -490,6 +504,7 @@ void sendInfoToFramework(dispatch_block_t block) if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) [locationManager requestWhenInUseAuthorization]; [locationManager startUpdatingLocation]; + setPermissionRequested(); if ([CLLocationManager headingAvailable]) [locationManager startUpdatingHeading]; }; diff --git a/iphone/Maps/Classes/MapsAppDelegate.h b/iphone/Maps/Classes/MapsAppDelegate.h index 1a8fbf097e..87799a2730 100644 --- a/iphone/Maps/Classes/MapsAppDelegate.h +++ b/iphone/Maps/Classes/MapsAppDelegate.h @@ -8,16 +8,15 @@ @class MapViewController; @class LocationManager; -typedef NS_ENUM(NSUInteger, MWMRoutingPlaneMode) -{ +typedef NS_ENUM(NSUInteger, MWMRoutingPlaneMode) { MWMRoutingPlaneModeNone, MWMRoutingPlaneModePlacePage, MWMRoutingPlaneModeSearchSource, MWMRoutingPlaneModeSearchDestination }; -@interface MapsAppDelegate : UIResponder +@interface MapsAppDelegate + : UIResponder { NSInteger m_activeDownloadsCounter; UIBackgroundTaskIdentifier m_backgroundTask; @@ -25,14 +24,16 @@ typedef NS_ENUM(NSUInteger, MWMRoutingPlaneMode) UIAlertView * m_loadingAlertView; } -@property (nonatomic) UIWindow * window; -@property (nonatomic) MWMRoutingPlaneMode routingPlaneMode; +@property(nonatomic) UIWindow * window; +@property(nonatomic) MWMRoutingPlaneMode routingPlaneMode; -@property (nonatomic, readonly) MapViewController * mapViewController; -@property (nonatomic, readonly) BOOL isDrapeEngineCreated; +@property(nonatomic, readonly) MapViewController * mapViewController; +@property(nonatomic, readonly) BOOL isDrapeEngineCreated; + (MapsAppDelegate *)theApp; ++ (void)initPushNotificationsWithLaunchOptions:(NSDictionary *)launchOptions; + - (void)enableStandby; - (void)disableStandby; diff --git a/iphone/Maps/Classes/MapsAppDelegate.mm b/iphone/Maps/Classes/MapsAppDelegate.mm index 4b3f540d9d..8436a6720f 100644 --- a/iphone/Maps/Classes/MapsAppDelegate.mm +++ b/iphone/Maps/Classes/MapsAppDelegate.mm @@ -167,7 +167,7 @@ using namespace osm_auth_ios; #pragma mark - Notifications -- (void)initPushNotificationsWithLaunchOptions:(NSDictionary *)launchOptions ++ (void)initPushNotificationsWithLaunchOptions:(NSDictionary *)launchOptions { // Do not initialize Pushwoosh for open-source version. if (string(PUSHWOOSH_APPLICATION_ID).empty()) @@ -178,8 +178,8 @@ using namespace osm_auth_ios; objectForInfoDictionaryKey:@"CFBundleDisplayName"]]; PushNotificationManager * pushManager = [PushNotificationManager pushManager]; - // handling push on app start - [pushManager handlePushReceived:launchOptions]; + if (launchOptions) + [pushManager handlePushReceived:launchOptions]; // make sure we count app open in Pushwoosh stats [pushManager sendAppOpen]; @@ -431,7 +431,6 @@ using namespace osm_auth_ios; GetFramework().EnterForeground(); - [self initPushNotificationsWithLaunchOptions:launchOptions]; [self commonInit]; LocalNotificationManager * notificationManager = [LocalNotificationManager sharedManager]; @@ -441,9 +440,14 @@ using namespace osm_auth_ios; onLaunch:YES]; if ([Alohalytics isFirstSession]) + { [self firstLaunchSetup]; + } else + { [self incrementSessionsCountAndCheckForAlert]; + [MapsAppDelegate initPushNotificationsWithLaunchOptions:launchOptions]; + } [self enableTTSForTheFirstTime];