ApolloNetworkManager 0.0.3

ApolloNetworkManager 0.0.3

daomangquan 维护。



  • 作者:yu shuhui
  • yu shuhui

ApolloNetworkManager

ApolloNetworkManager 是 Swift 语言的一个 GraphiQL 工具

Graphql

官方文档: https://apollo.graphql.net.cn/docs/ios/installation.html#adding-build-step

中文文档: http://graphql.cn

线上调试:https://www.graphqlbin.com

请先阅读官方的文档

安装

pod ‘ApolloNetworkManager’

使用

调用逻辑

        ApolloNetworkManager.shared.apiurl = "https://dev.api.xxxxx.com/graphql" // 自己服务器的端点地址
        ApolloNetworkManager.shared.httpHeader = [:] // 自己服务器的httpHeader信息

        /*调用完登录接口再去调用第二个接口*/
        ApolloNetworkManager.shared.performMutation(mutation: UsersMutation.init(username: "13500000000", password: "123456"), client: StoreManager.shared.apollo){ (result,error) in
            if let err = error{
                print(err)
            }else{
                if let data = result?.data?.createUserToken {
                    UserDefaults.standard.set(data.token, forKey: "token")
                    UserDefaults.standard.set(data.token, forKey: "studentid")
                }
            }
        }
        
        
        ApolloNetworkManager.shared.performFetch(fetch: AppSettingQuery(), client: StoreManager.shared.apolloClientWithToken) { (result,error) in
            if let err = error{
                print(err)
            }else{
                if let data = result?.data?.appsetting {
                    print(data.cdnUrl)
                    
                }
            }
        }
        
        

写在前面: 项目 项目运行 项目运行不起来 项目运行不起来的 项目运行不起来的, 项目运行不起来的,主要 项目运行不起来的,主要看 项目运行不起来的,主要看逻辑 项目运行不起来的,主要看逻辑, 项目运行不起来的,主要看逻辑,供参考

首先说的是我们项目的大概逻辑,我们这边有两个端点地址,一个是noauth的,一个是auth的,一开始就有两个 scheme.json 文件。

所以我这边设置了两个脚本分别在两个目录里面的 graphql 文件生成对应的 swift 文件

如下两个图所示

项目里面 WechatIMG35.png

# Type a script or drag a script file from your workspace to insert its path.

APOLLO_FRAMEWORK_PATH="${SRCROOT}/${TARGET_NAME}/GraphQL/"

if [ -z "$APOLLO_FRAMEWORK_PATH" ]; then
echo "error: Couldn't find Apollo.framework in FRAMEWORK_SEARCH_PATHS; make sure to add the framework to your project."
exit 1
fi

cd "${SRCROOT}/${TARGET_NAME}/GraphQL/login"
"${APOLLO_FRAMEWORK_PATH}"/run-bundled-codegen.sh codegen:generate --target=swift --includes=./**/*.graphql --localSchemaFile="schema.json" API.swift

项目里面 WechatIMG36.png

# Type a script or drag a script file from your workspace to insert its path.

APOLLO_FRAMEWORK_PATH="${SRCROOT}/${TARGET_NAME}/GraphQL/"

if [ -z "$APOLLO_FRAMEWORK_PATH" ]; then
echo "error: Couldn't find Apollo.framework in FRAMEWORK_SEARCH_PATHS; make sure to add the framework to your project."
exit 1
fi

cd "${SRCROOT}/${TARGET_NAME}/GraphQL/home"
"${APOLLO_FRAMEWORK_PATH}"/run-bundled-codegen.sh codegen:generate --target=swift --includes=./**/*.graphql --localSchemaFile="schema.json" APK.swift

avatar

avatar

项目结构

avatar

      ├── home
         ├── APK.swift
         ├── FetchLessons.graphql
         └── schema.json
      ├── login
         ├── API.swift
         ├── schema.json
         └── users.graphql
      └── run-bundled-codegen.sh

主要代码

import UIKit
import Apollo



extension ApolloNetworkManager: HTTPNetworkTransportPreflightDelegate {
    func networkTransport(_ networkTransport: HTTPNetworkTransport, shouldSend request: URLRequest) -> Bool {
        return true
    }
    
    func networkTransport(_ networkTransport: HTTPNetworkTransport,
                          willSend request: inout URLRequest) {
        
        request.timeoutInterval = 10 // 接口超时时间10s
        
        request.allHTTPHeaderFields = httpHeader
        
    }
}

// 业务回调
public typealias OperationResultHandler<Operation: GraphQLOperation> = (_ result: GraphQLResult<Operation.Data>?, _ error: Error?) -> Void

class ApolloNetworkManager: NSObject {
    
    static let shared = ApolloNetworkManager()
    
    var apiurl:String! // 服务器地址 endPoint
    
    var httpHeader:[String:String] = [:]

    // noauth
    private(set) lazy var apollo: ApolloClient = {
        let url = apiurl + "/noauth"
        
        let httpNetworkTransport = HTTPNetworkTransport(url: URL(string: url)!)
        httpNetworkTransport.delegate = self
        
        return ApolloClient(networkTransport: httpNetworkTransport)
    }()
    
    // auth
    private(set) lazy var apolloClientWithToken: ApolloClient = {
        let url = apiurl
        
        let httpNetworkTransport = HTTPNetworkTransport(url: URL(string: url!)!)
        httpNetworkTransport.delegate = self
        
        return ApolloClient(networkTransport: httpNetworkTransport)
    }()
    
    
    // get
    func performFetch<Fetch: GraphQLQuery>(fetch: Fetch,client:ApolloClient,  resultHandler: OperationResultHandler<Fetch>? = nil) {
        
        let cachePolicy: CachePolicy
        cachePolicy = .fetchIgnoringCacheCompletely
        
        client.fetch(query: fetch, cachePolicy: cachePolicy) { result in
            //            print(result)
            
            switch result {
            case .success(let graphQLResult):
                
                if let errors = graphQLResult.errors {
                    let dic = errors[0]
                    let str: String = dic["message"] as! String
                    if str == "Unauthorized" {
                        // RiseSetupController.logout()
                    } else {
                        let err:Error = errors[0]
                        resultHandler!(nil, err)
                    }
                }else{
                    resultHandler!(graphQLResult,nil)
                }
                
                
            case .failure(let error):
                if error is GraphQLHTTPResponseError {
                    let customError = error as! GraphQLHTTPResponseError
                    if customError.response.statusCode == 429 {
                        //  SVProgressHUD.showError(withStatus: "网络错误请重试!code:\(customError.response.statusCode)")
                    } else if customError.response.statusCode == 401 || customError.response.statusCode == 403 {
                        //  RiseSetupController.logout()
                    }
                    else if customError.response.statusCode == -1001 ||  customError.response.statusCode == -1003{
                        //                        SVProgressHUD.showError(withStatus: "请求超时")
                    }
                    //                    resultHandler!(nil,error)
                }
                
            }
            
        }
    }
    
    // post
    func performMutation<Mutation: GraphQLMutation>(mutation: Mutation, queue: DispatchQueue = DispatchQueue.main, client:ApolloClient,  resultHandler: OperationResultHandler<Mutation>? = nil) {
        
        client.perform(mutation: mutation, queue: queue) { result in
            print(result)
            switch result {
            case .success(let graphQLResult):
                
                if let errors = graphQLResult.errors {
                    let dic = errors[0]
                    let str: String = dic["message"] as! String
                    if str == "Unauthorized" {
                        // logout()
                    } else {
                        let err:Error = errors[0]
                        resultHandler!(nil, err)
                    }
                }else{
                    resultHandler!(graphQLResult,nil)
                }
                
                
            case .failure(let error):
                if error is GraphQLHTTPResponseError {
                    let customError = error as! GraphQLHTTPResponseError
                    if customError.response.statusCode == 429 {
                        //  SVProgressHUD.showError(withStatus: "网络错误请重试!code:\(customError.response.statusCode)")
                    } else if customError.response.statusCode == 401 || customError.response.statusCode == 403 {
                        //  logout()
                    }
                    else if customError.response.statusCode == -1001 ||  customError.response.statusCode == -1003{
                        //                        SVProgressHUD.showError(withStatus: "请求超时")
                    }
                    //                   resultHandler!(result)
                }
                
            }
        }
    }
    
    // upload
    func upload<Operation: GraphQLOperation>(client:ApolloClient,
                                             operation: Operation,
                                             files: [GraphQLFile],
                                             resultHandler: GraphQLResultHandler<Operation.Data>? = nil){
        client.upload(operation: operation, files: files, resultHandler: resultHandler)
    }
    
    
}