Обработка ответа аутентификации Dropbox

Документация Dropbox объясняет, что по умолчанию ответ для аутентификации запускается в Appdelegate.m. Как мне сделать так, чтобы делегат моего собственного класса запускал тот же самый ответ?

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url
    sourceApplication:(NSString *)source annotation:(id)annotation {
    if ([[DBSession sharedSession] handleOpenURL:url]) {
        if ([[DBSession sharedSession] isLinked]) {
            NSLog(@"App linked successfully!");
            // At this point you can start making API calls
        }
        return YES;
    }
    // Add whatever other url handling code your app requires here
    return NO;
}

person iTag    schedule 20.06.2014    source источник
comment
Я не думаю, что у вас есть выбор, где реализовать openURL. Я считаю, что это должен быть член вашего класса UIApplication (обычно в файле с именем AppDelegate.m).   -  person user94559    schedule 20.06.2014


Ответы (2)


введите описание изображения здесьВ типе URL-адреса списка информации --> в схемах URL-адресов просто добавьте db-YourAppKey, этот метод получит называется.

Этот метод вызывается автоматически. Надеюсь, вы уже создали приложение с сайта разработчика Dropbox и получили appKey и appSecret. Используйте этот код в делегате приложения NSString* appKey = @"";

NSString* appSecret = @"";
        NSString *root = kDBRootDropbox;
        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];
        [DBRequest setNetworkRequestDelegate:self];
       // [[DBSession sharedSession]unlinkAll];

        if ([[DBSession sharedSession] isLinked]) 
        {
            isAccountForDropBox = YES;
        }
        else{
           isAccountForDropBox = NO;
        }

//После использования этого открытого URL-адреса вызовется автоматически.

person user3663584    schedule 20.06.2014
comment
Ага. Надеюсь, я создал приложение в Dropbox, и у меня есть ключ приложения, секретный ключ, который я использовал в My Appdelegate.m, но как я могу реализовать ваш код в своем пользовательском классе. Можете вы помочь мне. ? - person iTag; 20.06.2014
comment
я уже следил за их документом, он работает нормально. Но мое требование заключается в том, что мне нужно использовать их в своем пользовательском классе. это оно. - person iTag; 20.06.2014
comment
В типе URL-адреса информационного листа --› в схемах URL-адресов просто добавьте db-YourAppKey, этот метод также вызовет вызов, не требующий кода делегата приложения. Я обновил документ, просто проверьте его. - person user3663584; 20.06.2014
comment
Привет. друг. Все работает нормально. Но я не хочу использовать эти операторы в APPDELEGATE.m. Вы получили мои требования. Пожалуйста? - person iTag; 20.06.2014

Этот метод отвечает только в AppDelegate.m, вы не можете использовать его вне его. Чтобы использовать в своем ViewController или любом классе, вы должны использовать уведомление о почте

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url
    sourceApplication:(NSString *)source annotation:(id)annotation {
    if ([[DBSession sharedSession] handleOpenURL:url]) {
        if ([[DBSession sharedSession] isLinked]) {
            NSLog(@"App linked successfully!");
            // Post Notify here
             [[NSNotificationCenter defaultCenter] postNotificationName:@"applicationDidLinkWithDropbox"   object:self];

        }
        return YES;
    }
    // Add whatever other url handling code your app requires here
    return NO;
}

Затем получите это уведомление в своем классе, например, в ViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(dropBoxDidLink:)
                                                     name:@"applicationDidLinkWithDropbox"
                                                   object:nil];
}
- (void) dropBoxDidLink:(NSNotification *)notification {
    if ([[notification name] isEqualToString:@"applicationDidLinkWithDropbox"]) {
    //Handle your task here

    }
}
person LE SANG    schedule 21.06.2014