ios黑科技之實現91助手的效果(app內下載並安裝另一個app)
今天分享一個非常牛逼,非常裝逼的黑科技--ios應用內下載並安裝另一個應用,中間不需要經過appstore。
其實這個技術,就是我們實現91助手或者同步推的效果,他們也可以在他們的應用里面下載並安裝其他的app。
下面教程分兩步走
第一步,自動下載並安裝另一個app,中間不需要經過appstore
第二步,基於第一步,實現和91助手、同步推一模一樣,自己管理下載和安裝(支持斷點續傳、下載管理器等)
不過這個技術並不可以上線appstore(91助手和同步推那些也沒有上線appstore)。
除非你是像同步推類型的公司,否則這個技術只是用來裝逼。
學這個技術前,首先要知道itms-services協議,這個技術是基於itms-services協議的。
itms-services:學名叫:OTA (Over The Air) 空中下載,是Apple在 iOS4 中新加的一項技術,目的是讓開發者能夠脫離Appstore,實現從自己的服務器下載並安裝iOS應用。簡單地說,就是用戶只需要在Safari中點開一條鏈接,就能直接在主界面中安裝App,不需要通過App Store。
當然,這里面還涉及到蘋果簽名之類的東西,大家就自行百度了,這里就不解釋了。
這里的演示,我就直接通過蘋果簽名過的ipa進行演示,大家也可以像我這樣做,就不用自己弄簽名這么復雜了。
下面詳細介紹怎么做
1 首先我們要獲取已經簽名的ipa文件,在mac里面打開itunes,點搜索,下面我搜索 git,以這個app為例,點擊獲取。

2 輸入你的appid 和 密碼
3 下載后,在資料庫里面找到 剛剛的app,右鍵點擊 在Finder顯示



4 好了,ipa下載下來了,而且這個ipa已經通過了簽名(你的appid已經有這個ipa的使用權了)
5 接下來把ipa上傳到 7牛里面,

6 然后編寫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>items</key> <array> <dict> <key>assets</key> <array> <dict> <key>kind</key> <string>software-package</string> <key>url</key> <string>http://xxx.xxx.com/xxxx.ipa</string> </dict> </array> <key>metadata</key> <dict> <key>bundle-identifier</key> <string>請填上你的開發者證書用戶名</string> <key>bundle-version</key> <string>版本</string> <key>kind</key> <string>software</string> <key>title</key> <string>請填上標題</string> </dict> </dict> </array> </dict> </plist>
7 把plist文件上傳的GitHub,然后點擊GitHub的

8 最后一步,手機safari通過itms-services協議下載,在手機safari 輸入
itms-services://?action=download-manifest&url=https://raw.githubusercontent.com/xxxx/xxxx.plist
url后面就是剛剛在GitHub的plist鏈接
下載成功。並且可以成功運行。
剛剛上面的流程是這樣做

第一步完成了,總結一下:
上面的演示簡單來說,就是只要用戶在appstore下載過這個app,就有這個app的使用權(簽名)
我們之后進行itms-services下載的ipa文件,就可以直接使用
如果這個ipa文件我們沒有使用權(沒有簽名)
那么這個app打開的時候就會不停的要我們輸入appid和密碼
就算輸入對了也沒有反應(以前直接是閃退,不允許使用)
原因是蘋果檢查到你的appid沒有這個ipa的使用權(簽名)。
下面開始牛逼的第二步教程:
你會發現,上面的下載是跟appstore一樣的,他會在你手機的桌面直接進行下載,並且下載完之后直接進行自動安裝。
但這樣,我們就無法管理下載了(雖然用私用api可以查看,不過這種辦法不好用)
如果我想實現像91助手那樣的功能,可以用下載管理器去管理 每個ipa包的下載,可以暫停,可以繼續,支持斷點續傳,可以控制ipa下載后是否要安裝,自己可以選擇ipa安裝包的安裝后是否刪除。
那么繼續往下看
在上面第六點那里,其實plist里面的ipa路徑,系統是幫我自動 下載-安裝,**那如果我已經下載好了呢? 是不是就不用下載,直接幫我安裝呢?
沒錯,如果已經下載好了,那么系統會幫我們直接安裝 **

然后我們會有個思路,能不能先把網盤的ipa下載好
然后把plist里面的url換成我們沙盒的地址呢?
然后系統檢測到沙盒的ipa已經下載好了,那么就可以從沙盒直接安裝。
想法是對的,不過直接換成沙盒的話,我試過,是不行的
原因是ios8開始,沙盒的地址每次都會隨機生成的,而且就算寫了沙盒地址,前面的協議規定一定要http
所以不可以直接寫沙盒地址。
既然不允許訪問沙盒,又只可以訪問http,那我訪問自己的ip不就可以了嗎。
**沒錯,訪問自己的ip
像這樣 http://127.0.0.1/xxx.ipa **
所以我們自己在程序里面做一個虛擬http服務器,訪問本機的ip就等於訪問本機的沙盒。
具體流程圖如下:

好的,有了想法之后,接下來就是實現了
流程1 在源碼里面有虛擬的http服務器,可以直接用
流程2 源碼里面封裝好,可以設置ipa路徑,可以設置成你們的網盤路徑
流程3 源碼里面封裝好,可以設置https的plist路徑,可以設置成你們的路徑
流程4 以下是plist文件,其中url那里改成http://127.0.0.1:10001/xxxx.ipa 注意端口要和源碼里面的虛擬服務器端口一致
流程5 下載好之后會提示安裝
<?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>items</key> <array> <dict> <key>assets</key> <array> <dict> <key>kind</key> <string>software-package</string> <key>url</key> <string>http://127.0.0.1:10001/xxxx.ipa</string> </dict> </array> <key>metadata</key> <dict> <key>bundle-identifier</key> <string>com.www.m2m</string> <key>bundle-version</key> <string>4.5.6</string> <key>kind</key> <string>software</string> <key>title</key> <string>pinglide</string> </dict> </dict> </array> </dict> </plist>
下面附上我的源碼,里面已經包含下載管理器和虛擬服務器等
https://github.com/lovelyjune/DownloadAndInstallIpa
源碼介紹:
實現和91助手、同步推的效果
已經封裝好下載管理器,可以用下載管理器去管理 每個ipa包的下載
下載可以暫停,可以繼續
支持斷點續傳(就算退出app,下次進入app依然保持上次的斷點續傳)
支持后台下載(按home鍵出去桌面之后依然保持下載)
支持設置最大並行下載數(默認是3個同時下載)
可以控制ipa下載后是否要安裝
自己可以選擇ipa安裝包是否刪除
使用說明:
1.快速添加一個下載ipa任務
[[DownloadManager manager] addDownloadTaskWithUrl:@"http://xxxx.com/xxxx.ipa" andPlistUrl:@"https://raw.githubusercontent.com/xxxxx/xxxxx.plist" andGameName:@"xxxxx" andGameId:@"xxxxx" andType:@"ipa"];
2.下載過程中,進度的監聽,我是直接返回任務數組的數據源,可以通過數組里面的OneDownloadItem 獲取每個任務
[[DownloadManager manager] progressBlock:^(NSArray *allModelArr){}];
3.下載完成后的監聽,返回是單個任務的完成回調
[[DownloadManager manager] completeBlock:^(OneDownloadItem *oneItem) {}];
ps:我里面的虛擬服務器端口默認設置成10001,你可以按需自定義,直接用我的源碼可以下載ipa,不過你們安裝不到,因為你們appid沒有得到app的簽名(使用權),所以記得跟着我上面第一步的教程走一下,就可以安裝了
感謝第三方插件HTTPServer、MJExtension
歡迎star
原創文章,不允許轉載
參考
http://www.cnblogs.com/star91/p/5018995.html
http://stephen830.iteye.com/blog/2101884
http://blog.sina.com.cn/s/blog_5f19ccb10101da5m.html
小禮物走一走,來簡書關注我