Swift调用Instagram Graph API如何避免“商务账户转换前发布媒体”报错
可行解决方案
方案1:直接调用API获取账号总帖数(最优)
Instagram Graph API的IG Business Account节点原生支持media_count字段返回账号发布的公开帖子总数,不需要自行轮询判断,直接发起一次请求即可拿到准确的limit值:
请求参数格式:GET /{你的IG商业账号ID}?fields=media_count&access_token={你的访问令牌}
这个接口返回的media_count值就是你需要的limit参数值,完全避免轮询带来的判断误差和请求资源浪费。
方案2:优化原有轮询逻辑的有效性判断
如果你坚持使用原有轮询方案,修改响应判断逻辑即可解决误判问题:
- 首先判断返回JSON是否包含
error字段,若存在且error_subcode == 2108006直接判定为无效请求 - 其次校验返回的
media数组长度是否等于你传入的limit值,只有两个条件同时满足才标记为有效请求
修改后的代码示例:
//Find url limit extension GetJson { class func findMediaLimit(IgBusinessAccount: String, token: String, Completion block: @escaping ((Int) -> ())) { let igBId = IgBusinessAccount let group = DispatchGroup() var validLimit: Int = 0 for i in 1...12 { guard let encodedUrl = self.buildURLAPIGraph(IgBusinessAccount: igBId, token: token, i: i) else { return } group.enter() self.cURL(urlT: encodedUrl) { (Json) in // 排除错误响应 if Json.error == nil, Json.username != nil, let mediaList = Json.media as? [Any], mediaList.count == i { // 只有无错误、用户名存在、返回媒体数等于请求limit才更新有效值 validLimit = max(validLimit, i) } group.leave() } } group.notify(queue: .main) { print("Media limit: \(validLimit)") block(validLimit) } } }
方案3:使用二分法降低请求次数
如果要优化轮询的请求效率,可将12次并发请求改为二分法串行请求,最多4次请求即可定位到正确的limit值,减少API调用频率降低触发限流的概率。
内容的提问来源于stack exchange,提问作者Abv
相关产品推荐
相关产品推荐

