2016-10-05 2 views
0

Я недавно создал приложение, но последний шаг - отправить данные на сайт Runkeeper. У моего приложения есть контроллер вида, у него есть кнопка для входа в систему и деавторизации. Но когда я использую Oauth2, откройте сафари для входа в учетную запись для моего приложения. Когда вернетесь с сафари и снова откройте мое приложение. Я не знаю, как проверить, есть ли у меня код авторизации. А также я хочу обменять токен доступа, чтобы опубликовать свои данные на веб-сайте Runkeeper. Но я совершенно не новичок в подключении приложения к API. Я вижу много учебников по API Google API, API YouTube, но они отличаются от Runkeeper. Это мой код:ios - Как получить код авторизации с помощью сафари для входа в систему и обмена токеном доступа?

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"View did Load!"); 
    kIDMOAuth2ClientId = @"...."; 
    kIDMOAuth2ClientSecret = @"...."; 
    kIDMOAuth2AuthorizationURL = @"https://runkeeper.com/apps/authorize"; 
    kIDMOAuth2TokenURL = @"https://runkeeper.com/apps/token"; 
    kIDMOAuth2AccountType = @"token";//authorization_code //Runkeeper API 
    kIDMOAuth2SuccessPagePrefix = @"Success"; 
    kIDMOAuth2RedirectURL = @"Landice://"; 
    kIDMOAuth2DeauthorizationURL = @"https://runkeeper.com/apps/de-authorize"; 
    runkeeperButton *runkeeperString=[runkeeperButton getInstance]; 
    NSLog(@"%@", runkeeperString.str); 
    if ((runkeeperString.str == NULL) || [runkeeperString.str isEqualToString:@"Authorize"]) { 
     buttonToggled = YES; 
     [loginandoutButton setTitle:@"Login & Authorize" forState:UIControlStateNormal]; 
     NSLog(@"66666"); 
     NSLog(@"%@", runkeeperString.str); 
    }else if ([runkeeperString.str isEqual:@"Deauthorize"]){ 
     buttonToggled = NO; 
     [loginandoutButton setTitle:@"Deauthorize" forState:UIControlStateNormal]; 
     NSLog(@"77777"); 
     NSLog(@"%@", runkeeperString.str); 
    } 
    loginandoutButton.layer.cornerRadius = 10; 
} 

- (IBAction)toggleButton:(id)sender { 
    runkeeperButton *runkeeperString=[runkeeperButton getInstance]; 
    // "Deauthorize" button clicked 
    if (!buttonToggled) { 
     [sender setTitle:@"Login & Authorize" forState:UIControlStateNormal]; 
     buttonToggled = YES; 
     runkeeperString.str = @"Authorize"; 
    } 
    // "Login & Authorize" button clicked 
    else { 
     [sender setTitle:@"Deauthorize" forState:UIControlStateNormal]; 
     buttonToggled = NO; 
     runkeeperString.str = @"Deauthorize"; 
     //[self requestOAuth2Access]; 

     NSURL *url = [NSURL URLWithString:@"https://runkeeper.com/apps/authorize?response_type=code&client_id=[SOMETHING]&redirect_uri=landice://response&duration=permanent&scope=read"]; 
     [[UIApplication sharedApplication] openURL:url]; 
     if ([[UIApplication sharedApplication] canOpenURL:url]) { 
      [[UIApplication sharedApplication] openURL:url]; 
     } 

     else if (![[UIApplication sharedApplication] canOpenURL:url]) { 
      NSLog(@"%@%@",@"Failed to open url:",[url description]); 
     } 
    } 
} 

Мой вопрос: 1. как получить код авторизации от сафари и как проверить, если я получил его. 2. Я слышал, что код авторизации нестабилен, поэтому, как обменивать токен доступа и как проверить токен доступа, истек. Если истек, как получить еще один. 3. Как отправлять данные из основных данных JSON на сайт Runkeeper.

Спасибо заранее.

ответ

0

У вас есть, чтобы открыть сайт в Safari? Я не уверен, что даже можно вернуть данные из другого приложения, особенно, если это не входит в группу приложений, которую вы сами определяете (и вы можете разместить свои собственные приложения только в такой группе). В основном Safari изолирована песочницей, как и ваше приложение. Я не вижу, как данные, загруженные со страницы, могут быть возвращены в ваше приложение.

Вместо этого я бы посоветовал вам разработать для своего собственного небольшого окна браузера в этом приложении, используя WKWebView. Затем вы можете пропустить [[UIApplication sharedApplication] openURL:url] и открыть другое представление, которое загружает страницу Runkeeper. Оттуда вы сможете получить доступ к данным, оценив java-скрипт (или введя для этого собственный скрипт). Я сам не знаю Runkeeper, поэтому я не знаю, как именно вы это сделаете, но я уверен, что есть какой-то способ.

Это больше работает, но у вас будет польза от того, что вашим пользователям не нужно переключать приложения на авторизацию.

О, и все это предполагает, что вам обязательно нужно загрузить страницу и не использовать какой-либо API, который предоставляет Runkeeper. Возможно, вы могли бы просто использовать NSURLSessionDataTask для вызова авторизации и просто получить маркер с объекта NSHTTPURLResponse по его возврату?

+0

У меня есть uiwebview внутри моего приложения раньше, но в каком-то учебнике сказано, что мое приложение легко получит учетную запись и пароль пользователя. Они могут подать в суд на меня, если я не смогу дать доказательства, чтобы доказать, что я не записал секрет клиента. Поэтому я решил использовать сафари для получения разрешения. –

+0

Но в основном вы пытаетесь это сделать. Не знаю о юридических последствиях, но вы хотите манипулировать содержимым Runkeeper, обходящим их сайт. С точки зрения пользователей, которая является доверенным лицом, чтобы предоставить вам свои учетные данные, зависит от них (TOS Runkeeper?). Но я предполагаю, что Runkeeper * может * считать вас «фальсифицированным» вводом сайта как нарушение. В любом случае, я уверен, что то, что вы хотите, специально невозможно по дизайну. Было бы опасностью безопасности в iOS, чтобы позволить приложениям получать данные Safari. См. https://www.macstories.net/stories/ios-9-and-safari-view-controller-the-future-of-web-views/ – Gero

Смежные вопросы