我在我的应用程序中使用CallKit。
- (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();
?那么哪一个是正确的?
- (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();
}
这是报告来电的方法。
- (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);
}];
}
有时我没有得到背景的推动。
我想知道我的上述方法是否正确。
发布于 2019-11-28 03:58:39
在这种情况下,直接调用completion()
或检查它以前是否不是nil
,这是等价的,因为completion
已被声明为nonnull
。
因此,您可以直接调用completion()
,如果您有问题,这并不是因为这一点。
发布于 2021-10-22 09:25:53
虽然如果您检查completion()
并不重要,因为它是nonnull
-我看到了代码的另一个问题,这可能导致VOIP推送没有交付。
您应该从completion()
提供程序完成块内部调用CallKit。它通知系统您完成了VOIP推送处理并调用了CallKit。
但是,您可以通过通知CallKit异步调用它,因此可能会出现一个竞争条件,因为您的内部有多个NSLog()
调用。如果在通知CallKit传入呼叫之前调用推送处理完成块--从iOS 13开始,系统很可能会杀死您的应用程序。
正确的方法如下:
- (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()
。
https://stackoverflow.com/questions/59067692
复制