带 Sinch VOIP 的 Pushkit 无法与 Pushkit 配合使用

2024-03-10

我正在尝试在我的 IOS 应用程序中使用 Sinch 实现应用程序到应用程序的呼叫。我已经使用 Sinch 在我的 iOS 应用程序中实现了 Pushkit,但是当应用程序处于后台时,推送通知不起作用。

我有两个问题。

  1. 我是否需要另一个 Web 服务来单独向我的应用程序发送传入应用程序的推送通知,或者 Sinch 自行处理。

  2. 如果它确实可以自行处理那么我的代码中缺少什么。

#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 的委托函数 - didReceiveIncomingPushWithPayload。但您可以通过 SINManagedPushDelegate 的函数 didReceiveIncomingPushWithPayload 获取推送通知。 推送通知不会到来,但当应用程序处于后台时,您可以在那里收到来电事件。如果应用程序在后台,您可以触发本地通知,让用户知道来电。

希望这对您有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带 Sinch VOIP 的 Pushkit 无法与 Pushkit 配合使用 的相关文章

  • 将 Objective-C 框架 (CocoaPod) 导入 Swift?

    我正在尝试导入libjingle peerconnection框架到我的 Xcode 项目中 但由于某种原因 我无法使用以下命令导入 Objective C 标头import RTCICEServer在 Swift 源文件中 我尝试使用头文
  • VNFaceObservation BoundingBox 在纵向模式下不缩放

    作为参考 这源于一个问题视觉API 我正在努力使用Vision通过a检测图像中的人脸VNDetectFaceRectanglesRequest 它在确定图像中正确的人脸数量并提供boundingBox对于每张脸 我的麻烦是由于我UIImag
  • 确定第三方应用程序在 iPhone 上播放的歌曲

    我正在尝试确定 iPhone 上当前正在播放的歌曲的标题 我知道如果本机 Apple 应用程序正在播放音乐 我可以使用以下代码来找出正在播放的内容 但如果从 Spotify 或其他音乐播放应用程序播放歌曲 我如何找到歌曲的标题 MPMedi
  • 错误:“消息回复时间太长”向设备手表套件 OS 2 发送消息

    从 Apple Watch 向设备发送消息时出现以下错误 错误域 WCErrorDomain代码 7012 消息回复时间太长 UserInfo NSLocalizedDescription 消息回复时间太长 NSLocalizedFailu
  • 一种简单、干净的方式来切换/交换视图?

    我已经看了几个来源 但我仍然很困惑 我想创建一个具有多个视图的应用程序 只有标准视图 没有表视图或其他任何内容 我可以在其中单击每个视图上的按钮来访问其他视图 我已经看到了多种方法来做到这一点 但对我来说唯一有意义的方法是让应用程序委托负责
  • UI键盘回避和自动布局

    鉴于 iOS 6 中对自动布局的关注以及 Apple 工程师的推荐 查看 WWDC 2012 视频 我们不再直接操作视图的框架 那么如何仅使用自动布局和 NSLayoutConstraint 来避免键盘呢 Update 这看起来是一个合理的
  • React Native 检查平板电脑或屏幕是否以英寸为单位

    我为平板电脑和移动设备建立了不同的渲染逻辑 我想知道是否有办法获取屏幕尺寸 以英寸为单位 或者甚至可能是任何模块自动检测设备是否是平板电脑 我没有直接使用尺寸 API 来获取屏幕分辨率的原因是 许多 Android 平板电脑的分辨率低于许多
  • 无论如何从变量名获取字符串?

    说我有课 interface Person NSObject NSString name 我需要获取类中 NSString 的名称 Person person Person alloc init NSLog Name of variable
  • iOS 8 UITableView 分隔符插入 0 不起作用

    我有一个应用程序 其中UITableView的分隔符插入设置为自定义值 右0 Left 0 这完美地适用于iOS 7 x 但是在iOS 8 0我看到分隔符插入设置为默认值15在右侧 即使在 xib 文件中它设置为0 它仍然显示不正确 我该如
  • 如何在iOS应用程序中实现互斥锁[重复]

    这个问题在这里已经有答案了 可能的重复 GCD 如何从两个线程写入和读取变量 https stackoverflow com questions 11070947 gcd how to write and read to variable
  • 如何使用 Unicode 十六进制值 (UTF-16) 在 Swift 中表达字符串

    我想在 Swift 中使用十六进制值编写 Unicode 字符串 我已阅读文档 https developer apple com library prerelease ios documentation Swift Conceptual
  • 为什么我的matchedGeometryEffect根据右下点移动?

    我只是尝试使用matchedGeometryEffect 制作一些动画 但是 存在一个错误 即该对象是根据右下点而不是中心进行动画处理的 我使用的代码在这里 import SwiftUI struct Test View Namespace
  • AudioKit - 立体声通道从输入翻转到输出?

    我正在使用 AudioKit 创建一个实验性 iOS 音频应用程序 目前 我正在尝试将 AKStereoInput 的左声道重新路由到 AudioKit output 的右声道 并将 AKStereoInput 的右声道重新路由到输出的左声
  • AWS MobileHub:重命名 Android / iOS 示例项目

    我是 AWS Mobilehub 的新手 我喜欢它允许我使用 AWS 配置选项创建项目 但是 当我尝试构建应用程序 ios swift android 时 它总是使用我的示例项目作为项目名称 在 AWS 项目的大多数配置设置中 例如使用 c
  • AVPlayer 失败并显示 AVPlayerItemStatusFailed(OSStatus 错误 -12983)

    有时 AVPlayer 会失败AVPlayerItemStatusFailed发生故障后 AVPlayer 继续失败AVPlayerItemStatusFailed 我尝试清除 AVPlayer 实例并创建新实例 但无法实现AVPlayer
  • UIWebView stringByEvaluatingJavaScriptFromString 在后台

    在 iOS 应用程序中 我正在运行一个相当大的脚本UIWebView using stringByEvaluatingJavaScriptFromString 就 JavaScript 字符串的长度而言较大 调用 JavaScript 后会
  • 在 Swift 中使用 Obj-C 完成块

    在 Objective C 中 我有一个完成块类定义为 File h typedef void MYCompletionBlock BOOL success NSDictionary result NSError error 然后 在 Sw
  • 将对象映射到 TableView 部分的 Swift 二维数组

    我想不出更好的方法来做到这一点 我将学生对象的所有属性映射到二维数组中 所以我的电视有几个部分 我也不能使用静态表视图 如果是这样 这个问题就不会存在 所以我在 TVC 中的代码 let currentUser PFUser current
  • iOS 中的视频可以进行反卷积吗?

    我想拍摄击球手挥动棒球的镜头 但球棒很模糊 视频为 30 fps 通过研究 我发现反卷积似乎是最小化运动模糊的方法 但我不知道是否或如何在我的 iOS 应用程序后处理中实现它 我希望有人能给我指出正确的方向 比如如何在 iOS 中应用反卷积
  • 如何在 Swift 中解析蓝牙设备发送的浮点数?

    在我的 iOS 应用程序上 我需要解码蓝牙接收到的 Float 值 并从不同的设备 不是 iOS 获取 4 个字节 因此我需要一个 便携式 4 字节 Float 格式 目前发件人正在使用以下格式 数据编码 0xCCBBAAAEE 0xEE

随机推荐

  • 如何用“搜索”按钮替换谷歌自定义搜索引擎的放大镜?

    我正在使用 GCSE 的基本代码和标准 紧凑 主题
  • Netbeans IDE 项目窗口中的跟踪文件

    刚刚开始使用 NetBeans 8 0 2 想知道 IDE 是否具有与 Eclipse 或 Visual Studio 类似的功能 在项目资源管理器中跟踪当前文件 在处理大型项目时 打开大量文件 如果我想导航到项目窗口中的当前文件 这会变得
  • 可以在 Javascript 中同步检查 Firebase 3 身份验证状态吗?

    目前 我的应用程序正在利用授权状态更改回调来指示在我的应用程序中的授权部分和主页部分之间移动 注意 我没有使用 AngularFire 在 Firebase 3 中有firebase auth currentUser但是 如果 fireba
  • RESTful系统中一次请求多条记录

    我见过的有关 RESTful 架构的所有示例都处理单个记录 例如 一个 GET 请求mydomain com foo 53获取 foo 53 或 POST 到mydomain com foo创建一个新的 Foo 但如果有多条记录呢 能够通过
  • Nodemon 和/或使用 Node-React Web 应用程序进行热重载

    在使用 webpack 配置 Web 应用程序以创建最佳开发体验方面 我还很陌生 我参加了两门不同的 Node React 课程 一门我们使用 nodemon 来跟踪更改 另一门我们实现热重载 当涉及到这两种依赖关系时 是一个还是另一个呢
  • 在 C# 中使用 Marshal.StructureToPtr 将结构传递给 C++ API

    我在我的代码中使用用 C 编写的 API 用 C 编写 API 需要一个参数作为结构指针 该结构由 Int 和 Char 数组组成 例如 unsafe public struct ToBePassed Int32 Num1 Int32 Nu
  • 如何使用Python ping ip并仅获取Tk中的ms?

    我想制作一个小 tk 应用程序 连续 ping 一个 ip 并且只显示 MS 例如 10ms 我该怎么办 如果您想使用 Windowsping 您必须解析命令行的输出 这是非常具体的 但应该有效 import os while 1 ping
  • 转换 Java 函数式接口

    一如既往 我浏览 JDK 8 源代码并发现了非常有趣的代码 Override default void forEachRemaining Consumer
  • 手动创建 Git 分支

    如果我理解分叉 它在概念上涉及以下步骤 将源存储库镜像克隆到目标存储库 在目标存储库上设置 上游 远程 指向源存储库 其他一些东西 例如电子邮件订阅等 对于这个问题并不重要 它是这样的 Original lt upstream Forked
  • 使用 Elasticsearch 搜索 Mysql 表

    假设我有以下 费用 MySQL 表 id amount vendor tag 1 100 google foo 2 450 GitHub bar 3 22 GitLab fizz 4 75 AWS buzz 我正在构建一个 API 该 AP
  • 当我使用 is 运算符时,为什么 IL 代码中只有空检查?

    我想知道怎么样is operator实施于C 我写了一个简单的测试程序 没什么特别的 只是为了演示目的 class Base public void Display Console WriteLine Base class Derived
  • 在函数内部使用 php 命名空间

    尝试在我自己的函数中使用名称空间时出现解析错误 require var load php function go use test Class go ok return go echo go From 导入范围规则 http php net
  • Delphi 中 WideString 的 WrapText

    德尔福有一个WrapText http docwiki embarcadero com VCL en SysUtils WrapText功能 function WrapText const Line BreakStr string cons
  • 在“SELECT”标签中呈现“OPTION”的层次结构

    我的问题与 HTML 和 CSS 相关 我有一个层次结构类型的结构 我想在列表中显示 该层次结构包含国家 州和城市 共三层 我想在选择列表中显示列表 每个项目类型 国家 州 城市 必须可选 这些项目应缩进为 United States Ha
  • Chrome 中有时会跳过 CSS 过渡

    我想将鼠标悬停在图像上时使用旋转动画翻转图像 请参阅下面的代码 当鼠标悬停在图像上时 它会绕 x 轴旋转一秒钟 当鼠标离开图像时返回 动画在 Firefox 和 Safari 中按预期工作 然而 Chrome有时会跳过动画并立即翻转图像 我
  • 使用 pandas dataframes data python 创建堆叠直方图

    我正在尝试使用来自 2 个或更多不均匀的 pandas 数据帧的数据创建堆叠直方图 到目前为止 我可以让它们在彼此之上绘制图表 但不能堆叠 import pandas as pd import matplotlib pyplot as pl
  • 我什么时候应该在 Python 中使用类型检查(如果有的话)?

    我开始学习 Python 作为一名主要的 Java 开发人员 我遇到的最大问题是了解何时以及何时不使用类型检查 大多数人似乎都说 Python 代码不需要类型检查 但在很多情况下我认为这是必要的 例如 假设我需要使用方法参数来执行算术运算
  • jQuery 模态表单对话框回发问题

    我创建了一个jQuery用户界面 http en wikipedia org wiki JQuery UI模式形式 我希望该形式触发回发 但我很难让它工作 我知道有很多文章是基于使用 SimpleModal 插件的 我尝试过调整这些并覆盖
  • 在python中获取组合框的值

    我正在开发一个简单的程序 我需要从Combobox 当Combobox位于第一个创建的窗口中 但例如如果我有两个窗口并且Combobox在第二个中 我无法从中读取值 例如 from tkinter import from tkinter i
  • 带 Sinch VOIP 的 Pushkit 无法与 Pushkit 配合使用

    我正在尝试在我的 IOS 应用程序中使用 Sinch 实现应用程序到应用程序的呼叫 我已经使用 Sinch 在我的 iOS 应用程序中实现了 Pushkit 但是当应用程序处于后台时 推送通知不起作用 我有两个问题 我是否需要另一个 Web