NSString
ジェイルブレイクされた iOS デバイス用の微調整を書いています。この「bundleID」とコードで作成された整数を plist ファイルに書き込めるようにしたいと考えています。以下のコードはこれを行うことができますが、これを行うのは 1 回だけであり、plist に複数回書き込むことはできません。bundleID が変更され、plist にも書き込まれる必要があるため、これを行いたいと考えています。基本的に私がやりたいことは、アプリが起動されたときに、そのアプリのバンドル ID (com.apple.mobilesafari) が plist のキーとして書き込まれることです。次に、アプリが開かれるたびに値に 1 を追加するコードを作成します。たとえば、モバイル サファリを 4 回開いた場合、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>com.apple.mobilesafari</key>
<integer>4</integer>
<key>customText</key>
<false/>
<key>enabled</key>
<false/>
</dict>
</plist>
ただし、モバイルサファリを4回起動すると、そのままになります...
<key>com.apple.mobilesafari</key> <integer>1</integer>
また、アプリごとに bundleID を保存することも必要です。したがって、サファリを開いてから連絡先を開くと、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>com.apple.mobilesafari</key>
<integer>1</integer>
<key>customText</key>
<false/>
<key>enabled</key>
<false/>
</dict>
<dict>
<key>com.apple.contacts</key>
<integer>1</integer>
<key>customText</key>
<false/>
<key>enabled</key>
<false/>
</dict>
</plist>
これが私のobjective-cコードです...
%hook SBApplicationIcon
-(void)launch
{
// Return original method
%orig;
// Get Bundle ID
NSString* bundleID = [self leafIdentifier];
// Print that badboy!
NSLog(@"Bundle ID: %@ ",bundleID);
// Set up plist
NSMutableDictionary *launches = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/var/mobile/Library/Preferences/com.bengerard.ipslider.plist"];
// Check plist exists
NSString *pathToFile = @"/var/mobile/Library/Preferences/com.bengerard.apppop.plist";
BOOL isFile = [[NSFileManager defaultManager] fileExistsAtPath:pathToFile isDirectory:NO];
if(isFile)
{
// Counting
int count = [[launches objectForKey:bundleID] intValue];
count++;
// Write number of launches to plist
[launches setObject:[NSNumber numberWithInt:count] forKey:bundleID];
//[launches insertObject:[NSNumber numberWithInt:count] forKey:bundleID];
[launches writeToFile:@"/var/mobile/Library/Preferences/com.bengerard.apppop.plist" atomically:YES];
}
else {
//The file doesn't exit.
}
// [bundleID release];
// [pathToFile release];
// [launches release];
}
%end
PS: DHowett の theos も使用して、微調整をコンパイルしています。
編集: 2 つの plist が異なることに気付きました。おそらく私の問題を引き起こしています。後でテストします