위젯에서 Bitbank의 자산을 확인할 수 있습니다.

8748 단어 XcodeiOSSwiftBitcoin

왜 만들려고 생각했는가



가상화폐 좋아하는 친구들로부터 "위젯으로 각 통화의 가격은 확인할 수 있지만 자산을 확인할 수 없는 것은 불편하다"는 목소리가.
점심 1회로 인수되어 만들어 보았다.

↓는 기존 비트뱅크 위젯

확실히 각 동전의 가격은 알지만 자신의 자산 정보는 없다.

만든 것



앱 측에서 보려는 동전과 Bitbank의 PrivateApi를 두드리는 ApiKey, ApiSecret 저장



그것을 위젯으로 표시하는 것



하나의 동전의 자산을보고 싶다고 요청했으므로 이번에는 하나의 동전의 총 자산, 현재 가격을 표시합니다.

Today Extension



iOS에서는 이 위젯을 Today Extension이라고 부른다.
타겟의 추가나 구현 방법 등은 다른 분들도 들고 있으므로 일단 스루
자신이 막힌 곳 중심에 씁니다.

위젯의 크기를 늘리려면



일반적인 표시를 줄이고, 표시를 늘리기를 누르면 퍼지는 것.

TodayViewController.swift
    override func viewDidLoad() {
        super.viewDidLoad()
        self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded
    }

widgetLargestAvailableDisplayMode를 설정하여 표시를 늘릴 수 있습니다.

TodayViewController.swift
    func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize){
        if (activeDisplayMode == NCWidgetDisplayMode.compact) {
            self.preferredContentSize = maxSize;
        }
        else {
            self.preferredContentSize = CGSize(width: 0, height: 100);
        }
    }

이렇게 늘릴 때의 높이를 지정.

어느 타이밍에 API를 두드려야 하는가



TodayViewController.swift
    func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {
        completionHandler(NCUpdateResult.newData)
    }

위젯이 표시될 때마다 widgetPerformUpdate가 호출됩니다. (viewDidAppear 좋은 느낌..?)
여기서 API 두드린 결과에 대해서 NCUpdateResult 에 값을 건네준다.

NCUpdateResultNewData - 내용이 바뀌었으므로 뷰를 다시 그릴 필요
NCUpdateResultNoData - 업데이트 필요 없음
NCUpdateResultFailed - 업데이트 처리 중 오류 발생

UserDefaults를 앱간에 공유



이번은 앱 측에서 코인과 API의 정보를 UserDefaults에 저장. 그것을 Today Extension 측에서 읽어 API를 두드릴 필요가 있었다.

Target Capabilities 선택
App Groups를 만들고 두 대상 모두에 해당 앱 그룹을 설정합니다.



이 App Groups로 UserDefaults의 인스턴스를 작성해, 보존, 읽으면 데이터가 공유된다.
let defaults = UserDefaults(suiteName: "group.共通のID")

출시할 때 등은 Apple Developer에서 App Groups를 만들어 ~~ 등 해야 하므로 주의

PrivateAPI를 두드리는 HMAC-SHA256 서명



개인적으로 이번에 가장 막혔다. .
Bitbank의 ProvateAPI를 두드리려면 「UNIXTIME、リクエストのパス、クエリパラメータ」 を連結させたもの를 API Secret과 함께 HMAC-SHA256으로 서명해야합니다.

이번에는 다음 라이브러리를 사용하십시오.

CryptoSwift
cocoapods 에서 설치
pod 'CryptoSwift'

다음과 같이 서명하여 사용
    private func makeAccessSignWith(accessKey: String, unixtime: String, path: String, queryParam: String) -> String? {
        let unixTimeStr = self.makeHaederUnixTime(unixTime: unixtime)
        let linkedStr = unixTimeStr + path + queryParam

        var bytes: [UInt8] = []

        bytes += linkedStr.bytes

        let signedString = try? HMAC(key: "APISecret", variant: .sha256).authenticate(bytes)

        return signedString?.toHexString()
    }

그러나 두드리지만 인증 에러가 돌아온다. . .
서명을 작성하는 방법이 잘못되었다고 생각하면 의외의 원인으로 원인 판명
BitBank의 API 문서 페이지에서 자신의 API 키와 API 비밀을 입력하면 실제로 API를 두드리고 확인할 수 있지만 거기의 UNIXTIME


왜 100년 전. . .
이 이상한 UNIXTIME에서 한 번 API를 두드린 것이 원인으로 그 후도 인증 에러가 나온 것 같다.
클라이언트에서 두드릴 때 UNIXTIME에 1000을 곱하여 해결

미래



지금은 하나의 동전 만 표시하고 있으므로 모두 표시하고 자산도 전부 더한 자산으로 하자

좋은 웹페이지 즐겨찾기