[ios] Prompt for access token in iosapp

If no access token is found in user defaults at launch, iosapp prompts the user for an access token. Renamed the user defaults key for the access token to conform to Cocoa naming conventions.

Fixes #4696.
This commit is contained in:
Minh Nguyễn
2016-04-18 01:56:38 -07:00
committed by Minh Nguyễn
parent 947f28f8bf
commit 96e0857227
3 changed files with 36 additions and 4 deletions

View File

@@ -1,5 +1,7 @@
#import <UIKit/UIKit.h>
extern NSString * const MBXMapboxAccessTokenDefaultsKey;
@interface MBXAppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;

View File

@@ -2,6 +2,8 @@
#import "MBXViewController.h"
#import <Mapbox/Mapbox.h>
NSString * const MBXMapboxAccessTokenDefaultsKey = @"MBXMapboxAccessToken";
@implementation MBXAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
@@ -12,14 +14,12 @@
if (accessToken) {
// Store to preferences so that we can launch the app later on without having to specify
// token.
[[NSUserDefaults standardUserDefaults] setObject:accessToken forKey:@"access_token"];
[[NSUserDefaults standardUserDefaults] setObject:accessToken forKey:MBXMapboxAccessTokenDefaultsKey];
} else {
// Try to retrieve from preferences, maybe we've stored them there previously and can reuse
// the token.
accessToken = [[NSUserDefaults standardUserDefaults] objectForKey:@"access_token"];
accessToken = [[NSUserDefaults standardUserDefaults] objectForKey:MBXMapboxAccessTokenDefaultsKey];
}
if ( ! accessToken) NSLog(@"No access token set. Mapbox vector tiles won't work.");
[MGLAccountManager setAccessToken:accessToken];
}

View File

@@ -1,4 +1,6 @@
#import "MBXViewController.h"
#import "MBXAppDelegate.h"
#import "MBXCustomCalloutView.h"
#import "MBXOfflinePacksTableViewController.h"
@@ -57,6 +59,34 @@ static const CLLocationCoordinate2D WorldTourDestinations[] = {
[self cycleStyles:self];
[self restoreState:nil];
if ( ! [MGLAccountManager accessToken].length)
{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Access Token" message:@"Enter your Mapbox access token to load Mapbox-hosted tiles and styles:" preferredStyle:UIAlertControllerStyleAlert];
[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField)
{
textField.keyboardType = UIKeyboardTypeURL;
textField.autocorrectionType = UITextAutocorrectionTypeNo;
textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
}];
[alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]];
UIAlertAction *OKAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action)
{
UITextField *textField = alertController.textFields.firstObject;
NSString *accessToken = textField.text;
[[NSUserDefaults standardUserDefaults] setObject:accessToken forKey:MBXMapboxAccessTokenDefaultsKey];
[MGLAccountManager setAccessToken:accessToken];
[self.mapView reloadStyle:self];
}];
[alertController addAction:OKAction];
if ([alertController respondsToSelector:@selector(setPreferredAction:)])
{
alertController.preferredAction = OKAction;
}
[self presentViewController:alertController animated:YES completion:nil];
}
}
- (void)saveState:(__unused NSNotification *)notification