mojave 不提示用户访问联系人
mojave not prompting user for access to Contacts
我有一个在 10.9 及更高版本上 运行s 的 macOS 应用程序,它允许用户 "lookup" 他们联系人(又名地址簿)中的人,例如:
[ABAddressBook 共享地址簿]
在 10.14 之前的版本中使用过我的应用程序的用户已经在我的应用程序的 TCC 数据库中有一个条目,并且可以按预期在安全和隐私中打开和关闭联系人访问。
在 10.14 中首次 运行 应用程序的新用户不会收到是否允许访问的提示。我已经阅读了所有有关 Mojave 中隐私更改的信息,但据我所知,对联系人的访问权限并没有改变......或者是吗?有没有办法强制提示?
更新:
出于好奇,我使用 "new"(与 ABAddressBook 相比)联系人框架添加了以下代码,但我仍然无法获得要求允许我的应用程序权限的弹出窗口。
if ([CNContactStore class]) {
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
NSLog(@"haveAccessToContacts: authorizationStatus-%ld", status);
if (status == CNAuthorizationStatusAuthorized)
return 1;
CNContactStore *contactStore = [[CNContactStore alloc] init];
[contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
NSLog(@"Contacts request granted: %@", granted ? @"YES" : @"NO");
if (error)
NSLog(@"error: %@", error);
}];
return 2;
} else {
ABAddressBook *newAB = [ABAddressBook sharedAddressBook];
if (newAB != nil)
return 1;
}
return 0;
输出为:
已批准联系人请求:否
错误:错误域=CNErrorDomain 代码=100 "Access Denied" UserInfo={NSLocalizedDescription=拒绝访问,NSLocalizedFailureReason=此应用程序未被授予访问联系人的权限。
应用名称仍然没有出现在安全和隐私中
检查您的 info.plist 是否包含请求联系人权限的密钥。
如果缺少,请将其包含在您的应用中 info.plist
<key>NSContactsUsageDescription</key>
<string>This app requires contacts access to function properly.</string>
将消息字符串更改为更适合您的情况。
检查应用沙箱权限:
不要忘记在 Info.plist
中按以下键
<key>NSContactsUsageDescription</key>
<string>This app requires contacts access to function properly.</string>
我有一个在 10.9 及更高版本上 运行s 的 macOS 应用程序,它允许用户 "lookup" 他们联系人(又名地址簿)中的人,例如: [ABAddressBook 共享地址簿]
在 10.14 之前的版本中使用过我的应用程序的用户已经在我的应用程序的 TCC 数据库中有一个条目,并且可以按预期在安全和隐私中打开和关闭联系人访问。
在 10.14 中首次 运行 应用程序的新用户不会收到是否允许访问的提示。我已经阅读了所有有关 Mojave 中隐私更改的信息,但据我所知,对联系人的访问权限并没有改变......或者是吗?有没有办法强制提示?
更新: 出于好奇,我使用 "new"(与 ABAddressBook 相比)联系人框架添加了以下代码,但我仍然无法获得要求允许我的应用程序权限的弹出窗口。
if ([CNContactStore class]) {
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
NSLog(@"haveAccessToContacts: authorizationStatus-%ld", status);
if (status == CNAuthorizationStatusAuthorized)
return 1;
CNContactStore *contactStore = [[CNContactStore alloc] init];
[contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
NSLog(@"Contacts request granted: %@", granted ? @"YES" : @"NO");
if (error)
NSLog(@"error: %@", error);
}];
return 2;
} else {
ABAddressBook *newAB = [ABAddressBook sharedAddressBook];
if (newAB != nil)
return 1;
}
return 0;
输出为: 已批准联系人请求:否
错误:错误域=CNErrorDomain 代码=100 "Access Denied" UserInfo={NSLocalizedDescription=拒绝访问,NSLocalizedFailureReason=此应用程序未被授予访问联系人的权限。
应用名称仍然没有出现在安全和隐私中
检查您的 info.plist 是否包含请求联系人权限的密钥。 如果缺少,请将其包含在您的应用中 info.plist
<key>NSContactsUsageDescription</key>
<string>This app requires contacts access to function properly.</string>
将消息字符串更改为更适合您的情况。
检查应用沙箱权限:
不要忘记在 Info.plist
中按以下键<key>NSContactsUsageDescription</key>
<string>This app requires contacts access to function properly.</string>