PKAddPassButton перемещается в верхнюю часть экрана при вызове метода отклонения PKAddPaymentPassViewControllerDelegate.IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Гость
 PKAddPassButton перемещается в верхнюю часть экрана при вызове метода отклонения PKAddPaymentPassViewControllerDelegate.

Сообщение Гость »

У меня проблема. UiKitView перемещается в верхнюю часть экрана, когда я вызываю метод отклонения класса PKAddPaymentPassViewControllerDelegate.
Сталкивались ли вы с этой проблемой? Когда пользователь нажимает кнопку отмены приложения Apple Wallet, приложение Wallet закрывается, а кнопка перемещается в верхнюю часть экрана.
Я хочу, чтобы PKAddPassButton оставалась на том же месте экрана после закрытия приложения Apple Wallet
Мы используем UIKitView для отображения PKAddPassButton во флаттере следующим образом:
UiKitView(
viewType: viewType,
layoutDirection: TextDirection.ltr,
creationParams:
createParameters(state.panRefId),
creationParamsCodec:
const StandardMessageCodec(),
> ),

Мы быстро создали UIViewController, чтобы показать его следующим образом:
import UIKit
import PassKit

class WalletButtonController: UIViewController {

let cardInfo: AppleWalletBankCardInfo

public init(cardInfo:AppleWalletBankCardInfo) {
self.cardInfo = cardInfo
super.init(nibName: nil, bundle: nil)
}

required public init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func viewDidLoad() {
super.viewDidLoad()
setupApplePayButton()
}

private func setupApplePayButton() {
let passKitButton = PKAddPassButton(addPassButtonStyle: .blackOutline)
passKitButton.frame = CGRect(x: 100, y: 100, width: 200, height: 50)

passKitButton.addTarget(self, action: #selector(onEnroll), for: .touchUpInside)
view.addSubview(passKitButton)
passKitButton.translatesAutoresizingMaskIntoConstraints = false
passKitButton.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16).isActive = true
passKitButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16).isActive = true
passKitButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16).isActive = true

}

@objc private func onEnroll(button: UIButton) {
guard isPassKitAvailable() else {
showPassKitUnavailable(message: "InApp enrollment not available for this device")
return
}

initEnrollProcess()
}

func initEnrollProcess() {

guard let configuration = PKAddPaymentPassRequestConfiguration(encryptionScheme: .ECC_V2) else {
showPassKitUnavailable(message: "InApp enrollment configuraton fails")
return
}

configuration.cardholderName = cardInfo.bankCardHolder
configuration.primaryAccountSuffix = cardInfo.bankCardNumber
configuration.localizedDescription = cardInfo.bankCardName
configuration.primaryAccountIdentifier = cardInfo.bankCardPanRefId

guard let enrollViewController = PKAddPaymentPassViewController(requestConfiguration: configuration, delegate: self) else {
showPassKitUnavailable(message: "InApp enrollment controller configuration fails")
return
}

enrollViewController.modalPresentationStyle = UIModalPresentationStyle.pageSheet;
present(enrollViewController, animated: true, completion: nil)
}

private func isPassKitAvailable() -> Bool {
return PKAddPaymentPassViewController.canAddPaymentPass()
}

private func showPassKitUnavailable(message: String) {
let alert = UIAlertController(title: "InApp Error",
message: message,
preferredStyle: .alert)
let action = UIAlertAction(title: "Ok", style: .default, handler: nil)
alert.addAction(action)

present(alert, animated: true, completion: nil)
}
}

extension WalletButtonController: PKAddPaymentPassViewControllerDelegate {
func addPaymentPassViewController(
_ controller: PKAddPaymentPassViewController,
generateRequestWithCertificateChain certificates: [Data],
nonce: Data, nonceSignature: Data,
completionHandler handler: @escaping (PKAddPaymentPassRequest) -> Void) {

let certArray = certificates.map { $0.base64EncodedString() }
let request = IssuerRequest(certificates: certArray, nonce: nonce.base64EncodedString(), nonceSignature: nonceSignature.base64EncodedString(), bankCardId: cardInfo.bankCardId, accessToken: cardInfo.accessToken,encryptUrl: cardInfo.encryptUrl)

let interactor = GetPassKitDataIssuerHostInteractor()
interactor.execute(request: request) { response in

let request = PKAddPaymentPassRequest()
request.activationData = Data(base64Encoded: response.activationData, options: .ignoreUnknownCharacters)
request.ephemeralPublicKey = Data(base64Encoded: response.ephemeralPublicKey, options: .ignoreUnknownCharacters)
request.encryptedPassData = Data(base64Encoded: response.encryptedPassData, options: .ignoreUnknownCharacters)

handler(request)

}
}

func addPaymentPassViewController(
_ controller: PKAddPaymentPassViewController,
didFinishAdding pass: PKPaymentPass?,
error: Error?) {
if let _ = pass {
print("Bank card was successfully added to wallet")
} else {}
self.dismiss(animated: true)
}

}

private class GetPassKitDataIssuerHostInteractor {

func execute(request: IssuerRequest, onComplete: @escaping(IssuerResponse) -> ()) {

executeInternal(issuerRequest: request, completion: {
(response) in

let responseData = try response.get()

let response = IssuerResponse(activationData: responseData.activationData,
ephemeralPublicKey: responseData.ephemeralPublicKey,
encryptedPassData: responseData.encryptedPassData)
onComplete(response)
})
}

func executeInternal(issuerRequest: IssuerRequest ,completion: @escaping(Result) throws -> Void) {

var request = URLRequest(url: URL(string:issuerRequest.encryptUrl)!)

request.httpMethod = "POST"
request.setValue("*/*", forHTTPHeaderField: "Accept")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("Bearer \(issuerRequest.accessToken)", forHTTPHeaderField: "Authorization")

let body:[String:Any]=[
"bankCardId": "\(issuerRequest.bankCardId)",
"nonce": "\(issuerRequest.nonce)",
"nonceSignature": "\(issuerRequest.nonceSignature)",
"certificates": issuerRequest.certificates
]

request.httpBody = try? JSONSerialization.data(withJSONObject: body,options: [])

URLSession.shared.dataTask(with: request) { (data, response, e) in

if let httpResponse = response as? HTTPURLResponse{
if httpResponse.statusCode >= 400 {
print(httpResponse.statusCode)
print(response)
return
}
}

guard let data = data, e == nil else {
print (e!.localizedDescription)
return
}

do {
let response = try JSONDecoder().decode(IssuerResponse.self, from: data)
try completion(.success(response))
}
catch {
print (error.localizedDescription)
return
}

}.resume()
}
}

struct IssuerRequest {
let certificates: [String]
let nonce: String
let nonceSignature: String
let bankCardId: String
let accessToken: String
let encryptUrl: String
}

struct IssuerResponse : Decodable {
let activationData: String
let ephemeralPublicKey: String
let encryptedPassData: String
}

struct AppleWalletBankCardInfo
{
let bankCardHolder: String
let bankCardPanRefId: String
let bankCardName: String
let bankCardNumber: String
let bankCardId: String
let bankCardType: Int
let accessToken: String
let encryptUrl: String

init(bankCardHolder: String, bankCardPanRefId: String, bankCardName: String, bankCardNumber: String,
bankCardId: String, bankCardType: Int, accessToken: String,encryptUrl: String) {
self.bankCardHolder = bankCardHolder
self.bankCardPanRefId = bankCardPanRefId
self.bankCardName = bankCardName
self.bankCardNumber = bankCardNumber
self.bankCardId = bankCardId
self.bankCardType = bankCardType
self.accessToken = accessToken
self.encryptUrl = encryptUrl
}
}


Подробнее здесь: https://stackoverflow.com/questions/772 ... pkaddpayme
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • PKAddPassButton перемещается в верхнюю часть экрана при вызове метода отклонения PKAddPaymentPassViewControllerDelegate.
    Anonymous » » в форуме IOS
    0 Ответы
    55 Просмотры
    Последнее сообщение Anonymous
  • Не могу построить `pkaddpaymentpassviewcontrollerdelegate` при настройке модулей Expo
    Anonymous » » в форуме IOS
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Ячейка в сетке игры «Змея» всегда поднимается в верхнюю часть экрана.
    Anonymous » » в форуме Python
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous
  • Просмотр прокрутки толкает элементы в верхнюю часть экрана
    Anonymous » » в форуме IOS
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Просмотр прокрутки толкает элементы в верхнюю часть экрана
    Anonymous » » в форуме IOS
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous

Вернуться в «IOS»