我想为越狱设备编写一个调整来阻止来自电话号码的消息(在iOS 7中)。首先,我在this link中使用了creker的第二个答案来编写调整。这是我的代码:
#import <substrate.h>
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <libkern/OSAtomic.h>
#import "CTMessage.h"
#import "CTMessageCenter.h"
id(*_processReceivedMessage_orig)(id, SEL, CTMessage*) = NULL;
id _processReceivedMessage_hooked(id self, SEL _cmd, CTMessage* msg);
%hook IMDService
-(void)loadServiceBundle:(NSBundle*)bundle
{
if ([[bundle bundleIdentifier] isEqualToString:@"com.apple.SMSPlugin"] && [bundle isLoaded]) // not sure if the bundle identifier is correct!
{
MSHookMessageEx(objc_getClass("SMSServiceSession"),
@selector(_processReceivedMessage:),
(IMP)_processReceivedMessage_hooked,
(IMP*)&_processReceivedMessage_orig);
}
}
%end
id _processReceivedMessage_hooked(id self, SEL _cmd, CTMessage* msg)
{
NSObject<CTMessageAddress>* phonenumber = [msg sender];
NSString *senderNumber = (NSString*) [phonenumber canonicalFormat]; // sender number
if ([senderNumber isEqualToString:@"+012345678910"])
[[CTMessageCenter sharedMessageCenter] acknowledgeIncomingMessageWithId:[msg messageId]];
else
return _processReceivedMessage_orig(self, _cmd, msg);
}
和我的plist文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Filter</key>
<dict>
<key>Bundles</key>
<array>
<string>com.apple.imagent</string>
</array>
</dict>
</dict>
</plist>
主要问题是loadServiceBundle
永远不会被钩住,我的函数永远不会被调用!如果我在iPhone上安装调整,当移动设备有传入的短信和消息警报时,没有任何反应。我自己认为问题是我正在为iOS 7编写,但问题是适用于iOS 6.如果问题是这样,你能告诉我该怎么办?
我的另一个问题是loadServiceBundle
方法。正如您在书面代码中看到的那样,我不知道应该过滤哪个包标识符。如果我选择了正确的捆绑标识符,请告诉我。
如果我的代码中有任何其他问题,我很乐意告诉我。
答案 0 :(得分:0)
com.apple.imservice.sms
。我发布了短信服务目录路径(/System/Library/Messages/PlugIns/SMS.imservice/
)。在那里,您可以找到包含插件的包ID的Info.plist
- com.apple.imservice.sms
。IMDService -(void)loadServiceBundle
,没有参数。然后,您可以使用[[self bundle] bundleIdentifier]
来获取捆绑ID。另外,在挂钩loadServiceBundle
之前不要忘记调用_processReceivedMessage:
的原始实现,甚至检查bundle id。原始实现实际上加载了插件,所以调用它应该是你做的第一件事。