我试图在我的IOS应用程序中使用Sinch实现应用程序对应用程序的调用。我已使用Sinch在iOS应用中实现了Pushkit,但当应用处于后台时,推送通知不起作用。

我有两个问题。

  • 我是否需要另一个Web服务将推送通知分别发送到我的应用程序以接收传入的应用程序,还是Sinch自行处理。
  • 如果它可以自行处理,那么我的代码中缺少什么。

  • #import "AppDelegate.h"
    @interface AppDelegate ()
    @end
    
    @implementation AppDelegate
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
    
        [self handleLocalNotification:[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]];
    
        self.push = [Sinch managedPushWithAPSEnvironment:SINAPSEnvironmentAutomatic];
        self.push.delegate = self;
        [self.push setDesiredPushTypeAutomatically];
    
        [self.push registerUserNotificationSettings];
    
        return YES;
     }
     - (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary *)options {
        return [[GIDSignIn sharedInstance] handleURL:url
                               sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                      annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
      }
    
    - (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
        return [[GIDSignIn sharedInstance] handleURL:url
                               sourceApplication:sourceApplication
                                      annotation:annotation];
    }
    
    - (id<SINClient>)client {
       return _sinchClient;
    }
    -(void)clientDidFail:(id<SINClient>)client error:(NSError *)error{
    
       NSLog(@"fail");
    }
    
    -(void)clientDidStart:(id<SINClient>)client{
    
        NSLog(@"Start");
        [self voipRegistration];
    }
    
    
    - (void)client:(id<SINClient>)client
       logMessage:(NSString *)message
          area:(NSString *)area
        severity:(SINLogSeverity)severity
       timestamp:(NSDate *)timestamp {
    // If you want all messages remove the if statement
    
        if (severity == SINLogSeverityCritical) {
            NSLog(@"%@", message);
        }
    }
    
    - (void)initSinchClientWithUserId:(NSString *)userId {
        if (!_sinchClient) {
    
            _sinchClient = [Sinch clientWithApplicationKey:@"<my-key>"
                                    applicationSecret:@"<my-secret>"
                                      environmentHost:@"sandbox.sinch.com"
                                               userId:userId];
    
            _sinchClient.delegate = self;
    
            [_sinchClient setSupportCalling:YES];
            [_sinchClient startListeningOnActiveConnection];
            [_sinchClient enableManagedPushNotifications];
            [_sinchClient start];
        }
     }
     - (void)handleLocalNotification:(UILocalNotification *)notification {
        if (notification) {
            id<SINNotificationResult> result = [self.sinchClient      relayLocalNotification:notification];
            if ([result isCall] && [[result callResult] isTimedOut]) {
                UIAlertView *alert = [[UIAlertView alloc]
                                      initWithTitle:@"Missed call"
                                      message:[NSString stringWithFormat:@"Missed call from %@", [[result callResult] remoteUserId]]
                                      delegate:nil
                                      cancelButtonTitle:nil
                                      otherButtonTitles:@"OK", nil];
                [alert show];
            }
        }
    }
    
    -(void)voipRegistration
    {
        PKPushRegistry* voipRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
        voipRegistry.delegate = self;
        voipRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
    }
    
    -(void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type
    {
        [_sinchClient registerPushNotificationData:credentials.token];
    }
    -(void)pushRegistry:(PKPushRegistry *)registry   didInvalidatePushTokenForType:(PKPushType)type{
    
         NSLog(@"invalidated");
    }
    -(void)pushRegistry:(PKPushRegistry *)registry   didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:  (NSString *)type
    {
        //notify
        NSDictionary* dic = payload.dictionaryPayload;
        NSString* sinchinfo = [dic objectForKey:@"sin"];
        UILocalNotification* notif = [[UILocalNotification alloc] init];
        notif.alertBody = @"incoming call";
        [[UIApplication sharedApplication] presentLocalNotificationNow:notif];
        if (sinchinfo == nil)
            return;
    
        dispatch_async(dispatch_get_main_queue(), ^{
            [_sinchClient relayRemotePushNotificationPayload:sinchinfo];
        });
    }
    

    最佳答案

    如果您将Pushkit和Sinch集成在一起,则推送通知可能无法捕获PushKit的委托(delegate)函数-didReceiveIncomingPushWithPayload。但是您可以在SINManagedPushDelegate的功能-didReceiveIncomingPushWithPayload上获得推送通知。
    推送通知不会到来,但是当应用程序处于后台时,您可以在那里收到来电事件。如果应用程序在后台运行,则可以触发本地通知,以通知用户来电。

    希望对您有所帮助。

    09-07 21:13