- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在 iOS 中,他们中的大多数通过 SDK 集成了 LinkedIn Login(如果您的 iPhone/iPad 中未安装 LinkedIn App 则无法登录,LinkedIn SDK 会返回一条消息以安装 LinkedIn App)。
但是在 Apple Review 期间,可能有机会拒绝我们的应用程序。所以唯一的解决办法是处理两种情况。
1.使用SDK登录LinkedIn
2.LinkedIn不用SDK登录(使用OAuth 2.0)
最佳答案
第一步
首先您需要检查您的 iPhone/iPad 中是否安装了 LinkedIn 应用。
isInstalled("linkedin://app") // function call
func isInstalled(appScheme:String) -> Bool{
let appUrl = NSURL(string: appScheme)
if UIApplication.sharedApplication().canOpenURL(appUrl! as NSURL)
{
return true
} else {
return false
}
}
第 2 步
创建一个 webviewController.swift
import UIKit
class WebViewController: UIViewController,UIWebViewDelegate {
@IBOutlet weak var webView: UIWebView!
let linkedInKey = "xxxxxx"
let linkedInSecret = "xxxxxx"
let authorizationEndPoint = "https://www.linkedin.com/uas/oauth2/authorization"
let accessTokenEndPoint = "https://www.linkedin.com/uas/oauth2/accessToken"
override func viewDidLoad() {
super.viewDidLoad()
webView.delegate = self
self.startAuthorization()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func startAuthorization() {
let responseType = "code"
let redirectURL = "https://com.appcoda.linkedin.oauth/oauth".stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet())!
let state = "linkedin\(Int(NSDate().timeIntervalSince1970))"
let scope = "r_basicprofile,r_emailaddress"
var authorizationURL = "\(authorizationEndPoint)?"
authorizationURL += "response_type=\(responseType)&"
authorizationURL += "client_id=\(linkedInKey)&"
authorizationURL += "redirect_uri=\(redirectURL)&"
authorizationURL += "state=\(state)&"
authorizationURL += "scope=\(scope)"
// logout already logined user or revoke tokens
logout()
// Create a URL request and load it in the web view.
let request = NSURLRequest(URL: NSURL(string: authorizationURL)!)
webView.loadRequest(request)
}
func logout(){
let revokeUrl = "https://api.linkedin.com/uas/oauth/invalidateToken"
let request = NSURLRequest(URL: NSURL(string: revokeUrl)!)
webView.loadRequest(request)
}
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
let url = request.URL!
if url.host == "com.appcoda.linkedin.oauth" {
if url.absoluteString!.rangeOfString("code") != nil {
let urlParts = url.absoluteString!.componentsSeparatedByString("?")
let code = urlParts[1].componentsSeparatedByString("=")[1]
requestForAccessToken(code)
}
}
return true
}
func requestForAccessToken(authorizationCode: String) {
let grantType = "authorization_code"
let redirectURL = "https://com.appcoda.linkedin.oauth/oauth".stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet())!
// Set the POST parameters.
var postParams = "grant_type=\(grantType)&"
postParams += "code=\(authorizationCode)&"
postParams += "redirect_uri=\(redirectURL)&"
postParams += "client_id=\(linkedInKey)&"
postParams += "client_secret=\(linkedInSecret)"
// Convert the POST parameters into a NSData object.
let postData = postParams.dataUsingEncoding(NSUTF8StringEncoding)
// Initialize a mutable URL request object using the access token endpoint URL string.
let request = NSMutableURLRequest(URL: NSURL(string: accessTokenEndPoint)!)
// Indicate that we're about to make a POST request.
request.HTTPMethod = "POST"
// Set the HTTP body using the postData object created above.
request.HTTPBody = postData
// Add the required HTTP header field.
request.addValue("application/x-www-form-urlencoded;", forHTTPHeaderField: "Content-Type")
// Initialize a NSURLSession object.
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
// Make the request.
let task: NSURLSessionDataTask = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
// Get the HTTP status code of the request.
let statusCode = (response as! NSHTTPURLResponse).statusCode
if statusCode == 200 {
// Convert the received JSON data into a dictionary.
do {
let dataDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
print("dataDictionary\(dataDictionary)")
let accessToken = dataDictionary["access_token"] as! String
NSUserDefaults.standardUserDefaults().setObject(accessToken, forKey: "LIAccessToken")
NSUserDefaults.standardUserDefaults().synchronize()
print("START sentData")
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.navigationController?.popViewControllerAnimated(true)
})
}
catch {
print("Could not convert JSON data into a dictionary.")
}
}else{
print("cancel clicked")
}
}
task.resume()
}
}
第 3 步
LinkedIn 登录按钮点击
@IBAction func linkedinButtonClicked(sender: AnyObject) {
if (self.isInstalled("linkedin://app")){
// App installed
let permissions = [LISDK_BASIC_PROFILE_PERMISSION,LISDK_EMAILADDRESS_PERMISSION]
print("persmission end")
LISDKSessionManager.createSessionWithAuth(permissions, state: nil, showGoToAppStoreDialog: true, successBlock: { (returnState) -> Void in
let session = LISDKSessionManager.sharedInstance().session
LISDKAPIHelper.sharedInstance().getRequest("https://api.linkedin.com/v1/people/~:(id,first-name,last-name,email-address,picture-url,public-profile-url,industry,positions,location)?format=json", success: { (response) -> Void in
if let data = response.data.dataUsingEncoding(NSUTF8StringEncoding) {
if let dictResponse = try? NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers){
print("success")
}
}
}, error: { (error) -> Void in
print("LINKEDIN error\(error)")
})
}) { (error) -> Void in
print("error login linkedin")
}
}else{
// App not installed
print("App is not installed")
isBackFromWebViewCntr = true
let webViewCnt = self.storyboard!.instantiateViewControllerWithIdentifier("WebViewController") as UIViewController
self.navigationController?.pushViewController(webViewCnt, animated: true)
}
}
关于ios - 如何在没有SDK的情况下在iOS中集成Linkedin登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45952362/
创建我们的产品 LinkedIn 应用程序的开发人员通过 developer.linkedin.com 在他的个人 LinkedIn 帐户下添加了它。我们想将此应用程序移至我们公司的 LinkedIn
我正在尝试使用linkedin API 来显示我从第一天开始发布的个人资料的提要。帖子包括媒体、图像、视频等。我想知道是否有任何可用的 API,我可以在其中传递一些参数并获取我的linkedin 个人
我的应用程序从 LinkedIn 获取用户信息,但我找不到从 LinkedIn 获取某人性别的方法。 是否可以? LinkedIn 甚至有性别字段吗? 最佳答案 不。检查这个; https://dev
我很难在 LinkedIn 上获得分享。我正在尝试通过 LinkedIn API V2 发布 LinkedIn 共享,每次我发出发布请求时,我都会收到来自服务器的请求超时(状态 504)答复。这是我的
LinkedIn 的 API 返回以下值: [creationTimestamp] => 1407247548000 它看起来类似于 UNIX 时间戳,但末尾有三个“额外”零。这是什么格式,我该如何解
我正在尝试将从 ugcPosts API 获取组织帖子的现有代码迁移到 Posts API 的新版本调用(版本 202210),但我遇到了获取文章缩略图的问题。我从 Posts API 获得的响应不包
标题几乎说明了一切。有什么方法可以访问 LinkedIn 上大学页面的提要/更新吗? 在他们的开发者网站上唯一提到的大学是他们的 Alumni 小部件。 最佳答案 一句话:没有。 对于 API 的所有
您知道是否可以为 LinkedIn 平台构建应用程序? 最佳答案 是的,他们在 http://developer.linkedin.com/index.jspa 有 API ,允许访问个人资料、连接、
在 LinkedIn 的 API 使用条款 (https://developer.linkedin.com/legal/api-terms-of-use) 的第 2.3 节中,他们提到开发人员最多可以
作为公司页面的管理员,我如何通过 LinkedIn api 访问该公司的帖子 我被要求成为我公司资料的管理员。我创建了一个应用程序并将我的公司映射到该应用程序。但奇怪的是我刚刚获得了该应用程序的三个权
如何为我的网站提取或获取 LinkedIn 推荐?是否有任何插件或 PHP 脚本? 最佳答案 您可以使用 LinkedIn API 提取建议。 ,特别是 Profile API .粗略的步骤是: 创建
我正在为公司建立外部网站,我想展示我们公司的 LinkedIn 个人资料 最近更新 在我们的网站内。目前,当我访问我们公司的 LinkedIn 个人资料时,我可以看到这些最近的更新,这些更新也可供公共
articles API 的 LinkedIn 文档表明我可以通过做一个特定的文章的内容等 GET https://api.linkedin.com/v2/originalArticles/{orig
我想按日期范围获取视频分析。 我关注了视频分析 API, https://learn.microsoft.com/en-us/linkedin/marketing/integrations/commu
我想在我的网站中添加添加个人资料按钮以进行认证,以便用户可以将其添加到他们链接的个人资料中。 为此,我正在使用 任何人都可以帮助这里如何自动归档文件?意味着我想从我的一端发送证书名称、链接、许可证。
当图像通过 LinkedIn API v2 共享到个人资料(而非公司)时,它会显示为好像被裁剪过的一样: 但是,当我在 www.linkedin.com 上上传并分享同一张图片到我的个人资料时,它不显
当图像通过 LinkedIn API v2 共享到个人资料(而非公司)时,它会显示为好像被裁剪过的一样: 但是,当我在 www.linkedin.com 上上传并分享同一张图片到我的个人资料时,它不显
我正在使用 LinkedIn Owin Middleare,今天早上开始遇到问题,现在已将其复制到以下错误: POST https://www.linkedin.com/uas/oauth2/acce
我在我的网站上使用 LinkedIn 分享按钮,我使用相同的脚本将页面分享到 LinkedIn。但是,某些页面是成功的。一些页面失败。这是错误信息 Error while processing rou
有没有一种方法可以使用 LinkedIn API 提取公司洞察信息?我有一个高级帐户,并在 LinkedIn 开发者平台上创建了一个应用程序。我似乎找不到获取公司数据的方法,例如员 worker 数(
我是一名优秀的程序员,十分优秀!