原創分析:iOS 中使用 Mobile Installation 安裝 IPA(使用iTunes/AppStore一樣的安裝API)

來源:互聯網
上載者:User

原文:http://www.yonsm.net/post/553

iOS 中要安裝一個程式,從使用者角度看有幾種三:

1. 類似 Cydia 這種 DEB 的方式:直接安裝到 /Applications 作為系統的APP,無法長按刪除(不討論CyDelete)。

2. 類似 UCWEB/Installous 的偽 IPA 的方式:直接解包 IPA (實際上就是 ZIP),類比官方 IPA 的安裝方式。可以理解為黑箱測試這種只管結果的模式。這個安裝方式可以說是知其表而不知其裡,會有N多問題,標可能無法重新整理、IPA無法同步回 iTunes 等問題。從這個角度說,我個人不推薦大家使用 UCWEB 下載安裝 IPA,也不推薦使用 Installous。

3. 官方支援的 AppStore/iTunes 安裝 IPA 的模式:這就是我這裡要說的 Mobile Installation Framework 的方式,這是最官方、最安全、最完美的安裝 IPA 的方式。目前已知、同步推/iFunBox/iFanBox/iTools都是使用這幾種方式(其中 iFanBox 應該是在我和我交流之後才搞定這個:)

Mobile Installation 是 iOS 中負責安裝 IPA 的 Framework,,通過 IDA 分析 /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/PrivateFrameworks/MobileInstallation.framework/MobileInstallation
可知它匯出了以下 API:

Name Address Ordinal

—- ——- ——-

_MobileInstallationArchive 00000F80

_MobileInstallationBrowse 00000FE0

_MobileInstallationCheckCapabilitiesMatch 00000BE0

_MobileInstallationCopySafeHarbors 00000CA4

_MobileInstallationInstall 00001144

_MobileInstallationLookup 00001034

_MobileInstallationLookupArchives 00000E70

_MobileInstallationProcessRestoredContainer 00000E10

_MobileInstallationRegisterSafeHarbor 00000D58

_MobileInstallationRemoveArchive 00000EC0

_MobileInstallationRemoveSafeHarbor 00000CF4

_MobileInstallationRestore 00000F20

_MobileInstallationSetDeviceCapabilities 00000C40

_MobileInstallationUninstall 00001084

_MobileInstallationUpgrade 000010E4

__MobileInstallationRebuildMap 00000B90

其中有兩個 API 是非常有用的:

_MobileInstallationInstall:安裝 IPA

_MobileInstallationLookup:列出已安裝的 IPA

直接貼 MobileInstallationInstall 分析結果了,分析過程看前面幾期:)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21
//
typedef int (*MobileInstallationInstall)(NSString *path, NSDictionary *dict, void *na, NSString *path2_equal_path_maybe_no_use);

IPAResult IPAInstall(NSString *path)
{

    void *lib = dlopen("/System/Library/PrivateFrameworks/MobileInstallation.framework/MobileInstallation",
RTLD_LAZY);

    if (lib)

    {

        MobileInstallationInstall pMobileInstallationInstall = (MobileInstallationInstall)dlsym(lib, "MobileInstallationInstall");

        if (pMobileInstallationInstall)

        {

            NSString *name = [@"Install_" stringByAppendingString:path.lastPathComponent];

            NSString* temp = [NSTemporaryDirectory() stringByAppendingPathComponent:name];

            if (![[NSFileManager defaultManager] copyItemAtPath:path
toPath:temp error:nil]) return IPAResultFileNotFound;


            int ret = (IPAResult)pMobileInstallationInstall(temp, [NSDictionary dictionaryWithObject:@"User" forKey:@"ApplicationType"], 0,
path);

            [[NSFileManager defaultManager] removeItemAtPath:temp
error:nil];

            return ret;

        }

    }

    return IPAResultNoFunction;
}

補充一下,之所以要拷貝IPA是因為安裝IPA後可能被刪除。如果安裝IPA可以刪除無所謂則不需要拷貝到一個新地方。

詳細代碼,請郵件索取 Yonsm@msn.com。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.