Apple通知をfirebaseを使用して送信できるようにアプリを設定し、コンソールを使用して通知が機能することを確認しました。APNの上に構築された電話認証を実行したいと思います。
だから私はこれを書いた:
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber) { verificationID, error in
if error != nil {
print("Verification code not sent \(error!)")
} else {
print ("Successful.")
}
そして私は得る:
Error Domain=FIRAuthErrorDomain Code=17999 "An internal error has occurred, print and inspect the error details for more information." UserInfo={NSUnderlyingError=0x170046db0 {Error Domain=FIRAuthInternalErrorDomain Code=3 "(null)" UserInfo={FIRAuthErrorUserInfoDeserializedResponseKey={
code = 500;
message = "<null>";
}}}, error_name=ERROR_INTERNAL_ERROR, NSLocalizedDescription=An internal error has occurred, print and inspect the error details for more information.}
何か案が? firebaseに対してバグを報告する必要がありますか?
IOS SDK 4.0.0を使用しています(最新のZipが見つかりました)。
更新:
info.plist
にFirebaseAppDelegateProxyEnabled
を追加してメソッドのスウィズリングを無効にし、NO
に設定しました
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
// Pass device token to auth.
Auth.auth().setAPNSToken(deviceToken, type: .prod)
}
最新のFirebase iOS SDK i.e. 4.0.およびXcode 8.でテスト済み
まず、このキーFirebaseAppDelegateProxyEnabled
をinfo.plistから削除します。これは必要ありません。
AppDelegate.Swiftに次の関数を追加します
import Firebase
import UserNotifications
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate , UNUserNotificationCenterDelegate{
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if #available(iOS 10.0, *) {
// For iOS 10 display notification (sent via APNS)
UNUserNotificationCenter.current().delegate = self
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
options: authOptions,
completionHandler: {_, _ in })
} else {
let settings: UIUserNotificationSettings =
UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
application.registerUserNotificationSettings(settings)
}
application.registerForRemoteNotifications()
FirebaseApp.configure()
return true
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
// Pass device token to auth.
let firebaseAuth = Auth.auth()
//At development time we use .sandbox
firebaseAuth.setAPNSToken(deviceToken, type: AuthAPNSTokenType.sandbox)
//At time of production it will be set to .prod
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
let firebaseAuth = Auth.auth()
if (firebaseAuth.canHandleNotification(userInfo)){
print(userInfo)
return
}
}*
ユーザーの電話に確認コードを送信します:
電話認証を統合するクラスで、次のように記述します。
注:インドの国コードとして+91
を追加しました。地域に応じて国コードを追加できます。
PhoneAuthProvider.provider().verifyPhoneNumber("+919876543210") { (verificationID, error) in
if ((error) != nil) {
// Verification code not sent.
print(error)
} else {
// Successful. User gets verification code
// Save verificationID in UserDefaults
UserDefaults.standard.set(verificationID, forKey: "firebase_verification")
UserDefaults.standard.synchronize()
//And show the Screen to enter the Code.
}
確認コードを使用してユーザーにサインイン:
let verificationID = UserDefaults.standard.value(forKey: "firebase_verification")
let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID! as! String, verificationCode: self.txtEmailID.text!)
Auth.auth().signIn(with: credential, completion: {(_ user: User, _ error: Error?) -> Void in
if error != nil {
// Error
}else {
print("Phone number: \(user.phoneNumber)")
var userInfo: Any? = user.providerData[0]
print(userInfo)
}
} as! AuthResultCallback)
XcodeのApp Bundle IDがFirebaseのバンドルID exactlyと一致することを再確認します。そしてexactlyによって、大文字と小文字が一致することを確認します。Xcodeは、バンドルIDのアプリ名部分にデフォルトで大文字と小文字が混在することを好みます。
XcodeでバンドルIDを変更する場合は、Xcodeで新しいプロファイルを生成する前に、アプリのプロビジョニングプロファイルを手動で削除してください。そうしないと、繰り返し失敗します(Appleはプロファイル名の大文字と小文字を無視しているようです)。
私の場合、間違っていたのはapnsトークンタイプでした。
Auth.auth().setAPNSToken(deviceToken, type: AuthAPNSTokenType.prod)
になるはずだった:
Auth.auth().setAPNSToken(deviceToken, type: AuthAPNSTokenType.sandbox)
まあ、私の場合、私は間違って送信していますself.verificationID
からFIRAuthCredential
へ。このエラーが発生している場合は、verificationID
を印刷して、FIRAuthCredential
に送信しているものと同じであることを確認してください。
objC
のコードは次のとおりです。
[[FIRPhoneAuthProvider provider] verifyPhoneNumber:self.phoneNumberTextField.text
UIDelegate:nil
completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
if (error) {
NSLog(@"error %@", error.localizedDescription);
return;
}
NSLog(@"verificationID %@", verificationID);
self.verificationID = [NSString stringWithFormat:@"%@", verificationID];
// NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// [defaults setObject:verificationID forKey:@"authVerificationID"];
// NSString *verificationID = [defaults stringForKey:@"authVerificationID"];
// Sign in using the verificationID and the code sent to the user
// ...
}];
間違った確認IDをここに誤って送信しました:
self.verificationID = [NSString stringWithFormat:@"verificationID",];
正しいのはこれです:
self.verificationID = [NSString stringWithFormat:@"%@", verificationID];
そして、次のようにFIRAuthCredential
に送信します。
FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
credentialWithVerificationID:self.verificationID
verificationCode:self.pinCodeTextField.text];
[[FIRAuth auth] signInWithCredential:credential
completion:^(FIRUser *user, NSError *error) {
if (error) {
NSLog(@"error %@", error);
return;
}
NSLog(@"Success");
// User successfully signed in. Get user data from the FIRUser object
// ...
}];
これはsuccess
を正常に返します。それが他の人に役立つことを願っています。