问题
当将返回的Twitter JSON提要加载到TwitterKit表视图单元格时,无法加载配置文件图像和媒体图像。所有其他数据(用户名,转发状态,描述,链接)加载并在twitterTableView中正确显示,但图像没有。
JSON Feed包含准确的图像URL。
有没有人经历过这个,或者有一个允许在View Controller中嵌套Twitter表的解决方案?
版本信息
Xcode v7.0.1
代码库:Swift 2.0
应用程序兼容性iOS 8.3+
TwitterCore v1.12.0
TwitterKit v1.12.0
在故事板中 ViewController
元数据工作流程
ViewController中的相关代码
import UIKit
import Alamofire
import SwiftyJSON
import RealmSwift
import TwitterKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UICollectionViewDataSource, UICollectionViewDelegate, TWTRTweetViewDelegate {
@IBOutlet weak var socialView: UIView!
@IBOutlet weak var friendCollectionView: UICollectionView!
@IBOutlet weak var twitterTableView: UITableView!
@IBOutlet weak var friendColletionViewHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var twitterTableViewHeightConstraint: NSLayoutConstraint!
var tweets: [TWTRTweet] = [] {
didSet {
twitterTableView.reloadData()
}
}
var tweetHeights:[Int:CGFloat] = [:]
var isLoadingTweets = false
let tweetTableCellReuseIdentifier = "TweetCell"
var prototypeCell: TWTRTweetTableViewCell?
var isLoadingFriend = false
var friends:[Friend] = [] {
didSet {
friendCollectionView.reloadData()
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.loadInfo()
self.loadFriends()
self.loadTweets()
// Create a single prototype cell for height calculations.
self.prototypeCell = TWTRTweetTableViewCell(style: .Default, reuseIdentifier: tweetTableCellReuseIdentifier)
// Register the identifier for TWTRTweetTableViewCell.
self.twitterTableView.registerClass(TWTRTweetTableViewCell.self, forCellReuseIdentifier: tweetTableCellReuseIdentifier)
}
func loadInfo(){
print("loads basic info")
// code removed to simplify post
}
func loadFriends(){
print("loads friendsCollectionView inside Info")
// code removed to simplify post
}
func loadTweets(){
print("loadTweets")
// Do not trigger another request if one is already in progress.
if self.isLoadingTweets {
return
}
self.isLoadingTweets = true
Alamofire.request(APIService.Router.TwitterSearch(searchType: "hashtag", searchTerm: "something", userSocialProfileID: ""))
.responseString { response in
print("request: \(response.0!)")
print("\n*******loadTweets********\n\n\(response.2.value!)\n\n**************\n")
}
.responseJSON { response in
// print("\n*******loadTweets:JSON********\n\n\(response.2.value!)\n\n**************\n")
if let json = response.2.value {
var jsonObj = JSON(json)
if let results = jsonObj["results"].dictionary{
if let jsonTweets = results["statuses"]!.arrayObject {
// print("The tweets are \n\(jsonTweets)")
self.tweets = TWTRTweet.tweetsWithJSONArray(jsonTweets) as! [TWTRTweet]
} else {
print("jsonTweets are not an array of Objects")
}
} else {
print("Results is not a dictionary.")
}
dispatch_async(dispatch_get_main_queue(),{
self.twitterTableViewHeightConstraint.constant = 0
for (_, tweetHeight) in self.tweetHeights {
self.twitterTableViewHeightConstraint.constant += tweetHeight
}
self.isLoadingTweets = false
})
} else {
print("value was not json...or something is wrong with the code")
}
}
}
//MARK: UITABLEVIEW
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tweets.count
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
let tweet = self.tweets[indexPath.row] as TWTRTweet!
if tweets.count > indexPath.row {
prototypeCell?.configureWithTweet(tweet)
}
let tweetHeight = TWTRTweetTableViewCell.heightForTweet(tweet, width: tableView.bounds.width)
self.tweetHeights[indexPath.row] = tweetHeight
return tweetHeight
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(tweetTableCellReuseIdentifier, forIndexPath: indexPath) as! TWTRTweetTableViewCell
// Assign the delegate to control events on Tweets.
cell.tweetView.delegate = self
cell.tweetView.showActionButtons = false
cell.tweetView.linkTextColor = UIColor().cosMediumPurple()
// Retrieve the Tweet model from loaded Tweets.
let tweet = tweets[indexPath.row] as TWTRTweet!
// Configure the cell with the Tweet.
cell.configureWithTweet(tweet)
// Return the Tweet cell.
return cell
}
}
答案 0 :(得分:1)
答案实际上非常烦人和简单。类TWTRTweet不包含配置文件图像或附加媒体的变量。 Twitter提供了方法:
TWTRTweet.tweetsWithJSONArray()
但该方法会立即丢弃您需要的图像的任何URL。您需要构建自定义解析方法。我已经完成了一些Twitter JSON解析工作,你可以查看here.
答案 1 :(得分:0)
此问题可能是由于iOS 9上的不匹配的SHA1证书受到Apple的新 App Transport Security 的影响。您可以通过向<a href="#">This is a title</a>
文件pbs.twimg.com
提供Info.plist
的ATS例外来解决此问题。
您可以使用带有nscurl
选项的--ats-diagnostics
命令加载图片,从而更紧密地诊断问题:
nscurl --ats-diagnostics https://pbs.twimg.com/profile_images/2044921128/finals.png
由于只有部分CDN服务器具有这些旧的SHA1证书,因此您不会总是看到问题。由于Twitter Kit正在为您处理图像缓存,因此在图像加载失败时可能并不明显,因为它在过去的某个时刻遇到了正确配置的服务器。
以下是模拟器中出现问题的一个示例:
http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/