handleOpenURL не вызывается после ссылки на Dropbox - iOS - PullRequest
4 голосов
/ 13 декабря 2011

Я начал изучать API Dropbox для своего приложения, где я хотел бы, чтобы пользователь мог выполнять резервное копирование файла базы данных. Проблема, с которой я столкнулся, заключается в том, что после того, как пользователь связывает приложение со своей учетной записью (аналогично входу в систему через Facebook), приложение не возвращается на передний план. Когда я вручную возвращаюсь к приложению, оно все еще находится на экране резервных копий, но учетная запись не была связана (насколько я могу судить), и метод делегата handleOpenUrl приложения не вызывается.

Есть идеи? или, может быть, кто-то знает хороший учебник для этого. Пример приложения Dropbox работает отлично, и я делаю все возможное, чтобы использовать его в качестве руководства, но, очевидно, я что-то напутал.

Делегат приложения:

#import "AppDelegate_iPad.h"
#import <DropboxSDK/DropboxSDK.h>
@interface AppDelegate_iPad () <DBSessionDelegate>

@end

@implementation AppDelegate_iPad

@synthesize window,viewController;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    self.viewController = [[mainMenuViewController alloc]init];
    [window addSubview:viewController.view]; //< this is a main menu viewcontroller for my app
    [self.window makeKeyAndVisible];
    // Set these variables before launching the app
    NSString* appKey = @"XXXX";
    NSString* appSecret = @"XXX";
    NSString *root = kDBRootAppFolder; 
    NSString* errorMsg = nil;

    if ([appKey rangeOfCharacterFromSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]].location != NSNotFound) {
        errorMsg = @"Make sure you set the app key correctly in DBRouletteAppDelegate.m";
    } else if ([appSecret rangeOfCharacterFromSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]].location != NSNotFound) {
        errorMsg = @"Make sure you set the app secret correctly in DBRouletteAppDelegate.m";
    } else if ([root length] == 0) {
        errorMsg = @"Set your root to use either App Folder of full Dropbox";
    } else {
        NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Info" ofType:@"plist"];
        NSData *plistData = [NSData dataWithContentsOfFile:plistPath];
        NSDictionary *loadedPlist = 
        [NSPropertyListSerialization 
         propertyListFromData:plistData mutabilityOption:0 format:NULL errorDescription:NULL];
        NSString *scheme = [[[[loadedPlist objectForKey:@"CFBundleURLTypes"] objectAtIndex:0] objectForKey:@"CFBundleURLSchemes"] objectAtIndex:0];
        if ([scheme isEqual:@"db-APP_KEY"]) {
            errorMsg = @"Set your URL scheme correctly in DBRoulette-Info.plist";
        }
    }

    DBSession* session = 
    [[DBSession alloc] initWithAppKey:appKey appSecret:appSecret root:root];
    session.delegate = self; // DBSessionDelegate methods allow you to handle re-authenticating
    [DBSession setSharedSession:session];
    [session release];

    if (errorMsg != nil) {
        [[[[UIAlertView alloc]
           initWithTitle:@"Error Configuring Session" message:errorMsg 
           delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]
          autorelease]
         show];
    }


    NSURL *launchURL = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
    NSInteger majorVersion = 
    [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] objectAtIndex:0] integerValue];
    if (launchURL && majorVersion < 4) {
        // Pre-iOS 4.0 won't call application:handleOpenURL; this code is only needed if you support
        // iOS versions 3.2 or below
        [self application:application handleOpenURL:launchURL];
        return NO;
    }


    return YES;
}


- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { /// this is never called
    if ([[DBSession sharedSession] handleOpenURL:url]) {
        if ([[DBSession sharedSession] isLinked]) {
            NSLog(@"App linked successfully!");
            // At this point you can start making API calls
        }
        return YES;
    }

    return NO;
}







@end

В главном меню пользователь нажал кнопку резервного копирования, после чего открывается следующий вид контроллера:

#import "BackupManagerViewController.h"
#import <DropboxSDK/DropboxSDK.h>
#import <stdlib.h>


@interface BackupManagerViewController () <DBRestClientDelegate>



//@property (nonatomic, readonly) DBRestClient* restClient;

@end

@implementation BackupManagerViewController
@synthesize itemsArray,delegate;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}



#pragma mark - View lifecycle

- (void)viewDidLoad
{

    //[super viewDidLoad];
    // Do any additional setup after loading the view from its nib.  
}


-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation
{
    return (orientation != UIDeviceOrientationLandscapeLeft) &&
    (orientation != UIDeviceOrientationLandscapeRight);
}


- (IBAction)didPressLink {
    if (![[DBSession sharedSession] isLinked]) {
        [[DBSession sharedSession] link];
    } else {
        [[DBSession sharedSession] unlinkAll];
        [[[[UIAlertView alloc] 
           initWithTitle:@"Account Unlinked!" message:@"Your dropbox account has been unlinked" 
           delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]
          autorelease]
         show];

    }
}


-(DBRestClient *)restClient{
    if (restClient == nil) {
        restClient = [[DBRestClient alloc]initWithSession:[DBSession sharedSession]];
        restClient.delegate = self;
    }

    return restClient;
}

-(IBAction) closeButtonPressed {
    [delegate closeBackupManager];
}


@end

Ответы [ 4 ]

11 голосов
/ 06 августа 2012

Что нужно проверить:

  1. Убедитесь, что у вас нет двух приложений с одинаковым db-APP_KEY
  2. Убедитесь, что только один из них реализован (но не оба) в вашем делегате приложения.

    (а) - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

    (б) - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

    Опция (b) устарела, поэтому перейдите с опцией (a) в новых приложениях

  3. Вы правильно ввели APP_KEY в схеме URL.

4 голосов
/ 18 декабря 2011

Я столкнулся с той же проблемой, но получил ее после удаления примера приложения DBRoulette из симулятора.Я также удалил свое собственное приложение и перезапустил симулятор, но я не уверен, что эти шаги были необходимы.

0 голосов
/ 14 декабря 2011

Я считаю, что эта проблема связана с запуском в симуляторе. Я запустил его на устройстве, и он работал нормально.

0 голосов
/ 13 декабря 2011

Вы добавили схему URL-адреса выпадающего списка в info.plist вашего приложения?

...