短信广播与文本正文没有越狱但在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将包含所有的消息内容。

使用CKDBMessageinitWithRecordID:您可以访问任何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。