草庐IT

ios - facebook 解析快速注册

coder 2023-07-17 原文

我一直在努力快速创建 facebook 登录/注册功能。我一直在寻找教程,但找不到任何东西。所以我一直在尝试自己做。它似乎有效,但为什么它不在数据库中保存我的 facebookName、性别和图像?它是将它保存在模拟器中,但当我使用我的 ios 8 设备时却没有?

我收到这条日志消息“用户注册并通过 Facebook 登录!”,一个新用户被添加到解析类中,但不是姓名、图像和性别...

@IBAction func login(sender: UIButton!) {




    var permissionArray = ["user_about_me", "user_relationships", "user_birthday", "user_location"]

    PFFacebookUtils.initializeFacebook()

    PFFacebookUtils.logInWithPermissions(permissionArray, block:  { (user: PFUser!, error: NSError!) in
        println(user)
        if user == nil {
            println(error.localizedDescription)


        } else {



            if user.isNew {



                var userQuery = PFUser.query()
                userQuery.getObjectInBackgroundWithId(PFUser.currentUser().objectId) {
                    (userObject: PFObject!, error: NSError!) -> Void in


                    var fbRequest = FBRequest.requestForMe()
                    fbRequest.startWithCompletionHandler { (connection: FBRequestConnection!, result:AnyObject!, error: NSError!) in


                        if error == nil {

                            //FACEBOOK DATA IN DICTIONARY
                            var userData = result as NSDictionary
                            var faceBookId = userData.objectForKey("id") as NSString
                            var faceBookName = userData.objectForKey("first_name") as NSString
                            var faceBookMiddle = userData.objectForKey("middle_name") as NSString
                            var faceBookGender = userData.objectForKey("gender") as NSString

                            var url:NSURL = NSURL.URLWithString(NSString(format:"https://graph.facebook.com/%@/picture?width=320", faceBookId))
                            var err: NSError?
                            var imageData :NSData = NSData.dataWithContentsOfURL(url, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)

                            var imageFile = PFFile(name: "image.jpg", data: imageData) as PFFile

                            println(userData)

                            userObject.setObject(faceBookName, forKey: "name")
                            userObject.setObject(imageFile, forKey: "file")
                            userObject.setObject(faceBookGender, forKey: "gender")

                            userObject.saveInBackground()



                            var sharedInstance:userSingleton = userSingleton.sharedInstance

                            sharedInstance.userName = (userObject.objectForKey("name") as NSString)
                            sharedInstance.userGender = (userObject.objectForKey("gender") as NSString)


                            (userObject.objectForKey("file") as PFFile).getDataInBackgroundWithBlock {
                                (theImageData: NSData!, error: NSError!) -> Void in

                                println(error)
                                if error == nil {

                                    sharedInstance.userImage = UIImage(data:theImageData)
                                }
                                self.performSegueWithIdentifier("LoginSegue", sender: self)
                            }


                        }
                    }
                }





                println("User signed up and logged in through Facebook!")
            } else {



                println("User logged in through Facebook!")
            }


        }

    })

}

}

最佳答案

假设您使用 Parse,下面是我是如何做到的。我个人创建了一个 Utils.swift 类,我把所有我想重用的东西(或者我不想在我的 ViewController 中包含的东西)放在里面:

class Utils {

    class func notLoggedIn() -> Bool {
        let user = PFUser.currentUser()
        // here I assume that a user must be linked to Facebook
        return user == nil || !PFFacebookUtils.isLinkedWithUser(user)
    }
    class func loggedIn() -> Bool {
        return !notLoggedIn()
    } 


    class func logInWithFacebook() {
        PFFacebookUtils.logInWithPermissions(["public_profile", "user_friends"]) {
            (user: PFUser!, error: NSError!) -> Void in
            if user == nil {
                NSLog("The user cancelled the Facebook login (user is nil)")
            } else {
                NSLog("The user successfully logged in with Facebook (user is NOT nil)")
                // HERE I SET A USER POINTER TO THE INSTALLATION
                // That way we can send push notifications to specific users
                if let installation = PFInstallation.currentInstallation() {
                    installation["user"] = PFUser.currentUser()
                    installation.saveEventually()
                }
                // THEN I GET THE USERNAME AND fbId
                Utils.obtainUserNameAndFbId()
            }
        }
    }


    class func obtainUserNameAndFbId() {
        if notLoggedIn() {
            return
        }
        let user = PFUser.currentUser() // Won't be nil because is logged in
        // RETURN IF WE ALREADY HAVE A USERNAME AND FBID
        // Note that we check the fbId because Parse automatically fills in the username with random numbers
        if let fbId = user["fbId"] as? String {
            if !fbId.isEmpty {
                println("we already have a username and fbId -> return")
                return
            }
        }
        // REQUEST TO FACEBOOK
        println("performing request to FB for username and IDF...")
        if let session = PFFacebookUtils.session() {
            if session.isOpen {
                println("session is open")
                FBRequestConnection.startForMeWithCompletionHandler({ (connection: FBRequestConnection!, result: AnyObject!, error: NSError!) -> Void in
                    println("done me request")
                    if error != nil {
                        println("facebook me request - error is not nil :(")
                    } else {
                        println("facebook me request - error is nil :)")
                        println(result)
                        // You have 2 ways to access the result:
                        // 1)
                        println(result["name"])
                        println(result["id"])
                        // 2)
                        println(result.name)
                        println(result.objectID)
                        // Save to Parse:
                        PFUser.currentUser().username = result.name
                        PFUser.currentUser().setValue(result.objectID, forKey: "fbId")
                        PFUser.currentUser().saveEventually() // Always use saveEventually if you want to be sure that the save will succeed
                    }
                })
            }
        }
    }

}

然后您可以在需要执行登录时简单地调用 Utils.logInWithFacebook()

请注意,由于 facebook me 请求可能会失败,因此无法保证您会成功将用户名和 facebook ID 保存到 Parse。这就是我创建方法 Utils.obtainUserNameAndFbId() 的原因,我在 application(_: didFinishLaunchingWithOptions) 中调用它(它可以在每次启动时调用,因为它只会执行请求到 FB,直到成功)。

关于ios - facebook 解析快速注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25917774/

有关ios - facebook 解析快速注册的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  4. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  5. ruby-on-rails - 如何在 Rails Controller Action 上触发 Facebook 像素 - 2

    我有一个ruby​​onrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素

  6. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  7. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  8. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  9. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

  10. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

随机推荐