extension String { func yyyymmddtoDate() -> Date { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" dateFormatter.locale = .current let date: Date = dateFormatter.date(from: self)! return date } } 이러한 버그가 생겼다..! 한국은 GMT +9의 시간대인데, 반영이 제대로 안된 듯 했다. func yyyymmddtoDate() -> Date { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" dateFormatter.t..
AppDelegate말고 SceneDelegate의 이 함수에서 대응해줘야한다... func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { if let incomingURL = userActivity.webpageURL { print("Incoming URL is \(incomingURL)") let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { dynamicLink, error in guard error == nil else { print("Found an error \(error!.localizedDescription)") return } i..
1. AppDelegate의 didFinishLaunchingWithOptions에서 // Check if launched from notification let notificationOption = launchOptions?[.remoteNotification] if let notification = notificationOption as? [String: AnyObject], let aps = notification["aps"] as? [String: AnyObject] { print(aps) let userInfo = aps["data"]! print(userInfo["actionParam"]) let a = userInfo["actionParam"] let decoder = JSONDecoder(..
extension AppDelegate: UNUserNotificationCenterDelegate{ // This function will be called right after user tap on the notification func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { // tell the app that we have finished processing the user’s action / response completionHandle..
let screenName = data?.instagram ?? "" // CHANGE THIS let appURL = URL(string: "instagram://user?username=\(screenName)")! let webURL = URL(string: "https://instagram.com/\(screenName)")! if UIApplication.shared.canOpenURL(appURL) { if #available(iOS 10.0, *) { UIApplication.shared.open(appURL, options: [:], completionHandler: nil) } else { UIApplication.shared.openURL(appURL) } } else { // redi..
let center = UNUserNotificationCenter.current() center.getNotificationSettings { settings in guard (settings.authorizationStatus == .authorized) || (settings.authorizationStatus == .provisional) else { return } if settings.alertSetting == .enabled { // Schedule an alert-only notification. } else { // Schedule a notification with a badge and sound. } }
근데 외주사 디자이너는 당연히 hig도 안봤고 고쳐달라고 하면 그것도 한세월이라 그냥 진행해본다... 1. Signing& Capabilities에서 Sign in with Apple 추가. 2. 여전히 SwiftUI로 제공하지 않으므로 UIViewRepresentable로 해야한다... import SwiftUI import AuthenticationServices // 1 final class SignInWithApple: UIViewRepresentable { // 2 func makeUIView(context: Context) -> ASAuthorizationAppleIDButton { // 3 return ASAuthorizationAppleIDButton() } // 4 func updateU..
1. pod 설치하기 pod 'FBSDKLoginKit' 2. 3. func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { if let url = URLContexts.first?.url { // 카카오 간편로그인 if AuthApi.isKakaoTalkLoginUrl(url) { _ = AuthController.handleOpenUrl(url: url) } else { // 네이버 간편로그인 NaverThirdPartyLoginConnection .getSharedInstance()? .receiveAccessToken(URLContexts.first?.url) } // 페이스북 ApplicationDelegate.shared.applica..
ㅇㅇ
import KakaoSDKNavi LSApplicationQueriesSchemes에 'kakaonavi-sdk' 추가해주기 모드와 '길찾기'와 '목적지 공유하기'가 있는데 나는 '길찾기'로 작업했다. let destination = NaviLocation(name: "카카오판교오피스", x: "321286", y: "533707") let viaList = [NaviLocation(name: "판교역 1번출구", x: "321525", y: "532951")] guard let navigateUrl = NaviApi.shared.navigateUrl(destination: destination, viaList: viaList) else { return } UIApplication.shared.open..
struct SearchScene: View { @ObservedObject var viewModel = SearchSceneViewModel() } 이런 식으로 생긴 Scene에서 viewModel의 init이 계속 콜되는 문제가 있었는데 이 글을 보고 @ObservedObject에서 @StateObject로 바꿔서 해결! https://stackoverflow.com/questions/59533407/swiftui-observableobject-created-multiple-times struct SearchScene: View { @StateObject var viewModel = SearchSceneViewModel() }
[[String: String]]으로 하면 된다...
Thread 1: "Invalid parameter not satisfying: !stayUp || CLClientIsBackgroundable(internal->fClient) || _CFMZEnabled()" Background Modes에 Location updates를 추가해주니까 저런 에러가 안나기 시작했당,,
https://developers.kakao.com/docs/latest/ko/message/common Kakao Developers 카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다. developers.kakao.com 카카오 링크 API와 카카오톡 리스트 API가 다르다. 원하는걸 정확하게 쓰자! 카카오톡 메시지 API는 카카오톡 모듈인 TalkApi가 제공합니다. 따라서 카카오톡 메시지 API를 사용하려면 카카오 로그인 모듈 KakaoSDKUser, 사용자 인증 모듈 KakaoSDKAuth, 카카오톡 모듈 KakaoSDKTalk을 모두 설치해야 합니다. 모듈 설치 방법은 설치하기를 참고합니다. => pod으..
@AppStorage("isLoggedIn") var isLoggedIn : Bool = UserDefaults.standard.bool(forKey: "isLoggedIn") 이런식으로 PropertyWrapper을 달아서 쓸 수 있다! 만약 Unsupported Type이라면 이런 extension을 달아서 해결할 수 있다. extension Array: RawRepresentable where Element: Codable { public init?(rawValue: String) { guard let data = rawValue.data(using: .utf8), let result = try? JSONDecoder().decode([Element].self, from: data) else { r..
import Cocoa struct Company: Codable { let courseImages: [URL?] public init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) let nullableEmployees = try values.decode([OptionalObject].self, forKey: .courseImages) // // courseImages = nullableEmployees.compactMap { $0.value } // courseImages = nullableEmployees.map { $0.value } } } public struct Optiona..
"" Firebase 동적 링크는 앱 설치 여부에 관계없이 여러 플랫폼에서 원하는 대로 작동하는 링크입니다. "" 앱이 설치되어 있다면 앱이 실행이 되고, 앱이 설치되어 있지 않았다면 앱스토어나 특정 URL로 가는 액션을 할 수 있다. 하지만 우리가 하고싶어 하는 것은 단순히 앱을 켜는것 그 이상의 액션들이다. [공식 문서] https://firebase.google.com/docs/dynamic-links?hl=ko 링크 생성하기 링크 생성에는 크게 두가지 방법이 있다. 1. 파이어베이스 콘솔에서 생성하기 * Firebase 콘솔에서 링크를 생성하는건 대부분 특정 유저에게 보내거나 유동적인 데이터가 아니라 이벤트, 공지사항 같은 전체에게 보내거나 인스타그램, 페이스북 같은 곳에 광고용 링크를 만들기 위..