VKCOM / vk-ios-sdk

iOS library for working with VK API, authorization through VK app, using VK functions
MIT License
296 stars 167 forks source link

Вызов методов делегата до сокрытия SafariViewController #390

Closed goingreen closed 8 years ago

goingreen commented 8 years ago

Методы делегата

- (void)vkSdkAccessAuthorizationFinishedWithResult:(VKAuthorizationResult *)result;

- (void)vkSdkAuthorizationStateUpdatedWithResult:(VKAuthorizationResult *)result;

вызываются до того, как SafariViewController, отвечающий за авторизацию скрывается. Это немного неудобно, так как после получения токена приходится ждать пока SafariViewController уйдет с экрана. Для себя решил проблему путем вызова hideViews() в самом начале метода processOpenURL. Хотелось бы узнать какими последствиями грозит такое решение? В качестве альтернативного решения рассматривал бы вызов vkSdkDidDismissViewController на UI-делегате, так как в данный момент он вызывается только при авторизации через WebView.

dima-nikolaev commented 8 years ago

Методы VKSdkDelegate могут вызываться и после того, как SFSafariViewController скроется. Думаю, это зависит от интернета и мощности устройства (у меня на 4 айфоне они вызываются после скрытия, а на 6s Plus до, например)

Вы не пробовали реализовать авторизацию в отдельном вью контроллерe? Скажем, LoginViewController. И, в случае успешной авторизации, заменить rootViewController окна приложения на другой.

@implementation LoginViewController

- (void)vkSdkAccessAuthorizationFinishedWithResult:(VKAuthorizationResult *)result {

  if (result.token) {
    MainViewController *controller = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"Main view controller"];
    [[[[UIApplication sharedApplication] delegate] window] setRootViewController:controller];
  } else if (result.error) {
    [[[UIAlertView alloc] initWithTitle:nil message:[NSString stringWithFormat:@"Access denied\n%@", result.error] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil] show];
  }

}

Если вы часто обращаетесь к API Вконтакта из своего приложения, имеет смысл создать отдельный класс, и обращаться к API Вконтакта, а также авторизовываться, через этот класс, используя singleton pattern.