swiftui 配合本地化存储将数据存储与github上——(数据上传并获取)

321 阅读2分钟

简介

在没有服务器的情况下,可以利用github的仓库,作为数据存储,当然,在业务上不适合更新过快的数据场景。

代码

分为两步,一、提交数据,二、获取数据,先看第一步,提交数据

//
//  CommitData.swift
//  dataTogithub
//
//  Created by lei silin on 2023/8/15.
//

import SwiftUI

struct CommitData: View {
    @State private var commitMessage: String = ""
    @State private var content: String = ""
    
    var body: some View {
        VStack {
            
            TextField("Enter content", text: $content)
                .padding()
            
            TextField("Enter commit message", text: $commitMessage)
                .padding()
            
            Button("Submit to GitHub") {
                submitToGitHub()
            }
            .padding()
        }
        .padding()
    }
    
    func submitToGitHub() {
        let repository = "yourusername/yourrepository" 
        let accessToken = "your_personal_access_token" 
        let filePath = "path/to/your/file.txt" // Path to the file you want to fetch
        
//        let content = "{\"result\":true,\"message\":\"请求成功\",\"data\":\"成功\",\"code\":0}"
        
        guard let fileContent = content.data(using: .utf8) else {
            print("Failed to encode file content")
            return
        }
        
        let url = URL(string: "https://api.github.com/repos/\(repository)/contents/\(filePath)")!
        var request = URLRequest(url: url)
        request.httpMethod = "PUT"
        request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
        
        let base64FileContent = fileContent.base64EncodedString()
        let requestBody: [String: Any] = [
            "message": commitMessage,
            "content": base64FileContent
        ]
        
        do {
            let jsonData = try JSONSerialization.data(withJSONObject: requestBody)
            request.httpBody = jsonData
        } catch {
            print("Error encoding JSON")
            return
        }
        
        URLSession.shared.dataTask(with: request) { data, response, error in
            if let error = error {
                print("Error: \(error.localizedDescription)")
                return
            }
            
            if let httpResponse = response as? HTTPURLResponse {
                if (200...299).contains(httpResponse.statusCode) {
                    print("Commit successful!")
                } else {
                    print("Commit failed with status code: \(httpResponse.statusCode)")
                }
            }
        }.resume()
    }
}

struct CommitData_Previews: PreviewProvider {
    static var previews: some View {
        CommitData()
    }
}

注意每次提交都需要重新命名,否则会显示422错误

第二步:获取数据

//
//  PushData.swift
//  dataTogithub
//
//  Created by lei silin on 2023/8/15.
//

import SwiftUI

struct PushData: View {
    @State private var fileContent: String = ""
    
    var body: some View {
        VStack {
            Text(fileContent)
                .padding()
            
            Button("Fetch from GitHub") {
                fetchFromGitHub()
            }
            .padding()
        }
        .padding()
    }
    
    func fetchFromGitHub() {
        print("启动")
        let repository = "yourusername/yourrepository" 
        let accessToken = "your_personal_access_token" 
        let filePath = "path/to/your/file.txt" // Path to the file you want to fetch
        
        
        let url = URL(string: "https://api.github.com/repos/\(repository)/contents/\(filePath)")!
        var request = URLRequest(url: url)
        request.httpMethod = "GET"
        request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
        
        URLSession.shared.dataTask(with: request) { data, response, error in
            if let error = error {
                print("Error: \(error.localizedDescription)")
                return
            }
            
            if let data = data {
                do {
                    print("11")
                    let decodedData = try JSONDecoder().decode(GitHubContentResponse.self, from: data)
                    print(decodedData)
                    if let content = decodedData.content {
                        
                        let cleanedContent = content.replacingOccurrences(of: "\n", with: "").replacingOccurrences(of: " ", with: "")
                        let trimmedContent = cleanedContent.trimmingCharacters(in: .whitespacesAndNewlines)
                        if let base64Data = Data(base64Encoded: trimmedContent),
                           let decodedContent = String(data: base64Data, encoding: .utf8) {
                            fileContent = decodedContent
                            print("打印出内容:", decodedContent)
                        } else {
                            print("Error decoding base64 content")
                        }
                    }
                } catch {
                    print("Error decoding JSON: \(error)")
                }
            }
        }.resume()
    }
}

struct GitHubContentResponse: Codable {
    let content: String?
    // You might need to decode other fields from the API response as well
}



struct PushData_Previews: PreviewProvider {
    static var previews: some View {
        PushData()
    }
}