TwitterKit for Swift无法显示图片

时间:2015-10-29 20:06:18

标签: ios swift twitter swift2

问题
当将返回的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

  • 查看
    • 滚动型
      • InfoView(其他信息)
      • SocialView(有关Twitter个人资料和Twitter Feed的信息)
        • ProfileInfoView
        • twitterTable(没有指定的类,ViewController为datasource& delegate)
          • twitterTableViewCell(指定TWTRTweetTableViewCell类)


元数据工作流程

  1. 应用程序调用专有服务器API
  2. 服务器:
    • 返回缓存的Twitter JSON
    • 使用搜索字词调用Twitter API。缓存Twitter JSON响应。返回Twitter JSON。
  3. App解析JSON,并利用TWTRTweet.tweetsWithJSONArray设置var 推文
  4. 推文上设置,使用推文更新 twitterTable

  5. 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
        }
    }
    

2 个答案:

答案 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/