アプリを作成しようとすると、Web サーバー ( ipa ファイル) からアプリケーションをダウンロードしてインストールできます。このipaファイルをインストールする方法を知っている人はいますか? アプリ内で OTA を使用するか、コマンド ラインを使用してインストールできますか?
2 に答える
そこで、ジェイルブレイクされたデバイス向けのインスタント ソリューションを紹介します。これにより.ipa
、アプリケーション内から任意のファイルを直接インストールできるようになります。実行する必要がある手順は次のとおりです。
I. root アクセス権を取得します。setuid(0);
これは、関数から呼び出すことで実現できますmain()
。実行可能ファイルにスティッキー許可ビットを設定し、起動スクリプトも使用する必要があります。
Ⅱ.ファイルを解凍し.ipa
ます。はい、そうです。IPA は偽装された ZIP ファイルにすぎません。これには、オープンソースのlibzipライブラリを使用できます。
III. Payload
内部と呼ばれるディレクトリがあります。実際のアプリ バンドル ( と呼びましょうMyApp.app
) は、そのフォルダーに存在します。
IV. /var/mobile/Applications
ファイルシステム上のディレクトリにディレクトリを作成します。これは、インストールするアプリのコンテナー サンドボックスになります。慣例により、このディレクトリの名前は UUID にする必要があります。たとえば、次のコード スニペットを使用できます。
CFUUIDRef uuidObj = CFUUIDCreate(NULL);
CFStringRef uuid = CFUUIDCreateString(NULL, uuidObj);
CFRelease(uuidObj);
NSString *appPath = [@"/var/mobile/Applications" stringByAppendingPathComponent:(id)uuid];
[fmgr createDirectoryAtPath:appPath withIntermediateDirectories:YES attributes:nil error:NULL];
CFRelease(uuid);
V. Payload
(手順 II で取得した) ディレクトリの内容をループして、アプリ バンドルを見つけます。新しく作成されたサンドボックス (名前は UUID 文字列) にコピーします。また、 iTunes がアプリの素敵なアイコンを表示し、更新を通知するように、iTunesMetadata.plist
とファイルをコピーします。iTunesArtwork
アプリケーションの実行可能ファイルの権限も修正して、実行可能にします。
NSString *execName = [appInfoPlist objectForKey:@"CFBundleExecutable"];
NSString *execPath = [bundle stringByAppendingPathComponent:execName];
chmod(execPath.UTF8String, 0755);
Ⅵ.SpringBoard にアプリを見つけてから、インストールされたアプリのキャッシュをリロードして、新しくインストールしたアプリのアイコンをホーム画面に表示するように指示する必要があります。このために、最初に MobileInstallation プロパティ リスト ファイル内のアプリケーションのリストを更新します。ここでbundle
変数は、アプリ バンドルのファイル システムの場所を参照します/var/mobile/applications/LONG_UUID_STRING/MyApp.app
。
#define kMobileInstallationPlistPath @"/var/mobile/Library/Caches/com.apple.mobile.installation.plist"
NSMutableDictionary *appInfoPlist = [NSMutableDictionary dictionaryWithContentsOfFile:[bundle stringByAppendingPathComponent:@"Info.plist"]];
[appInfoPlist setObject:@"User" forKey:@"ApplicationType"];
[appInfoPlist setObject:bundle forKey:@"Path"];
[appInfoPlist setObject:@{
@"CFFIXED_USER_HOME" : appPath,
@"HOME" : appPath,
@"TMPDIR" : [appPath stringByAppendingPathComponent:@"tmp"]
} forKey:@"EnvironmentVariables"];
[appInfoPlist setObject:appPath forKey:@"Container"];
NSData *data = [NSData dataWithContentsOfFile:kMobileInstallationPlistPath];
NSMutableDictionary *mobileInstallation = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainersAndLeaves format:NULL error:NULL];
NSString *bundleID = [appInfoPlist objectForKey:@"CFBundleIdentifier"];
[[mobileInstallation objectForKey:@"User"] setObject:appInfoPlist forKey:bundleID];
[mobileInstallation writeToFile:kMobileInstallationPlistPath atomically:NO];
次に、SpringBoard が保存するキャッシュされたアプリ情報を削除します。
remove("/var/mobile/Library/Caches/com.apple.mobile.installation.plist");
remove("/var/mobile/Library/Caches/com.apple.springboard-imagecache-icons");
remove("/var/mobile/Library/Caches/com.apple.springboard-imagecache-icons.plist");
remove("/var/mobile/Library/Caches/com.apple.springboard-imagecache-smallicons");
remove("/var/mobile/Library/Caches/com.apple.springboard-imagecache-smallicons.plist");
remove("/var/mobile/Library/Caches/SpringBoardIconCache");
remove("/var/mobile/Library/Caches/SpringBoardIconCache-small");
remove("/var/mobile/Library/Caches/com.apple.IconsCache");
次に、すべてのアプリケーションのリストをリロードするよう SpringBoard に通知します。
Class __LSApplicationWorkspace = objc_getClass("LSApplicationWorkspace");
[(LSApplicationWorkspace *)[__LSApplicationWorkspace defaultWorkspace] invalidateIconCache:nil];
[(LSApplicationWorkspace *)[__LSApplicationWorkspace defaultWorkspace] registerApplication:[NSURL fileURLWithPath:bundle]];
notify_post("com.apple.mobile.application_installed");
これは、OTA ディストリビューションを介して行うことができます 。http://help.apple.com/iosdeployment-apps/mac/1.1/#app43ad871eを参照してください。
plist の例は、 https ://gist.github.com/hramos/774468 にあります。
Enterprise Developer Program が必要であるか、ユーザーの UDID を収集してアドホック プロビジョニング プロファイルに含める必要があることに注意してください。