8

Tôi đã chuyển từ Swtiched từ Google Cloud Messaging sang Nhắn tin qua đám mây của Firebase.Hồ sơ phát hành và phát hành Nhắn tin qua đám mây của Firebase

Với GCM, tôi phải chọn tùy chọn hộp cát. Như đã trình bày ở đây: https://developers.google.com/cloud-messaging/ios/client#obtain_a_registration_token thấy điểm 3.

Tiếp nhận thông báo đẩy trong chế độ gỡ lỗi tôi phải làm một cái gì đó như thế này

[[GGLInstanceID sharedInstance] startWithConfig:instanceIDConfig]; 
_registrationOptions = @{kGGLInstanceIDRegisterAPNSOption:deviceToken, 
         kGGLInstanceIDAPNSServerTypeSandboxOption:@YES}; 

Tiếp nhận thông báo đẩy trong một ứng dụng từ AppStore (ví dụ TestFlight) Tôi có để nói:

kGGLInstanceIDAPNSServerTypeSandboxOption:@NO}; 

Bây giờ tôi không thể tìm thấy thứ gì đó như thế này trong Firebase. Đầu tiên tôi nghĩ rằng tuyệt vời không chuyển đổi những giá trị ngu ngốc nữa. Nhưng bây giờ tôi không nhận được bất kỳ thông báo đẩy trong ứng dụng TestFlight của tôi nữa.

Trong debug console của tôi khi tôi gỡ lỗi trên thiết bị một đầu ra là như thế này:

<FIRInstanceID/WARNING> APNS Environment in profile: development 

Đó là tốt để gỡ lỗi địa phương, nhưng không mong muốn trong TestFlight. (Tôi không biết điều này có xảy ra với ứng dụng TestFlight hay không, vì tôi không có giao diện điều khiển cho họ.)

Vì vậy, câu hỏi của tôi là: Có ai biết nếu tôi có thể thay đổi tùy chọn Sandbox theo cách thủ công trong Firebase không?

Cảm ơn,

Simon

Trả lời

9

Tôi đã giải quyết được sự cố bằng cách thêm mã bên dưới vào dự án.

FIRInstanceIDAPNSTokenType.Sandbox sẽ được sử dụng khi bạn cài đặt các ứng dụng mặc dù TestFlight,
và FIRInstanceIDAPNSTokenType.Prod khi ứng dụng của bạn đi trực tiếp trên App Store.

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) 
{ 
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Sandbox) 
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Prod) 
} 
1

Tôi làm theo các tài liệu được cung cấp và đã có cùng một vấn đề, sau đó tôi đã thử các ứng dụng khởi động nhanh chóng và nó làm việc. Khóa có vẻ là thêm logic để kết nối với FCM sau khi nhận được mã thông báo, bước này bị thiếu trong tài liệu thiết lập. Sau khi tôi đã làm điều này nó làm việc trên thiết bị phát triển của tôi bên ngoài của TestFlight mà không cần bất kỳ thiết bị chuyển mạch sandbox đặc biệt khác.

https://github.com/firebase/quickstart-ios/blob/master/messaging/FCM/AppDelegate.m#L85

// [START refresh_token] 
- (void)tokenRefreshNotification:(NSNotification *)notification { 
    // Note that this callback will be fired everytime a new token is generated, including the first 
    // time. So if you need to retrieve the token as soon as it is available this is where that 
    // should be done. 
    NSString *refreshedToken = [[FIRInstanceID instanceID] token]; 
    NSLog(@"InstanceID token: %@", refreshedToken); 

    // Connect to FCM since connection may have failed when attempted before having a token. 
    [self connectToFcm]; 

    // TODO: If necessary send token to appliation server. 
} 
// [END refresh_token] 

// [START connect_to_fcm] 
- (void)connectToFcm { 
    [[FIRMessaging messaging] connectWithCompletion:^(NSError * _Nullable error) { 
    if (error != nil) { 
     NSLog(@"Unable to connect to FCM. %@", error); 
    } else { 
     NSLog(@"Connected to FCM."); 
    } 
    }]; 
} 
// [END connect_to_fcm] 

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    [self connectToFcm]; 
} 

// [START disconnect_from_fcm] 
- (void)applicationDidEnterBackground:(UIApplication *)application { 
    [[FIRMessaging messaging] disconnect]; 
    NSLog(@"Disconnected from FCM"); 
} 
// [END disconnect_from_fcm] 
1

Đó là về setAPNSToken() chức năng. Bạn cần đặt FIRInstanceIDAPNSTokenType thành Prod trong khi thêm mã thông báo thiết bị. Tôi sử dụng nhanh chóng cho rằng, đoạn code tôi sử dụng là:

func application(application: UIApplication, 
       didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) 
{ 
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Prod) 
} 

còn nếu bạn chỉ muốn loại bỏ các cảnh báo, bạn có thể sử dụng một hồ sơ cá nhân sản xuất provisioning.

1

Be an toàn, sử dụng dưới đây:

#if DEBUG 
     FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .sandbox) 
    #else 
     FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .prod) 
    #endif 

Đừng cách không cần thiết thiết lập sandbox dấu hiệu để thúc giục loại và ngược lại.

Các vấn đề liên quan