Instagram登录&访问令牌 - 斯威夫特

时间:2015-04-24 23:58:16

标签: swift authentication afnetworking instagram alamofire

我正在努力创建一个"与Instagram连接"这个按钮可以让我获得当前用户的Instagram ID。使用这些教程:[1] - [2],我设法为Twitter做同样的事情,但我无法将其转换为Instagram。这是我的代码:

  User.swift
 --------------
import UIKit

var _currentInstagramUser: InstagramUser?
let currentInstagramUserKey = "kCurrentInstagramUserKey"

class InstagramUser: NSObject {

var instagramid: String?
var instagramusername: String?
var dictionary: NSDictionary

init(dictionary: NSDictionary) {
    self.dictionary = dictionary

    instagramid = dictionary["id"] as? String
    instagramusername = dictionary["username"] as? String

}

class var currentInstagramUser: InstagramUser? {
    get {
    if _currentInstagramUser == nil {
    var data = NSUserDefaults.standardUserDefaults().objectForKey(currentInstagramUserKey) as? NSData

    if data != nil {
    var dictionary = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as! NSDictionary
    _currentInstagramUser = InstagramUser(dictionary: dictionary)

    }

    }
    return _currentInstagramUser
    }
    set(user) {
        _currentInstagramUser = user
        println(user)

        //SAVE USER TO DATABASE &&& Remember User
        if _currentInstagramUser != nil {
            var data = NSJSONSerialization.dataWithJSONObject(user!.dictionary, options: nil, error: nil)
            NSUserDefaults.standardUserDefaults().setObject(data, forKey: currentInstagramUserKey)
            NSUserDefaults.standardUserDefaults().synchronize()

        } else {
            NSUserDefaults.standardUserDefaults().setObject(nil, forKey: currentInstagramUserKey)
        }

        NSUserDefaults.standardUserDefaults().synchronize()            
    }
}
}
  InstagramClient.swift
 -----------------------
  let instagramConsumerKey = "###"
  let instagramConsumerSecret = "###"
  let instagramBaseURL = NSURL(string: "https://api.instagram.com")

  class InstagramClient: BDBOAuth1RequestOperationManager {

var instagramLoginCompletion: ((user: InstagramUser?, error: NSError?) -> ())?

class var SharedInstance: InstagramClient {
    struct Static {
        static let instance = InstagramClient(baseURL: instagramBaseURL, consumerKey: instagramConsumerKey, consumerSecret: instagramConsumerSecret)
    }

    return Static.instance
}


func loginWithCompletionForInstagram(completion: (user: InstagramUser?, error: NSError?) -> ()) {
    instagramLoginCompletion = completion

    //Fetch Request Token & Redirect Authorization Page of Twitter
    InstagramClient.SharedInstance.requestSerializer.removeAccessToken()

    InstagramClient.SharedInstance.fetchRequestTokenWithPath("oauth/access_token", method: "POST", callbackURL: NSURL(string: "tatchinsta://oauth"), scope: nil, success: { (requestToken: BDBOAuth1Credential!) -> Void in

        println("Success")

        var authURL = NSURL(string: "https://instagram.com/oauth/authorize/?client_id="###"&redirect_uri="###"&response_type=\(requestToken.token)")
        UIApplication.sharedApplication().openURL(authURL!)

        }){ (error: NSError!) -> Void in

            println(error)
            self.instagramLoginCompletion?(user: nil, error: error)
    }

}

func instagramOpenURL(url: NSURL) {
    fetchAccessTokenWithPath("oauth/access_token", method: "POST", requestToken: BDBOAuth1Credential(queryString: url.query) , success: { (accessToken: BDBOAuth1Credential!) -> Void in
        println("got access token")
        InstagramClient.SharedInstance.requestSerializer.saveAccessToken(accessToken)

        InstagramClient.SharedInstance.GET("https://api.instagram.com/v1/users/self/?access_token=ACCESS-TOKEN", parameters: nil, success: { (operation: AFHTTPRequestOperation!, response:AnyObject!) -> Void in

            println("user: \(response)")
            var user = InstagramUser(dictionary: response as! NSDictionary)
            InstagramUser.currentInstagramUser = user

            self.instagramLoginCompletion?(user: user, error: nil)

            }, failure: { (operation:AFHTTPRequestOperation!, error:NSError!) -> Void in
                println("error")
                self.instagramLoginCompletion?(user: nil, error: error)
        })

        }) { (error: NSError!) -> Void in
            println("Failed to receive access token")
            self.instagramLoginCompletion?(user: nil, error: error)
    }   
}    
}
    AppDelegate.swift
    ------------------
    func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
    InstagramClient.SharedInstance.instagramOpenURL(url)
    return true
}
    ViewController.swift
    --------------------
    import UIKit


class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

}

 @IBAction func instagramLoginButton(sender: AnyObject) {

    InstagramClient.SharedInstance.loginWithCompletionForInstagram() {
        (user: InstagramUser?, error: NSError?) in
        if user != nil {
            //user exists
        } else {
            //login error
        }

    }

}

当我点击"用Instagram登录"按钮(所以loginWithCompletionForInstagram)函数,我收到的错误日志是:

Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: bad request (400)" UserInfo=0x7f96bb900150 {com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x7f96b9442ed0> { URL: https://api.instagram.com/oauth/access_token } { status code: 400, headers {
"Cache-Control" = "private, no-cache, no-store, must-revalidate";
Connection = "keep-alive";
"Content-Language" = en;
"Content-Length" = 94;
"Content-Type" = "application/json";
Date = "Fri, 24 Apr 2015 23:55:20 GMT";
Expires = "Sat, 01 Jan 2000 00:00:00 GMT";
Pragma = "no-cache";
Server = nginx;
"Set-Cookie" = "csrftoken=f021070d367caacba3c1c63b38ac9394; expires=Fri, 22-Apr-2016 23:55:20 GMT; Max-Age=31449600; Path=/, mid=VTrX6AAAAAHQfPFksK-b-EDV7C0t; expires=Thu, 19-Apr-2035 23:55:20 GMT; Max-Age=630720000; Path=/";
Vary = "Cookie, Accept-Language";
  } }, NSErrorFailingURLKey=https://api.instagram.com/oauth/access_token, com.alamofire.serialization.response.error.data=<7b22636f 6465223a 20343030 2c202265 72726f72 5f747970 65223a20 224f4175 74684578 63657074 696f6e22 2c202265 72726f72 5f6d6573 73616765 223a2022 596f7520 6d757374 2070726f 76696465 20612063 6c69656e 745f6964 227d>, NSLocalizedDescription=Request failed: bad request (400)}

0 个答案:

没有答案