Сбой входа IOS с помощью apple с помощью swift на iPad только в обзоре Apple

#ios #swift #wkwebview #apple-sign-in

#iOS #swift #wkwebview #apple-вход

Вопрос:

Мое приложение webview было отклонено, потому что у меня его нет apple sign in , поэтому я внедрил его и протестировал перед отправкой, я снова получил отказ из-за сбоя iPad running iOS 13.6.1 on WiFi при нажатии на вход с помощью Apple. Я тестировал почти на всех iPad в эмуляторе, но, похоже, он работает очень хорошо. Пожалуйста, кто-нибудь может мне помочь, я действительно новичок в iOS, даже не могу понять журналы ошибок, которые они включили.

Ниже я включил все связанные классы, которые я использовал для входа в Apple, а также ссылку на отчет журнала ошибок, ОТЧЕТ ОБ ОШИБКЕ 1 и ОТЧЕТ ОБ ОШИБКЕ 2.

Мой основной контроллер просмотра

 class HomeVC: UIViewController {
    func signInWithAppleButtonPressed() {
        let provider = ASAuthorizationAppleIDProvider()
        let request = provider.createRequest()
        request.requestedScopes = [.fullName, .email]

        let controller = ASAuthorizationController(authorizationRequests: [request])
        controller.presentationContextProvider = self
        controller.delegate = self
        controller.performRequests()
    }

    //I call this method on javascript callback from webview
    //signInWithAppleButtonPressed()
}
  

Расширение для входа в Apple

 extension HomeVC: ASAuthorizationControllerDelegate {

  func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        guard let credentials = authorization.credential as? ASAuthorizationAppleIDCredential else {return}
        
    var payload: [String: Any] = [:]
    if user.apple_payload.count > 0 amp;amp; user.apple_payload["id"] as! String == credentials.user {
        payload = user.apple_payload
    }else {
        payload = [
            "givenName": credentials.fullName?.givenName as Any,
            "familyName": credentials.fullName?.familyName as Any,
            "email": credentials.email as Any,
            "id": credentials.user
        ]
         user.apple_payload = payload
    }

      if let identifyToken = credentials.identityToken {
         if let token = String(bytes: identifyToken, encoding: .utf8) {
             user.apple_id = credentials.user
             payload["identityToken"] = token
            let str = Utils.shared.DictionaryToString(payload: payload)
            if !str.isEmpty {
                SendToBackEnd(Utils.shared.toBase64(str: str))
            }
         }
         return
      }

  }
  
  func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
    print("Authorization returned an error: (error.localizedDescription)")
  }
}


extension HomeVC: ASAuthorizationControllerPresentationContextProviding {

  func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
    return view.window!
  }
}
  

Мой класс Utils

 class Utils {
    static let shared = Utils()
    func DictionaryToString(payload: [String: Any]) -> String {
        if let jsonData = try? JSONSerialization.data(withJSONObject: payload, options: []) {
            if let jsonString = String(data: jsonData, encoding: .utf8) {
                return jsonString
            }
        }
        return ""
    }
    func toBase64(str: String) -> String {
        let utf8str = str.data(using: .utf8)
        if let base64Encoded = utf8str?.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) {
        return base64Encoded
        }
        return ""
    }
}
  

Мой класс пользователя

 class User {

    var apple_id: String {
        get {
            return UserDefaults.standard.string(forKey: "UserAppleIdentification") ?? ""
        }
        set {
            UserDefaults.standard.set(newValue, forKey: "UserAppleIdentification")
            UserDefaults.standard.synchronize()
        }
    }
    
    var apple_payload: [String: Any] {
        get {
            return (UserDefaults.standard.dictionary(forKey: "UserApplePayloadIdentification") ?? [:]) as [String: Any]
        }
        set {
            UserDefaults.standard.set(newValue, forKey: "UserApplePayloadIdentification")
            UserDefaults.standard.synchronize()
        }
    }
}
  

Комментарии:

1. Чтобы разобраться в сообщениях об ошибках, вам необходимо выполнить поиск информации о том, как обозначить трассировку стека, которую они вам предоставили. Когда вы сделаете это правильно, фрейм 7 (0x00000001025ad544 0x1023b4000 2069828) превратится в читаемое место в вашем коде.

2. @PhillipMills Я действительно не знаю, как это сделать, я только начал работать с iOS

3. developer.apple.com/library/archive/technotes/tn2151/…

4. @PhillipMills спасибо, теперь я могу понять причину ошибки.