Не удалось добавить пропуск в Apple Wallet

Я провожу тестирование с Apple Wallet. У меня есть пропуск, который я хочу добавить в бумажник пользователя, когда он нажимает кнопку. Вот мой код:

        let filePath = Bundle.main.path(forResource: "DealsPasses", ofType: "pkpass")!
        let passData = try? Data(contentsOf: URL.init(fileURLWithPath: filePath), options: .alwaysMapped)
        let pass = PKPass(data: passData!, error: nil)
        let passVC = PKAddPassesViewController(pass: pass)
        navigationController?.pushViewController(passVC, animated: true)

Однако; когда пользователь нажимает кнопку,

AX Exchange error: Error Domain=Accessibility Code=0 "Remote service does not respond to _accessibilityMachPort" UserInfo={NSLocalizedDescription=Remote service does not respond to _accessibilityMachPort}

рассылается спамом на консоль со скоростью ~ 200/мин, и PKAddPassesViewController не представлен (или, если он есть, он просто имеет простое белое представление)

Запуск xCode 8 на iPhone SE (устройство)

(Примечание: перетаскивание DealsPasses.pkpass в симулятор работает нормально)


person Kelly Bennett    schedule 07.10.2016    source источник
comment
Используете ли вы KIF, Xarmin или другой фреймворк? Оба используют специальные возможности iOS (VoiceOver) для поиска элементов пользовательского интерфейса, что не является обычной целью. Когда вы передаете управление стороннему контроллеру (в данном случае PKAddPassesViewController), специальные возможности больше не могут получить доступ к элементу пользовательского интерфейса.   -  person PassKit    schedule 08.10.2016
comment
Это интересный момент. Я не использую KIF или Xamarin, но у меня есть несколько других фреймворков, которые могут делать подобные вещи. Я попробую сделать релизную сборку без них и посмотрю, что получится.   -  person Kelly Bennett    schedule 08.10.2016


Ответы (2)


Please use the following code in swift 4.

Загрузите образец прохода по этой Ссылка и сохраните эти проходы в изолированной программной среде приложения. .

import PassKit

//Function to open wallet view in your app. 
func loadWalletView() {
        if !PKPassLibrary.isPassLibraryAvailable() {
            let alert = UIAlertController(title: "Error", message: "PassKit not available", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
                switch action.style{
                case .default:
                    print("default")
                case .cancel:
                    print("cancel")
                case .destructive:
                    print("destructive")
                @unknown default:
                    break
                }}))
            self.present(alert, animated: true, completion: nil)
        }
        let resourcePath : String? = Bundle.main.resourcePath

        do {
            let passFiles : NSArray = try FileManager.default.contentsOfDirectory(atPath: resourcePath!) as NSArray
            for  passFile in passFiles {

                let passFileString = passFile as! String
                if passFileString.hasSuffix(".pkpass") {
                    openPassWithName(passName: passFileString)
                }
            }

        }catch {
            print(error.localizedDescription)
        }
    }

func openPassWithName(passName : String) {
        print(passName)

        let passFile = Bundle.main.resourcePath?.appending("/\(passName)")
        let passData = NSData(contentsOfFile: passFile!)

        do {
            let newpass = try PKPass.init(data: passData! as Data)
            let addController =  PKAddPassesViewController(pass: newpass)
            addController?.delegate = self
            self.present(addController!, animated: true)
        } catch {
            let alert = UIAlertController(title: "Error", message: "PassKit not available", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
                switch action.style{
                case .default:
                    print("default")
                case .cancel:
                    print("cancel")
                case .destructive:
                    print("destructive")
                @unknown default:
                    break
                }}))
            self.present(alert, animated: true, completion: nil)

            print(error)
        }
    }
person Paritosh Pawar    schedule 20.08.2019

Проблема оказалась связанной с помещением PKAddPassesViewController в стек навигационного контроллера.

замена navigationController?.pushViewController(passVC, animated: true) на present(passVC, animated: true, completion: nil) устранила проблему!

person Kelly Bennett    schedule 11.10.2016