2016-10-02 97 views
0

我正在使用Sinch和ManagedPush通过PushKit接收VoIP通知。在我的应用我有三个可能的状态:在注册后,Sinch再次注册了通知unregisterPushNotificationDeviceToken

  • 在线
  • 离线
  • “不适用于来电,但我可以拨打电话”

用户可以在任何改变这种状态在App会话期间。

下列文件: https://www.sinch.com/docs/voice/ios/#unregisterapushdevicetoken

我使用unregisterPushNotificationDeviceToken以及stopListeningOnActiveConnection

这似乎是工作,以获得人不接听来电,可是仍然存在客户端主动拨打电话。我遇到的问题是让用户重新联机。活动连接有效,但我似乎无法再次注册通知,以便在应用程序处于后台时接收呼叫。

Sinch SDK - How to logout user?这样的问题不能解决如何让用户重新联机。

我已经考虑过使用SinchService组件https://github.com/sinch/SinchService-iOS,但是我可以从代码中看到注销功能会终止客户端。而且我有兴趣不要终止客户端,而是停止接收通知,然后在同一会话中再次接收它们。

我曾尝试:

不适用于进来的呼叫按钮的功能:

[_client stopListeningOnActiveConnection]; 
[_client unregisterPushNotificationDeviceToken]; 

在线按钮的功能:

[_client startListeningOnActiveConnection]; 
[[UIApplication sharedApplication] registerForRemoteNotifications]; 

我打电话registerForRemoteNotifications的原因是为了迫使didRegisterForRemoteNotificationsWithDeviceToken委托方法被调用,所以我可以调用Managed Push来再次注册通知。我认为这可能会做到这一点,但事实并非如此。

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 

    [self.push application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; 
} 

最有可能这不起作用,因为这经历了PushKit和注册的方式是不同的。

至于解决方法,对我的作品被重新创建客户端,当用户切换到在线状态回:

[_client terminateGracefully]; 
_client = nil; 
[self initSinchClientWithUserId:[BCDataProvider loggedInUser].callerId]; 

有没有什么方法可以让我尽快回到所注册的VoIP通知,一个unregisterPushNotificationDeviceToken后无需重新创建客户端?

谢谢!

+0

您使用托管推送还是滚动您自己的推送服务器? – cjensen

+0

嗨,我使用托管推送 –

回答

0

如果我没有错,基本上你需要通过在线/离线等方式来实现VOIP,你需要管理用户以允许通话或不通话。

您可以使用套接字架构,它使Broandcast用户保持在线/离线状态,因此在此基础上您可以设置允许呼叫或不允许呼叫。

如果您正在使用VOIP,则必须使用以下方法。

-(void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type 
{ 
    ///tell the Sinch SDK about the push token so we can 
    ///give that to users that want to call this user. 
    [_client registerPushNotificationData:credentials.token]; 
} 

下面提到的方法不会被使用。

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 


} 

使用推送通知,将随时为您提供新的唯一设备标识,所以一旦你在网上注册的离线观看,那么你又不能将能够使用相同的设备标记注册。

使用推送工具包(无提示推送通知),您将始终在未注册后获得相同的设备令牌注册。

希望你有想法,让我知道如果我可以帮助你更多。

谢谢,有一个快乐的编码。

+0

嗨Hasya, 谢谢你的回应!由于我使用托管推送,据我所知,我不应该不得不调用'didUpdatePushCredentials',因为这是在托管推送中完成的。 我在[documentation](https://www.sinch.com/tutorials/ios-managed-push/)后面使用'didRegisterForRemoteNotificationsWithDeviceToken'方法。但是,正如我所说,这很有可能这是因为这是通过PushKit。 让我知道如果我可以给任何更多的信息:) –