- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 Swift 语言在 iOS 应用程序中实现 Google+ 登录。
我的代码是这样的:
var kClientId = "My Client ID from Dev Console"
var signIn = GPPSignIn.sharedInstance()
signIn.shouldFetchGooglePlusUser = true
signIn.shouldFetchGoogleUserEmail = true
signIn.shouldFetchGoogleUserID = true
signIn.clientID = kClientId
signIn.scopes = [kGTLAuthScopePlusLogin]
signIn.delegate = self
signIn.authenticate()
出于测试目的,我创建了一个标签并想将其更改为登录的用户电子邮件。
if (GPPSignIn.sharedInstance().userID != nil) {
var user = GPPSignIn.sharedInstance().googlePlusUser
userName.text = user.name.JSONString()
if (user.emails != nil){
userEmailLable.text = user.emails.first?.JSONString() ?? "no email"
} else {
userEmailLable.text = "no email"
}
} else {
println("User ID is nil")
}
在我点击“登录”按钮后,Safari 选项卡打开,我可以输入我的 Google 电子邮件和密码,它会询问某些事情的权限,在按下接受按钮后,它会返回到应用程序。我的 userEmailLable 没有改变,它打印“用户 ID 为零”作为输出。它一直在发生,没有一次成功登录。
我的 Google 框架一切正常,URL 也正确,在 Google Developer Console 中一切正常。
AppDelegate.swift 文件也包含这个函数
func application(application: UIApplication, openURL url: NSURL, sourcApplication: String, annotation: AnyObject?) -> Bool {
return GPPURLHandler.handleURL(url, sourceApplication: sourcApplication, annotation: annotation)
}
有人知道为什么要这样做吗?谢谢!
最佳答案
这很奇怪。我尝试在 Google instructions. 之后构建一个示例它按预期工作并打印出正确的输出。
此外,here is another nice step-by-step writeup.
我执行了指南中指定的相同步骤 - 创建控制台应用程序,使用我的包 ID 为 iOS 应用程序注册 URL 方案。
这是我的 View Controller 代码。
import UIKit
class ViewController: UIViewController, GPPSignInDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let signIn = GPPSignIn.sharedInstance()
signIn.shouldFetchGooglePlusUser = true
signIn.shouldFetchGoogleUserEmail = true // Uncomment to get the user's email
signIn.shouldFetchGoogleUserID = true
signIn.clientID = "… my client ID"
// Uncomment one of these two statements for the scope you chose in the previous step
signIn.scopes = [ kGTLAuthScopePlusLogin ] // "https://www.googleapis.com/auth/plus.login" scope
signIn.delegate = self
signIn.authenticate()
}
// MARK: - GPPSignInDelegate
func finishedWithAuth(auth: GTMOAuth2Authentication!, error: NSError!) {
print("received auth \(auth), error \(error)")
if (GPPSignIn.sharedInstance().userID != nil) {
let user = GPPSignIn.sharedInstance().googlePlusUser
println("user name: " + user.name.JSONString() + "\nemail: ")
if (user.emails != nil){
print(user.emails.first?.JSONString() ?? "no email")
} else {
print("no email")
}
} else {
println("User ID is nil")
}
}
}
除此之外,我还有应用程序委托(delegate)功能(但请注意,一些可选说明符不同)
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
return GPPURLHandler.handleURL(url, sourceApplication:sourceApplication, annotation: annotation)
}
关于ios - Swift Google+ 登录 GPPSignIn.sharedInstance().userID 始终等于 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31524198/
在此代码中,当我键入 GIDSignIn.sharedInstance 时,出于某种原因 sharedInstance 不是函数,这意味着我无法访问 clientID。我在任何地方都找不到解决方案。
在我的代码中,我初始化了两个单例。我有 var session = AVAudioSession.sharedInstance 和 var audioSession = AVAudioSession.
我正在将项目转换为 SDK。我需要将几个实例方法转换为类方法。我收到有关使用“self”的编译器警告。警告是“使用 Class 表达式初始化 Store* 的不兼容指针类型。此 Store 类是单例
假设我有以下单例: @interface ABCSingleton: NSObject @property (nonatomic, copy) NSString *name; @property (n
所有单例函数都是两次调用。“Prova”函数和定时器的选择器是两次调用。 class Timer { static let sharedInstanceTimer = Timer()
我正在创建一个音频应用程序,我希望音频在屏幕关闭时继续播放。(它在屏幕打开时在后台运行良好。) 在 xcode 上启用了后台模式(我在 Info.plist 中设置了“音频”值。)并且我实现了“AVA
我不久前在我的 iOS 项目中集成了 Digits by Fabric 以通过电话号码对用户进行身份验证,直到最近我的应用程序开始崩溃时一切正常,原因是我们在项目中初始化 Digits 的以下代码行:
我有一个小型 iOS 应用程序 (xcode8 ios10),我需要用户使用 facebook 或 google 登录。我已经完成了 facebook 部分,并且效果很好。然后今天我添加了谷歌登录支持
具有以下单例: class Colors { static let sharedInstance = Colors() private init() {} let mainCo
sharedInstance 究竟是什么?我是说有什么用? 目前我在 2 个不同文件之间进行通信时遇到了一些问题。 这是我的问题: 我有 1 个文件调用 A.h/A.m 和另一个文件调用 B.h/B.
我们正在使用键值观察来查看音频输出路由是否通过以下代码进行了更改: AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [a
我正在尝试在我的 iOS 应用程序中使用 TwitterKit 框架(在 Swift 中)。但是,当我使用 Twitter.sharedInstance().APIClient 时,会出现错误,提示“
我已经阅读了谷歌文档来寻求答案,我也查看了一些类似的帖子,但这些都没有帮助我解决我的问题。我正在尝试将 UIButton 设置为 google 登录的触发器。由于某种原因,它压碎了。我当然会添加我编写
我想从一些代码中展示一个 MFMailComposerViewController,这些代码深藏在可通过共享实例访问的实用程序类中。 当我尝试时 [self presentViewController
使用以下代码,我得到了输出音量,但它确实不一致 - 有时它给出相同的值,有时它是一个落后的音量变化,尽管系统音量实际上是正确变化的。 有什么办法让它每次都输出正确的值? func viewDidLoa
我有一个要使用 XCTest 测试的类,这个类看起来像这样: public class MyClass: NSObject { func method() { // Do s
我正在将一些自 iOS 9.0 以来已弃用的 UIAlertViews 更新为 UIAlertViewControllers。 使用 UIAlertView,可以从任何正在执行的代码中抛出警报——即使
我正在创建一个快速框架。其中一个类如下所示。 import Foundation @objc public class classA: NSObject { public overr
我遇到了类似于 this one 的问题。基本上每次我的应用启动时,我都必须使用我的 Google 帐户登录。 然后,我有这个属性: var isGoogleSessionOpen: Bool {
我在 sharedInstance return Static.instance! 行发生以下崩溃: EXC_BREAKPOINT 0x0000000100da42d8 崩溃发生在没有调试断点的 Ad
我是一名优秀的程序员,十分优秀!