Я играю с 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;
...
}