Instagram集成在iOS中因使用webView而失败
在我的应用程序中,我使用webView进行Instagram身份验证。首先显示Instagram登录屏幕,成功登录后,我获取accessToken,然后使用accessToken获取其他详细信息 这是我在viewDidLoad中调用的loadrequest方法Instagram集成在iOS中因使用webView而失败,ios,swift,instagram,instagram-api,Ios,Swift,Instagram,Instagram Api,在我的应用程序中,我使用webView进行Instagram身份验证。首先显示Instagram登录屏幕,成功登录后,我获取accessToken,然后使用accessToken获取其他详细信息 这是我在viewDidLoad中调用的loadrequest方法 func loadrequest(){ let authURL = String(format: "%@?client_id=%@&redirect_uri=%@&response_type=token&
func loadrequest(){
let authURL = String(format: "%@?client_id=%@&redirect_uri=%@&response_type=token&scope=%@", arguments: [INSTAGRAM_API.INSTAGRAM_AUTHURL,INSTAGRAM_API.INSTAGRAM_CLIENT_ID,INSTAGRAM_API.INSTAGRAM_REDIRECT_URI, INSTAGRAM_API.INSTAGRAM_SCOPE ])
let urlRequest = URLRequest.init(url: URL.init(string: authURL)!)
instaWebview.loadRequest(urlRequest)
}
下面是我的webViewDelegate方法,我在其中调用checkRequestForcallBackURL方法
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
return checkRequestForcallBackURL(request: request)
}
在这种方法中,我正在检查我是否获得了accesstoken
func checkRequestForcallBackURL(request : URLRequest) ->Bool{
let requestURLString = (request.url?.absoluteString)! as String
if requestURLString.hasPrefix(INSTAGRAM_API.INSTAGRAM_REDIRECT_URI) {
let range: Range<String.Index> = requestURLString.range(of: "#access_token=")!
handleAuth(authToken: requestURLString.substring(from: range.upperBound))
return false;
}
return true
}
func checkRequestForcallBackURL(请求:URLRequest)->Bool{
让requestURLString=(request.url?.absoluteString)!作为字符串
if requestURLString.hasPrefix(INSTAGRAM\u API.INSTAGRAM\u重定向\u URI){
let range:range=requestURLString.range(of:“#access_token=”)!
handleAuth(authToken:requestURLString.substring(from:range.upperBound))
返回false;
}
返回真值
}
现在,当登录时,它会询问安全代码,在给出安全代码后,它会将我重定向到Instagram应用程序,我不想再这样做了。我不知道如何进一步操作。我在我的一个应用程序中实现Instagram登录。我所做的是。要获取instagram令牌,只需向新的ViewController提供webview并加载instagram登录页面
let authURL = String(format: "%@?client_id=%@&redirect_uri=%@&response_type=token&scope=%@&DEBUG=True", arguments: [INSTAGRAM_IDS.INSTAGRAM_AUTHURL,INSTAGRAM_IDS.INSTAGRAM_CLIENT_ID,INSTAGRAM_IDS.INSTAGRAM_REDIRECT_URI, INSTAGRAM_IDS.INSTAGRAM_SCOPE ])
let urlRequest = URLRequest.init(url: URL.init(string: authURL)!)
web_instaView.loadRequest(urlRequest)
然后在webview中使用委托方法
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
return checkRequestForCallbackURL(request: request)
}
func checkRequestForCallbackURL(request: URLRequest) -> Bool {
let requestURLString = (request.url?.absoluteString)! as String
if requestURLString.hasPrefix(INSTAGRAM_IDS.INSTAGRAM_REDIRECT_URI) {
let range: Range<String.Index> = requestURLString.range(of: "#access_token=")!
handleAuth(authToken: requestURLString.substring(from: range.upperBound))
return false;
}
return true
}
func handleAuth(authToken: String) {
print("Instagram authentication token ==", authToken)
INSTAGRAM_IDS.INSTAGRAM_USER_TOCKEN = authToken
UserDefaults.standard.setValue(INSTAGRAM_IDS.INSTAGRAM_USER_TOCKEN, forKey: "INSTAGRAM_USER_TOCKEN")
NotificationCenter.default.post(name: NSNotification.Name("instaLoginDone"), object: nil)
self.dismiss(animated: true, completion: nil)
}
func-webView(webView:UIWebView,shouldStartLoadWith-request:URLRequest,navigationType:UIWebView-navigationType)->Bool{
返回checkRequestForCallbackURL(请求:请求)
}
func checkRequestForCallbackURL(请求:URLRequest)->Bool{
让requestURLString=(request.url?.absoluteString)!作为字符串
if requestURLString.hasPrefix(INSTAGRAM\u ID.INSTAGRAM\u重定向\u URI){
let range:range=requestURLString.range(of:“#access_token=”)!
handleAuth(authToken:requestURLString.substring(from:range.upperBound))
返回false;
}
返回真值
}
func handleAuth(authToken:String){
打印(“Instagram身份验证令牌==”,authToken)
INSTAGRAM\u IDS.INSTAGRAM\u USER\u TOCKEN=authToken
UserDefaults.standard.setValue(INSTAGRAM\u id.INSTAGRAM\u USER\u TOCKEN,forKey:“INSTAGRAM\u USER\u TOCKEN”)
NotificationCenter.default.post(名称:NSNotification.name(“instaLoginDone”),对象:nil)
self.disclose(动画:true,完成:nil)
}
在获得instagram令牌后,我简单地关闭该ViewController并在本地保存令牌。然后在后台模式下获取用户信息并显示加载程序或任何您想要的内容
希望这对您有所帮助。:) 我使用的是
WKWebView
,在用户输入他们的安全代码后,我执行WKWebViewDelegate
decidePolicyFor
并查找https://www.instagram.com
重定向我不允许的内容,并将其发送回原始身份验证URL,因为他们已经输入了代码,工作
public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if let url = navigationAction.request.url, url.absoluteString == "https://www.instagram.com/" {
decisionHandler(.cancel)
webView.load(scheme.authenticationURlRequest)
return
}
}
好消息,现在我认为instagram改变了它的政策,现在我们得到了代码和accesstokeninstagram出现了一个暂时的问题,他们一直要求提供安全代码,而不提供访问令牌。希望他们能尽快解决。这种情况只发生在某些用户名上,您可以尝试其他用户名来检查您的代码。@MayankBarnwal,嘿,我也使用了一些其他帐户,但无法获取代码或accesstoken,它只能将我重定向到instagram应用程序only@shaki您是否尝试过使用其他客户id?我正在尝试与此链接,是工作良好。你也可以添加作用域。@MayankBarnwal是的,我厌倦了其他客户端id,同样的事情发生了,但我无法获取代码或#accesstoken,但我正在重定向到instagram应用程序,只是想做什么嘿,我做了完全相同的事情,man忘了提到handleAuth方法嘿,你收到代码了吗?如果是,请共享代码根据instagram developer docs,有两种方式,即服务器端(显式)流,您必须响应_type=code,客户端(隐式)身份验证,您必须写入响应_type=token。因此,从第一种方法中,我们从重定向Url获得代码,然后是这样的代码,在获取代码后,我们点击并执行我们的操作,但在方法2中,我们直接获取accesstoken。这个问题发生在可疑帐户上,在登录屏幕后instagram询问安全代码,然后它只将用户重定向到instgram应用程序