IOS рдореЗрдВ Yandex OAuth рдкреНрд░рд╛рдзрд┐рдХрд░рдг

рдпрд╛рдВрдбреЗрдХреНрд╕ рдПрдкреАрдЖрдИ рдкрд░ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХ рдЯреЛрдХрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЖрдк рдЗрд╕реЗ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдкреВрдЫреЗрдВ рдФрд░ oauth.yandex.ru/token рдкрд░ рдПрдХ рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдЦрд╛рддреЗ рд╕реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдЖрд╡реЗрджрди рдХреЛ рдирд╣реАрдВ рд╕реМрдВрдкрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рдпреИрдВрдбреЗрдХреНрд╕ рд╕реНрд╡рдпрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред рджреВрд╕рд░реА рд╡рд┐рдзрд┐, рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ, рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ - OAuth рдкреНрд░рд╛рдзрд┐рдХрд░рдгред

рдЖрд╡реЗрджрди рдкрдВрдЬреАрдХрд░рдг


рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ api.yandex.ru/oauth/doc/dg/tasks/register-client.xml рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ ред

рдкрдВрдЬреАрдХрд░рдг рд╕реНрддрд░ рдкрд░, рд╣рдо рдПрдХ рдпреВрдЖрд░рдПрд▓ рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ



рдФрд░ рдЖрд╡реЗрджрди рдХреА рдЖрдИрдбреА рдпрд╛рдж рд░рдЦреЗрдВ



рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк


рд╣рдо рдлрд┐рд░ рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╕рдлрд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдмрд╛рдж, url рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдЙрд╕ рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрдВрдЬреАрдХрд░рдг рдЪрд░рдг рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдерд╛ред

рдпрд╣рд╛рдВ рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдВрднрд╡ рд╣реИрдВред
1) рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ URL рдпреЛрдЬрдирд╛ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдЖрд╡реЗрджрди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╕рдлрд╝рд╛рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдлрд╝реЙрд░реНрдо рдХреЗ рд╕рд╛рде рдЦреЛрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЖрд╡реЗрджрди рдХреЗ рдкреБрдирдГ рдЖрд░рдВрдн рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдпреВрдЖрд░рдПрд▓ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡реЗрджрди рджрд░реНрдЬ рдХрд░рдирд╛ рдпрд╣рд╛рдВ рд╡рд┐рд╕реНрддреГрдд рд╣реИред

2) рд╣рдо UIWebView рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╣рдо рдЕрдкрдиреА рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрдХреНрд░рдордг рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВред

рджреВрд╕рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореБрдЭреЗ рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдирд╣реАрдВ рдЫреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпреИрдВрдбреЗрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдХреЛрдб рд▓рд┐рдЦрдирд╛


Xcode рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВред





YandexOauthViewController рдЬреЛрдбрд╝реЗрдВред * рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП (рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ)ред

YandexOauthViewController.h рдореЗрдВ, рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓реЗрдВ:

#define URL_SCHEME @"iostestapp"
#define CLIENT_ID @"6ef1c6dc6f134a2daa67cc905e5c1a3d"


ViewController.h рдореЗрдВ, рд╣рдо YandexOauthViewController.h рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЦреБрдж рдХреЛ YandexOauthViewControllerDelegate рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ "рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛" рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

#import <UIKit/UIKit.h>

#import "YandexOauthViewController.h"

@interface ViewController : UIViewController <YandexOauthViewControllerDelegate>

@end


рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдЕрдзрд┐рдХреГрдд рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ViewController.m рдореЗрдВ рд╣рдо ViewDidLoad рд╡рд┐рдзрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 - (рд╢реВрдиреНрдп) viewDidLoad
 {
     [рд╕реБрдкрд░ рд╡реНрдпреВрдбреАрдбрд▓рдб];
	 // рджреГрд╢реНрдп рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреЛрдИ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯрдЕрдк рдХрд░реЗрдВ, рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдиреАрдм рд╕реЗред
    
     YandexOauthViewController * cntrl = [[YandexOauthViewController рдЖрд╡рдВрдЯрди] init];
     cntrl.delegate = self;
     [self.navigationController presentModalViewController: cntrl рдПрдирд┐рдореЗрдЯреЗрдб: YES];
 }


рдЖрддреНрдордирд┐рд░реНрднрд░рддрд╛ рдХреНрдпрд╛ рд╣реИ, рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рд╕рд╣реА рд╣реЛрдВрдЧреЗ - рдЕрднреА рддрдХ рдХреЛрдИ рдирд┐рдпрдВрддреНрд░рдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ AppDelegate.m рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 - (BOOL) рдЖрд╡реЗрджрди: (UIApplication *) рдЖрд╡реЗрджрди рдХрд┐рдпрд╛ рдЧрдпрд╛
 {
     self.window = [[UIWindow рдЖрдмрдВрдЯрд┐рдд] initWithFrame: [[рдпреВрдЖрдИрд╕реНрдХреНрд░реАрди рдореЗрдирд╕реНрдХреНрд░реАрди] рд╕реАрдорд╛]];
     // рдЖрд╡реЗрджрди рд▓реЙрдиреНрдЪ рдХреЗ рдмрд╛рдж рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдб рдмрд┐рдВрджреБред
     self.viewController = [[ViewController рдЖрд╡рдВрдЯрд┐рдд] initWithNibName: @ "ViewController" рдмрдВрдбрд▓: nil];
    
     UINavigationController * nav = [[UINavigationController рдЖрдмрдВрдЯрд┐рдд] initWithRootViewController: self.viewController];
    
     self.window.rootViewController = nav;
     [self.window makeKeyAndV рдЕрджреГрд╢реНрдп];
     YES рд╡рд╛рдкрд╕ рдХрд░реЗрдВ;
 }


рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдлреЙрд░реНрдо рджреЗрдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдмрд╣реБрдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рдмрд╛рдИрдВ рдУрд░ рдХрд╛ рдмрдЯрди (рдХреНрд░реЙрд╕ рдХреЗ рд╕рд╛рде) рд╕реНрдХреНрд░реАрди рд╕реЗ рд▓реЙрдЧрд┐рди рдлреЙрд░реНрдо рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдФрд░ рджрд╛рдпрд╛рдВ рдмрдЯрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓реЙрдЧрд┐рди рдкреГрд╖реНрда рдкрд░ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпреИрдВрдбреЗрдХреНрд╕ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓реЙрдЧрд┐рди рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдЦреЛ рджреЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╡реЗ рдЕрдм рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЯреЛрдХрди рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдкрд╛рд╕рд╡рд░реНрдб рд▓реЙрдЧрд┐рди рджрд░реНрдЬ рдХрд░рдиреЗ рдФрд░, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕ рдЙрдкрдХрд░рдг рдкрд░ рд╕реНрдерд╛рдпреА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, Yandex рд╣рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрдВрдЬреАрдХрд░рдг рдХреА URL рдпреЛрдЬрдирд╛ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕рдВрдХреНрд░рдордг рдХреЛ YandexOauthViewController.m рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

 - (BOOL) webView: (UIWebView *) webView shouldStartLoadWithRequest: (NSURLRequest *) рдЕрдиреБрд░реЛрдз рдиреЗрд╡рд┐рдЧреЗрд╢рдирдЯрд╛рдЗрдк: (UIWebViewNavigationType) рдиреЗрд╡рд┐рдЧреЗрд╢рдирдЯрд╛рдЗрдк
 {
     // URL рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
     NSURL * url = [URL рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ];
    
     // рдХрд╕реНрдЯрдо URL рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
     рдЕрдЧрд░ ([url.scheme isEqualToString: URL_SCHEME])
     {
         // рдиреЗрдЯрд╡рд░реНрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕рдВрдХреЗрддрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ
         UIApplication * app = [UIApplication sharedApplication];
         app.networkActivityIndicatorV рдЕрджреГрд╢реНрдп = рд╕рдВ;
        
         // URL рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрддреНрд╡реЛрдВ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ
         // рд╣рдорд╛рд░рд╛ рдЯреЛрдХрди рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ 2 рдХреЗ рддрд╣рдд рдЧрд┐рд░рдлреНрддрд╛рд░реА рд╕рд░рдгреА рдореЗрдВ рд╣реЛрдЧрд╛
         NSArray * arr = [[url description] ComponentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString: @ "# = &"];
        
         // рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рд╕рдлрд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВ рдФрд░ рдЯреЛрдХрди рдкрд╛рд╕ рдХрд░реЗрдВ
         рдЕрдЧрд░ ([рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрд╛ рдЬрд╡рд╛рдм рд╣реИред рдЙрддреНрддрд░: @selector (yandexOauthViewController: succesfullLoginWithToken :)])
         {
             [рдкреНрд░рддрд┐рдирд┐рдзрд┐ yandexOauthViewController: рд╕реНрд╡рдпрдВ succesfullLoginWithToken: [рдЧрд┐рд░рдлреНрддрд╛рд░ objectAtIndex: 2]];
         }
        
         // URL рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП UIWebView рдЕрдХреНрд╖рдо рдХрд░реЗрдВ
         рд╡рд╛рдкрд╕ рдирд╣реАрдВ;
     }
    
     // UIWebView URL рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ
     YES рд╡рд╛рдкрд╕ рдХрд░реЗрдВ;
 }


рдпрд╣ YandexOauthViewControllerDelegate рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ViewController.m рдореЗрдВ рдмрдиреА рд╣реБрдИ рд╣реИред

 - (рд╢реВрдиреНрдп) yandexOauthViewController: (YandexOauthViewController *) рдирд┐рдпрдВрддреНрд░рдХ 
          succesfullLoginWithToken: (NSString *) рдЯреЛрдХрди
 {
     [self.navigationController рдмрд░реНрдЦрд╛рд╕реНрдд рдХрд░реЗрдВрдореЙрдбрд▓ рд╡реНрдпреВрдХреНрд░реЙрдиреНрдЯреНрд░реЛрд▓рд░рдирд┐рд░реАрдХреНрд╖рд┐рдд: рд╣рд╛рдБ];
    
     UIAlertView * рдЪреЗрддрд╛рд╡рдиреА = [[UIAlertView рдЖрд╡рдВрдЯрди] initWithTitle: @ "рд▓реЗрдЦрдХ рд╡рд┐рдлрд▓" 
                                                     рд╕рдВрджреЗрд╢: [NSString stringWithFormat: @ "рдЯреЛрдХрди% @", рдЯреЛрдХрди]                                                    
                                                    рдбреЗрд▓реАрдЧреЗрдЯ: рдиреАрд▓ 
                                           рд░рджреНрдж рдХрд░реЗрдВрдмрдЯрдирдЯрди: @ "рдареАрдХ рд╣реИ" 
                                           рдЕрдиреНрдпрдмрдЯрдирдЯрди: рдиреАрд▓];
    
     [рдЕрд▓рд░реНрдЯ рд╢реЛ];
 }




рдЗрд╕ рдЬрдЧрд╣ рдкрд░ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рджред

рд╕рдВрджрд░реНрдн


1) рдкреНрд░реЛрдЬреЗрдХреНрдЯ: github.com/eltiren/YandexOauth
2) Yandex OAuth рдкреНрд░рд▓реЗрдЦрди: api.yandex.ru/oauth/doc/dg/concepts/About.xml

Source: https://habr.com/ru/post/In131773/


All Articles