Dropbox SDK - linkFromController: делегат или обратный вызов?

Я добавляю Dropbox в свое приложение, используя SDK, доступный на их сайте. Есть ли способ вызвать какой-либо метод после [[DBSession sharedSession] linkFromController:self]; ссылок с учетной записью?

В принципе, я хотел бы позвонить [self.tableView reloadData] после того, как приложение попытается войти в Dropbox. Также не нужно различать успешный или неудачный вход.

Ответ 1

SDK Dropbox использует ваш AppDelegate в качестве приемника обратного вызова. Поэтому, когда вы вызвали [[DBSession sharedSession] linkFromController:self];, Dropbox SDK будет в любом случае звонить  ваш метод AppDelegate – application:openURL:sourceApplication:annotation:.

Итак, в AppDelegate вы можете проверить [[DBSession sharedSession] isLinked], если логин был успешным или нет. К сожалению, для вашего диспетчера viewController нет обратного вызова, поэтому вам необходимо уведомить его другими способами (прямая ссылка или отправить уведомление).

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    if ([[DBSession sharedSession] handleOpenURL:url]) {
        if ([[DBSession sharedSession] isLinked]) {
            // At this point you can start making API Calls. Login was successful
            [self doSomething];
        } else {
            // Login was canceled/failed.
        }
        return YES;
    }
    // Add whatever other url handling code your app requires here
    return NO;
}

Этот довольно странный способ вызвать приложение назад был представлен Dropbox из-за проблемы с политиками Apple. В старых версиях SDK для входа в систему была открыта внешняя страница Safari. Apple не будет принимать такие приложения в определенный момент времени. Итак, ребята Dropbox представили логин контроллера внутреннего вида, но сохранили AppDelegate в качестве получателя результатов. Если у пользователя есть приложение Dropbox, установленное на его устройстве, логин будет направлен в приложение Dropbox, а AppDelegate будет вызван при возврате.

Ответ 2

в делетете приложения add:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { 
    if ([[DBSession sharedSession] handleOpenURL:url]) {

        [[NSNotificationCenter defaultCenter]
         postNotificationName:@"isDropboxLinked"
         object:[NSNumber numberWithBool:[[DBSession sharedSession] isLinked]]];

        return YES;
    }

    return NO;
}

и в вашем пользовательском классе:

- (void)viewDidLoad {
    [super viewDidLoad];

    //Add observer to see the changes
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(isDropboxLinkedHandle:) name:@"isDropboxLinked" object:nil];

}

и

  - (void)isDropboxLinkedHandle:(id)sender
{
    if ([[sender object] intValue]) {
       //is linked.
    }
    else {
       //is not linked
    }
}