首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将PushKit的完成处理程序用于reportNewIncomingCallWithUUID

如何将PushKit的完成处理程序用于reportNewIncomingCallWithUUID
EN

Stack Overflow用户
提问于 2019-11-27 10:08:33
回答 2查看 903关注 0票数 2

我在我的应用程序中使用CallKit。

代码语言:javascript
代码运行次数:0
运行
复制
- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type withCompletionHandler:(nonnull void (^)(void))completion
{
    NSDictionary *payloadDict = payload.dictionaryPayload[@"aps"];           

    [self reportIncomingCallFrom:callerName withUUID:self.uuidCallkit completion:^(NSError * _Nullable error) {

    }];
    if (completion) {
        completion();
    }
}

我的问题是:我应该写如果完成然后调用完成,还是直接调用completion();?那么哪一个是正确的?

代码语言:javascript
代码运行次数:0
运行
复制
- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type withCompletionHandler:(nonnull void (^)(void))completion
{
    NSDictionary *payloadDict = payload.dictionaryPayload[@"aps"];           

    [self reportIncomingCallFrom:callerName withUUID:self.uuidCallkit completion:^(NSError * _Nullable error) {

    }];

    completion();
}

这是报告来电的方法。

代码语言:javascript
代码运行次数:0
运行
复制
- (void)reportIncomingCallFrom:(NSString *) from withUUID:(NSUUID *)uuid completion:(nullable void (^)(NSError *_Nullable error))completion
{
    CXHandle *callHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:from];
    CXCallUpdate *callUpdate = [[CXCallUpdate alloc] init];

    callUpdate.remoteHandle = callHandle;
    callUpdate.supportsDTMF = YES;
    callUpdate.supportsHolding = NO;
    callUpdate.supportsGrouping = NO;
    callUpdate.supportsUngrouping = NO;
    callUpdate.hasVideo = NO;

    NSLog(@"income uuid here for income call %@",uuid);

    [self.callKitProvider reportNewIncomingCallWithUUID: uuid update:callUpdate completion:^(NSError *error) {
        if (!error) {
            NSLog(@"Incoming call successfully reported.");
        } else {
            NSLog(@"Failed to report incoming call successfully: %@.", [error localizedDescription]);
        }

        completion(error);
    }];
}

有时我没有得到背景的推动。

我想知道我的上述方法是否正确。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-28 11:58:39

在这种情况下,直接调用completion()或检查它以前是否不是nil,这是等价的,因为completion已被声明为nonnull

因此,您可以直接调用completion(),如果您有问题,这并不是因为这一点。

票数 1
EN

Stack Overflow用户

发布于 2021-10-22 17:25:53

虽然如果您检查completion()并不重要,因为它是nonnull -我看到了代码的另一个问题,这可能导致VOIP推送没有交付。

您应该从completion()提供程序完成块内部调用CallKit。它通知系统您完成了VOIP推送处理并调用了CallKit。

但是,您可以通过通知CallKit异步调用它,因此可能会出现一个竞争条件,因为您的内部有多个NSLog()调用。如果在通知CallKit传入呼叫之前调用推送处理完成块--从iOS 13开始,系统很可能会杀死您的应用程序。

正确的方法如下:

代码语言:javascript
代码运行次数:0
运行
复制
- (void)pushRegistry:(PKPushRegistry *)registry  didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type withCompletionHandler:(nonnull void (^)(void))completion
{

    NSDictionary *payloadDict = payload.dictionaryPayload[@"aps"];           

    [self reportIncomingCallFrom:callerName withUUID:self.uuidCallkit completion:^(NSError * _Nullable error) {
        
        completion();

    }];

}

我还会在调用完成块之后将调用移动到NSLog()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59067692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档