我正在尝试以编程方式更改特定联系人的铃声。它在SO的多个地方说这是不可能的,但是我已经走了很长的路。
到目前为止,我已经找到了想要更改铃声的人的ABRecord。我还发现铃声似乎存储在ABRecord 16号中(未在我知道的任何.h文件中定义)。我通过为文本和语音添加铃声以及文本和语音的振动来手动准备联系人。
以下代码会为联系人重写相同的铃声,如果我运行它,我会看到实际联系人没有变化,设置的铃声仍然存在。
CFTypeRef tones = ABRecordCopyValue(entry, 16);
NSLog(@"%@", tones);
tones = ABMultiValueCreateMutableCopy(tones);
NSLog(@"%@", tones);
ABRecordSetValue(entry, 16, tones, &error);
如果我执行此操作,则会在地址簿应用中删除联系人上的所有铃声信息,尽管看起来这些值实际设置并且即使在重新启动应用后仍然如此。请注意,我在这里写回完全相同的字符串值:
CFTypeRef tones = ABRecordCopyValue(entry, 16);
NSLog(@"%@", tones);
tones = ABMultiValueCreateMutableCopy(tones);
NSLog(@"%@", tones);
ABRecordSetValue(entry, 16, tones, &error);
ABMutableMultiValueRef multiSmsTone = ABMultiValueCreateMutable(kABStringPropertyType);
ABMultiValueAddValueAndLabel(multiSmsTone, (__bridge CFTypeRef)@"<default>", NULL, NULL);
ABMultiValueAddValueAndLabel(multiSmsTone, (__bridge CFTypeRef)@"Alert", NULL, NULL);
ABMultiValueAddValueAndLabel(multiSmsTone, (__bridge CFTypeRef)@"<none>", NULL, NULL);
ABMultiValueAddValueAndLabel(multiSmsTone, (__bridge CFTypeRef)@"Alert", NULL, NULL);
ABRecordSetValue(entry, 16, multiSmsTone, &error);
这是控制台上的输出,错误变量始终为null:
2014-12-18 11:24:02.972 App[2992:1897663] ABMultiValueRef 0x170268f40 with 4 value(s)
0: null (0x19976aba0) - <default> (0x170234420)
1: null (0x19976aba0) - Alert (0x170234400)
2: null (0x19976aba0) - <none> (0x1702343e0)
3: null (0x19976aba0) - Alert (0x1702343c0)
2014-12-18 11:24:02.974 App[2992:1897663] ABMultiValueRef 0x170269000 with 4 value(s)
0: null (0x19976aba0) - <default> (0x170234420)
1: null (0x19976aba0) - Alert (0x170234400)
2: null (0x19976aba0) - <none> (0x1702343e0)
3: null (0x19976aba0) - Alert (0x1702343c0)
2014-12-18 11:24:04.609 App[2992:1897663] ABMultiValueRef 0x174260280 with 4 value(s)
0: null (0x19976aba0) - <default> (0x1000ace70)
1: null (0x19976aba0) - Alert (0x1000ace90)
2: null (0x19976aba0) - <none> (0x1000aceb0)
3: null (0x19976aba0) - Alert (0x1000ace90)
我唯一可以想到的是字符串文字的内存地址在第一个和第二个NSLog中似乎是不变的,但在第三个中它们都是不同的。此外,应用重启之间的第一个值似乎也不同。
听起来合理吗?知道在哪种情况下我可以获得正确的字符串文字吗? 我需要将联系人的短信音调设置为&#34;&lt; none&gt;&#34;。
编辑:似乎有一个名为ABMultiValue的标识符。上述对象的标识符为-2,-102,-1,-101,我可以使用ABMultiValueGetIdentifierAtIndex(tone,0)获取它们,其中0是0-3的索引。当我使用ABMultiValueCreateMutable创建自己的多值时,我得到完全不同的标识符。现在我想我只需要某种黑客来改变多值的标识符。