我开始用 Swift 为 iOS 开发一个应用程序。现在我需要创建一个登录系统。但是,我们需要人们的 LinkedIn 信息。
如何在 iOS 中使用 OAuth2 API 来实现这一点?
我已经在 LinkedIn 开发人员区创建了一个应用程序,但现在我被卡住了。我从需要使用的人那里得到了一些建议,UIWebView
但我不知道它是如何工作的。
我开始用 Swift 为 iOS 开发一个应用程序。现在我需要创建一个登录系统。但是,我们需要人们的 LinkedIn 信息。
如何在 iOS 中使用 OAuth2 API 来实现这一点?
我已经在 LinkedIn 开发人员区创建了一个应用程序,但现在我被卡住了。我从需要使用的人那里得到了一些建议,UIWebView
但我不知道它是如何工作的。
在 Swift 应用程序中集成 LinkedIn Login
首先,下载LinkedIn iOS SDK。我将在这个例子中使用 1.07 稳定版。我将在此处遵循集成指南。
linkedin-sdk.framework
库复制到您的应用程序。确保选中“必要时复制文件”和“为文件夹引用创建组”。项目设置完成,现在让我们编写一些代码!
创建一个名为BridgingHeader.h
. 在 Targets -> YourApp -> Build Settings -> Swift Compiler - Code Generation 下,添加MyApp/BridgingHeader.h
到“Objective-C Bridging Header”。
在您的BridgingHeader.h
中,添加以下两行:
#import <Foundation/Foundation.h>
#import <linkedin-sdk/LISDK.h>
在您的 AppDelegate.swift 中,添加以下代码来处理 OAuth URL 回调:
斯威夫特 3:
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
if LISDKCallbackHandler.shouldHandle(url) {
return LISDKCallbackHandler.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
}
return true
}
斯威夫特 2.x:
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
if LISDKCallbackHandler.shouldHandleUrl(url) {
return LISDKCallbackHandler.application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}
return true
}
现在是时候登录用户了。在您的视图控制器中,假设您有一个“登录”按钮。你IBAction
可能看起来像这样:
@IBAction func doLogin(sender: AnyObject) {
LISDKSessionManager.createSessionWithAuth([LISDK_BASIC_PROFILE_PERMISSION], state: nil, showGoToAppStoreDialog: true, successBlock: { (returnState) -> Void in
print("success called!")
let session = LISDKSessionManager.sharedInstance().session
}) { (error) -> Void in
print("Error: \(error)")
}
}
登录时,将要求用户使用您的应用程序进行身份验证:
如果用户允许,将调用成功块,您可以获取有关经过身份验证的用户的信息。如果登录失败或用户不允许访问,则会调用失败块,您可以提醒用户发生的问题。
要获取我们通过身份验证的用户的信息,请在用户的配置文件上调用 GET 请求:
let url = "https://api.linkedin.com/v1/people/~"
if LISDKSessionManager.hasValidSession() {
LISDKAPIHelper.sharedInstance().getRequest(url, success: { (response) -> Void in
print(response)
}, error: { (error) -> Void in
print(error)
})
}
将response.data
包含有关经过身份验证的用户的信息:
"{\n \"firstName\": \"Josh\",\n \"headline\": \"Senior Mobile Engineer at A+E Networks\",\n ... }"
进一步阅读文档以了解您可以使用 API 执行的更多操作。
一个示例项目(我的 App ID 被混淆了)可以在这里找到。
LinkedIn 是一个有趣的野兽,因为他们的移动 SDK 有两个缺陷:
因此,虽然 JAL 的回答已经足够,但您可能希望考虑authorization_code
在您的移动应用程序中而不是 LinkedIn SDK 中实现 LinkedIn 的 OAuth 流程。这看起来大致类似于以下流程:
听起来很复杂?它实际上比看起来更简单。实际上,我使用 Express.js 和 Swift 为这个流程编写了一些演示代码。此示例最终将访问令牌发送到 Stormpath 以最终对用户进行身份验证,但您始终可以将其替换为您自己的代码,该代码调用LinkedIn REST API 来获取配置文件的信息。
在 Swift 3.0 中,UIApplicationOpenURLOptionsKey
应该添加 forFacebook
和LinkedIn
.
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
if LISDKCallbackHandler.shouldHandle(url)
{
return LISDKCallbackHandler.application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation: nil)
}
else
{
return FBSDKApplicationDelegate.sharedInstance().application(app, open: url
, options: options)
}
}
我知道这已经得到了回答,但我也遇到了这个问题,并且已经完成了 Accepted 答案中设置的所有内容,但无论出于何种原因,代码仍然没有成功或失败。事实证明,对于 iOS 9,以下内容已被弃用。
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
解决方案是改用它:
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<NSString *,
id> *)options
例如,您可以这样做:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
if ([LISDKCallbackHandler shouldHandleUrl:url]) {
return [LISDKCallbackHandler application:app openURL:url sourceApplication:options[UIApplicationLaunchOptionsSourceApplicationKey] annotation:options[UIApplicationLaunchOptionsAnnotationKey]];
}
return YES;
}
爱德华江的答案更新;更改是服务器+移动端的令牌访问。来源:https ://developer.linkedin.com/docs/ios-sdk-auth
正如@Edward Jiang 已经解释的那样,由于需要安装 LinkedIn 应用程序,LinkedIn 将整个身份验证过程变得非常笨拙。我编写了一个 Swift 库来处理嵌入的身份验证通量WKWebView
:LinkedInAuth-Swift。
这个库甚至消除了在服务器中处理 LinkedIn 响应的必要性。呈现身份验证通量的WKWebView
实例负责捕获 LinkedIn 返回的授权代码并随后请求访问令牌。