我正在使用Callkit扩展来识别数字。我所有的联系人(大约30k +)都存储在Realm中。
我已将Realm文件存储在AppGroup中,可以在我的应用程序及其扩展程序之间共享。
我尝试重新加载扩展程序时收到错误。
错误Domain = com.apple.CallKit.error.calldirectorymanager Code = 7 “(空)”
发生此错误时,呼叫阻止&我的应用的标识显示了一个微调器(当其他应用显示切换到切换时)
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[[CXCallDirectoryManager sharedInstance] reloadExtensionWithIdentifier:@"com.j2x.handheldcontact.CallerID" completionHandler:^(NSError *error){
if(error) {
NSLog(@"CallerID - refresh failed. error is %@",[error description]);
}
}];
}
我发现只有在我尝试使用应用程序组目录中的Realm时才会发生错误。
在我的扩展子类中:
- (void)beginRequestWithExtensionContext:(CXCallDirectoryExtensionContext *)context
{
context.delegate = self;
NSString *appGroupId = @"group.com.j2x.handheldcontact.CallerID";
NSURL *appGroupDirectoryPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:appGroupId];
NSURL *dataBaseURL = [appGroupDirectoryPath URLByAppendingPathComponent:@"default.realm"];
[[[RLMRealm defaultRealm]configuration]setFileURL:dataBaseURL];
RLMResults *temp = [self getContactArray]; //This gives the callKit error
RLMResults *temp ; //This doesn't give any error
[context completeRequestWithCompletionHandler:nil];
}
-(RLMResults *)getContactArray{
RLMResults *res = [[RealmContact allObjects]objectsWithPredicate:[NSPredicate predicateWithFormat:@"phone <> nil or homePhone <> nil or mobilePhone <> nil or altPhone <> nil or fax <> nil"]];
return res;
}
为什么访问Realm数据会出错?谓词格式确实对我来说没问题。
通过一些研究,我发现了以下代码:
public enum Code : Int {
public typealias _ErrorType = CXErrorCodeCallDirectoryManagerError
case unknown
case noExtensionFound
case loadingInterrupted
case entriesOutOfOrder
case duplicateEntries
case maximumEntriesExceeded
case extensionDisabled
@available(iOS 10.3, *)
case currentlyLoading
@available(iOS 11.0, *)
case unexpectedIncrementalRemoval
}
在我的情况下,错误说caselLading(code 7)。我也只在250个联系人的领域试过这个。但我得到了同样的错误。
编辑:
如果我对联系人进行硬编码,它可以正常工作。但如果我把Realm带入场景,那就失败了。
CXCallDirectoryPhoneNumber phoneNumber = strtoull([@"14xxxxxx86" UTF8String], NULL, 0);
if (phoneNumber > 0) {
[context addIdentificationEntryWithNextSequentialPhoneNumber:phoneNumber label:@"Test Test"];
}
解决方法:
现在,我将所有数据存储到一个文件中并将该文件保存在应用程序组中。
NSString *appGroupId = @"group.xxx.CallerID";
NSURL *appGroupDirectoryPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:appGroupId];
NSURL *appFile = [appGroupDirectoryPath URLByAppendingPathComponent:@"contacts.txt"];
BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:[appFile path]];
if(exists) {
[[NSFileManager defaultManager]removeItemAtPath:[appFile path] error:nil];
}
[NSKeyedArchiver archiveRootObject:uniqueCallDirectory toFile:[appFile path]];
并在callID扩展子类中访问此数组。
答案 0 :(得分:0)
您提供给type Car struct {
Type []int
}
var car Car
car.Type = append(car.Type, 12)
car.Type = append(car.Type, 15)
car.Type = append(car.Type, 11)
的列表必须按升序电话号码进行排序。从领域按升序检索列表。 (否则,当您激活扩展程序时,它将中断并保持加载图标)