4

アプリを作成しようとすると、Web サーバー ( ipa ファイル) からアプリケーションをダウンロードしてインストールできます。このipaファイルをインストールする方法を知っている人はいますか? アプリ内で OTA を使用するか、コマンド ラインを使用してインストールできますか?

4

2 に答える 2

6

そこで、ジェイルブレイクされたデバイス向けのインスタント ソリューションを紹介します。これにより.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");
于 2013-02-22T15:34:56.157 に答える
2

これは、OTA ディストリビューションを介して行うことができます 。http://help.apple.com/iosdeployment-apps/mac/1.1/#app43ad871eを参照してください。

plist の例は、 https ://gist.github.com/hramos/774468 にあります。

Enterprise Developer Program が必要であるか、ユーザーの UDID を収集してアドホック プロビジョニング プロファイルに含める必要があることに注意してください。

于 2013-02-22T09:16:35.160 に答える