使用Realm

时间:2017-11-23 13:39:30

标签: ios objective-c realm callkit

我正在使用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扩展子类中访问此数组。

1 个答案:

答案 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) 的列表必须按升序电话号码进行排序。从领域按升序检索列表。 (否则,当您激活扩展程序时,它将中断并保持加载图标)