Аутентификация пользователя с Instagram на iOS: указание uri перенаправления

Я разрабатываю приложение iOS (используя Swift), которое позволяет пользователю аутентифицироваться через Instagram с помощью OAuth 2.0

в прошлом все работало нормально, поскольку я смог указать URL-адрес авторизации как таковой: https://api.instagram.com/oauth/authorize/?client_id=xxx&redirect_uri=myiosapp://authorize&response_type=code

ключевым моментом здесь является параметр redirect_uri myiosapp://authorize

моя проблема в том, что я больше не могу зарегистрировать пользовательскую схему url с Instagram, тем самым делая это невозможным(?) обрабатывать перенаправление исключительно через my приложение. Если я попытаюсь добавить такой URI в поле" допустимый URI перенаправления:", я получу следующую ошибку:

You must enter an absolute URI that starts with http:// or https://

каков рекомендуемый способ обработки аутентификации с помощью Instagram исключительно для родного приложения iOS?

1 ответов


после выяснения этого, я думал, что опубликую свое решение для всех, кто сталкивается с той же проблемой.

прежде всего, я просто соглашусь с тем, что Instagram больше не разрешает пользовательские схемы в поле "безопасность" -> "допустимый URIs перенаправления". Вместо этого я введу произвольный, но действительный URI, который я могу однозначно идентифицировать. Например: http://www.mywebsite.com/instagram_auth_ios

теперь, при попытке авторизации с Instagram, я буду использовать это как URI перенаправления-даже если веб-страницы на самом деле не существует на этом URI. Пример: https://api.instagram.com/oauth/authorize/?client_id=xxx&redirect_uri=http://www.mywebsite.com/instagram_auth_ios&response_type=code

наконец, я буду использовать UIWebViewDelegate ' s shouldStartLoadWithRequest метод для перехвата запроса перенаправления до его запуска и вместо этого вызовите мой оригинальный пользовательский uri (таким образом, мне не нужно ничего переписывать). Вот как я написал этот метод:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    guard let url = request.URL where url.host == "www.mywebsite.com" && url.path == "/instagram_auth_ios" else { return true }
    guard let authUrl = NSURLComponents(URL: url, resolvingAgainstBaseURL: false) else { return true }

    // Customize the scheme/host/path, etc. as desired for your app
    authUrl.scheme = "myappschema"
    authUrl.host = "instagram"
    authUrl.path = ""
    UIApplication.sharedApplication().openURL(authUrl.URL!)

    return false
}

есть одно небольшое предостережение с возвращением false в методе shouldStartLoadWithRequest в том, что он всегда будет жаловаться на ошибку "Frame Load Interrupted". Похоже, это ни на что не влияет. и можно (вероятно) безопасно игнорировать.