短信广播与文本正文没有越狱但在IOS的私人框架
我想知道是否有可能获得一个短信广播时,文本进来。我也想检索全身和发件人的信息。 我想知道这是否可能通过私人框架而不越狱。 我不打算出售应用程序,这只是我的个人电话,但我试图避免越狱的猫和鼠标。
这是我怎么做的。 不需要越狱,只有私人的API。
私有API声明
CoreTelephony框架:
extern CFStringRef const kCTMessageReceivedNotification; CFNotificationCenterRef CTTelephonyCenterGetDefault(); void CTTelephonyCenterAddObserver(CFNotificationCenterRef ct, void* observer, CFNotificationCallback callBack, CFStringRef name, const void *object, CFNotificationSuspensionBehavior sb); void CTTelephonyCenterRemoveObserver(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object);
私有IMDP持久性框架:
int IMDMessageRecordGetMessagesSequenceNumber();
私人ChatKit框架: CKDBMessage
可以在这里find
订阅传入的短信通知
CTTelephonyCenterAddObserver(CTTelephonyCenterGetDefault(), NULL, TelephonyObserver, kCTMessageReceivedNotification, NULL, CFNotificationSuspensionBehaviorHold);
从iOS 8开始,您不能通过NULL
通知名称参数来接收所有电话通知。 你必须告诉它你想观察哪个通知,就像达尔文通报中心一样。
callback
void TelephonyObserver(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { if ([(__bridge NSString*)name isEqualToString:(__bridge NSString*)kCTMessageReceivedNotification]) { SmsReceived(); } }
阅读邮件内容
void SmsReceived() { int lastID = IMDMessageRecordGetMessagesSequenceNumber(); CKDBMessage* msg = [[CKDBMessage alloc] initWithRecordID:lastID]; }
我们在这里做什么 收到SMS收到通知后,我们得到SMS数据库( lastID
)中的最后一行ID。 然后用该ID创build消息对象。 msg
将包含所有的消息内容。
使用CKDBMessage
和initWithRecordID:
您可以访问任何SMS数据库logging。 如果行ID没有findinitWithRecordID:
将返回nil。
适用于iOS 7.x – 9.1。 只testing短信,但也应该与MMS一起工作。 用户在评论testing成功iMessages。
iOS 8.3更新
从iOS 8.3开始,如果没有越狱,您将无法收到kCTMessageReceivedNotification
通知。 你需要权利
<key>com.apple.CommCenter.fine-grained</key> <array> <string>spi</string> </array>
iOS 11更新
从iOS 11开始,你不能使用CKDBMessage
。 苹果公司向沙箱添加了另外一个规则,可能需要使用特定的权利来对应用程序进行签名才能使用该API。