Skip to content

Instantly share code, notes, and snippets.

@markvanwijnen
markvanwijnen / NavigationSearch(1).swift
Last active September 9, 2020 18:42
Part 1 of building the NavigationSearch.
import SwiftUI
import UIKit
struct NavigationSearch: UIViewControllerRepresentable {
typealias UIViewControllerType = Wrapper
func makeCoordinator() -> Coordinator {
Coordinator(representable: self)
}
@markvanwijnen
markvanwijnen / TwitterAPI(1).swift
Created March 8, 2021 07:57
TwitterAPI - ClientCredentials
class TwitterAPI: NSObject, ObservableObject {
struct ClientCredentials {
static let APIKey = "YOUR_API_KEY"
static let APIKeySecret = "YOUR_API_KEY_SECRET"
static let CallbackURLScheme = "YOUR_CALLBACK_URL_SCHEME"
}
}
import SwiftUI
@main
struct TwitterTutorialApp: App {
@StateObject var twitterAPI = TwitterAPI() //1
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(twitterAPI) //2
import SwiftUI
import Combine // 1
class TwitterAPI: NSObject, ObservableObject {
struct ClientCredentials { /*(...)*/ }
lazy var onOAuthRedirect = PassthroughSubject<URL, Never>() // 2
}
import SwiftUI
@main
struct TwitterTutorialApp: App {
@StateObject var twitterAPI = TwitterAPI()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(twitterAPI)
extension CharacterSet {
static var urlRFC3986Allowed: CharacterSet {
CharacterSet(charactersIn: "-_.~").union(.alphanumerics)
}
}
extension String {
var oAuthURLEncodedString: String {
self.addingPercentEncoding(withAllowedCharacters: .urlRFC3986Allowed) ?? self
}
extension String {
var urlQueryItems: [URLQueryItem]? {
URLComponents(string: "://?\(self)")?.queryItems
}
}
extension Array where Element == URLQueryItem {
func value(for name: String) -> String? {
return self.filter({$0.name == name}).first?.value
}
import CommonCrypto
extension String {
func hmacSHA1Hash(key: String) -> String {
var digest = [UInt8](repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH))
CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA1),
key,
key.count,
self,
self.count,
private func oAuthSignatureBaseString(httpMethod: String,
baseURLString: String,
parameters: [URLQueryItem]) -> String {
var parameterComponents: [String] = []
for parameter in parameters {
let name = parameter.name.oAuthURLEncodedString
let value = parameter.value?.oAuthURLEncodedString ?? ""
parameterComponents.append("\(name)=\(value)")
}
let parameterString = parameterComponents.sorted().joined(separator: "&")
private func oAuthSigningKey(consumerSecret: String,
oAuthTokenSecret: String?) -> String {
if let oAuthTokenSecret = oAuthTokenSecret {
return consumerSecret.oAuthURLEncodedString + "&" +
oAuthTokenSecret.oAuthURLEncodedString
} else {
return consumerSecret.oAuthURLEncodedString + "&"
}
}