Метод делегата Sinch shouldSendPushNotification не вызывается

Я играю с Sinch и у меня проблемы с Push-уведомлениями.

  • Во-первых, я могу использовать Sinch для отправки и получения сообщений (два устройства с двумя разными идентификаторами Sinch). Это означает, что клиент Sinch настроен правильно.

  • Во-вторых, я могу подтвердить, что push-уведомления правильно настроены на обоих устройствах, потому что я могу отправлять им push-уведомления на Parse.com. Все они имеют действительные токены push-уведомлений.

Затем в своем приложении я обнаружил, что метод делегата Sinch: shouldSendPushNotification не вызывается, когда сторона получателя не находится в сети.

Я выполнил поиск на SO и обнаружил, что есть аналогичный вопрос (Sinch, сообщение shouldSendPushNotification не вызывается), который предложил проверить обратный вызов messageSent.

Поэтому я попробовал следующее на стороне приемника:

  • перевести приложение в фоновый режим, нажав домой
  • принудительно выйти из приложения (двойной щелчок домой, удалить приложение из фона)
  • включить режим полета

После этого, когда сообщение отправлено, я вижу:

- (void)messageSent:(id<SINMessage>)message recipientId:(NSString *)recipientId

вызывается на стороне отправителя, а recipientId совпадает с целевым устройством. Но метод shouldSendPushNotification никогда не вызывается, как указано в документации Sinch.

Поскольку этот метод shouldSendPushNotification не вызывается, никакие push-уведомления не будут отправляться на целевое устройство.

Я работаю над этой проблемой в течение нескольких дней и очень хочу узнать решение, любая помощь приветствуется.

Тестовая среда

два устройства в iOS 8 beta 4 и одно в iOS 7.1.2

сборка с использованием XCode 6 beta 4

Код:

Настройка службы обмена сообщениями Sinch в AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

    // setup Parse

    [Parse setApplicationId:@"xxxxx"
                  clientKey:@"xxxxx"];
    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        // use registerUserNotificationSettings
        [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert) categories: UIUserNotificationActionContextDefault]];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    } else {
        // use registerForRemoteNotifications
        // Let the device know we want to receive push notifications
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
    }
    #else
    // use registerForRemoteNotifications
    // Let the device know we want to receive push notifications
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
    #endif

    // app response from the notifications while in background
    NSDictionary* remotePush = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if (remotePush) {
        // Extract the Sinch-specific payload from the Apple Remote Push Notification
        NSString* payload = [remotePush objectForKey:@"SIN"];
        // Get previously initiated Sinch client
        id<SINNotificationResult> result = [_client relayRemotePushNotificationPayload:payload];
        if (result.isMessage) {
            // Present alert notifying
            NSString *messageId = [[result messageResult] messageId];
            NSLog(@"Received messageid: %@", messageId);
        } else if (!result.isValid) {
            // Handle error
        }
        NSLog(@"Received Payload: %@", payload);
    }

    return YES;
}


- (void)initSinchClientWithUserId:(NSString *)userId {
    if (!_client) {
        _client = [Sinch clientWithApplicationKey:@"xxxx"
                                applicationSecret:@"xxxx"
                                  environmentHost:@"sandbox.sinch.com"
                                           userId:userId];

        _client.delegate = self;

        [_client setSupportMessaging:YES];
        [_client setSupportPushNotifications:YES];
        [_client setSupportActiveConnectionInBackground:NO];
        [_client start];
        [_client startListeningOnActiveConnection];
    }
}

И эта строка вызывается, как и ожидалось, при запуске приложения.

- (void)clientDidStart:(id<SINClient>)client {
    NSLog(@"Sinch client started successfully (version: %@)", [Sinch version]);
}

Внутри MessageSendingViewController приложения

- (id<SINClient>)client {
    return [(AppDelegate *)[[UIApplication sharedApplication] delegate] client];
}

-(void)viewDidLoad {
...
[self.client messageClient].delegate = self;
...
}

person dumbfingers    schedule 31.07.2014    source источник


Ответы (2)


Регистрируете ли вы «push-данные» (например, ваш токен APN) с помощью метода -[SINClient registerPushNotificationData:]?

Попробуйте что-то вроде:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [_client registerPushNotificationData:deviceToken];
}

(Более подробную информацию можно найти здесь, на http://www.sinch.com/docs/ios/user-guide/#pushnotifications)

person cahlbin    schedule 05.08.2014
comment
привет, спасибо за помощь. Я могу подтвердить, что у меня была эта строка в моем коде. Поскольку я могу получать push-уведомления от другого сервиса (например, Parse.com), push-уведомления должны работать правильно. - person dumbfingers; 05.08.2014

Проблема решена с помощью Sinch.

Сначала убедитесь, что client не равно нулю (0x0), когда вызывается метод делегата registerPushNotificationData:deviceToken.

В моем случае мне нужно снова вручную прописать настройки уведомлений после запуска клиента Sinch.

После запуска клиента и регистрации настроек уведомлений метод shouldSendPushNotification должен вызываться без проблем.

person dumbfingers    schedule 07.08.2014