IOS開發基礎知識--片段41,ios基礎知識--41
1:UIWebView載入本地的HTML
NSString *path = [[NSBundle mainBundle] bundlePath];NSURL *baseURL = [NSURL fileURLWithPath:path];NSString * htmlPath = [[NSBundle mainBundle] pathForResource:@"index1" ofType:@"html"];NSString * htmlCont = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];[self.webView loadHTMLString:htmlCont baseURL:baseURL];
注意:如何建立工程內的Css,js,html檔案,建立iOS -other-Empty 如果Css 則以.css結尾,Js則以.js結尾,Html則是以.html結尾
2:JSPatch的運用
a:OC轉JSPatch的地址:http://bang590.github.io/JSPatchConvertor/
b:JSPatch指令碼介紹地址:https://github.com/bang590/JSPatch/wiki
c:比較不錯的文章地址:ww.cnblogs.com/dsxniubility/p/5080875.html
d:JSPatch自動補地址:https://github.com/bang590/JSPatchX
注意版本控制(可以根據APP的版本號碼架服務端的請求地址)跟JS安全性(MD5加密然後再APP解密);
管理中心的一些考慮:
下面分享一個協助類:
#import "JSPatchHelper.h"//檔案名稱NSString * const jsPatchJsFileName=@"main.js";@implementation JSPatchHelper+ (instancetype)sharedInstance{ static JSPatchHelper* instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [JSPatchHelper new]; }); return instance;}+(void)HSDevaluateScript{ //從本地擷取下載的JS檔案 NSURL *p = FilePath; //判斷檔案是否存在 NSString *curFilePath=[p.path stringByAppendingString:[NSString stringWithFormat:@"/%@",jsPatchJsFileName]]; if (![[NSFileManager defaultManager] fileExistsAtPath:curFilePath]) { return; } //擷取內容 NSString *js = [NSString stringWithContentsOfFile:curFilePath encoding:NSUTF8StringEncoding error:nil]; //如果有內容 if (js.length > 0) { //------- //服務端要對JS內容進行加密,在此處解密js內容;增加安全性 //---- //運行 [JPEngine startEngine]; [JPEngine evaluateScript:js]; }}+(void)loadJSPatch{ //最佳化間隔一段時間 再去請求一次 否則太頻繁(這邊定義為一個小時才去請求一次) NSDate *myNowDate=[NSDate date]; if (!BBUserDefault.MBJsPatchTime) { BBUserDefault.MBJsPatchTime=myNowDate; return; } if ([myNowDate timeIntervalSinceDate:BBUserDefault.MBJsPatchTime]<3600) { return; } //使用AFNetWork下載在伺服器的js檔案 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; NSURL *URL = [NSURL URLWithString:kJSPatchServerPath]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response; if (httpResponse.statusCode==200) { NSURL *documentsDirectoryURL = FilePath; //儲存到本地 Library/Caches目錄下 return [documentsDirectoryURL URLByAppendingPathComponent:jsPatchJsFileName]; } else { return nil; } } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { NSLog(@"下載失敗 to: %@", filePath); }]; [downloadTask resume];}@end
詳細的原始碼可以到:https://github.com/wujunyang/MobileProject查看
3:認證快要到期問題
第一步:如果開發人員認證到期了的話,首先,開啟密鑰中心,產生一個CSR(認證請求)。然後,到Apple Center把認證revoke,然後建立一個,建立的將會預設是剛剛revoke的認證的所有設定的。把下載回來的認證匯出一份p12格式的儲存起來(因為如果其他人需要的時候,只能跟你拿了,在Apple Center下載的用不了的。)然後去provision profile edit 一下,從新下載,替換掉原來的。你就可以繼續開發了(對外面已經安裝的使用者不會有影響)。
第二步:安裝新的p12認證,並下載修改後的描述檔案,如果本地已經安裝以後的provisioning profile要先進行刪除,可以進入~/Library/MobileDevice/Provisioning Profiles ,找到相應的檔案進行刪除,因為在檔案裡面它是以一串字元為命名,可以把舊認證先刪除然後在Xcode裡面打包,它會有提示這個provisioning profile的名字,刪除就可以;然後在進行安裝最新的provisioning profile,並選擇相應認證就可以了;
4:給項目建立檔案都預設增加首碼
5:iOS遠程推送知識點
我們的裝置連網時(無論是蜂窩連網還是Wi-Fi連網)都會與蘋果的APNs伺服器建立一個長串連(persistent IP connection),當Provider(我們自個的後台伺服器,用於推送)推送一條通知的時候,這條通知並不是直接推送給了我們的裝置,而是先推送到蘋果的APNs伺服器上面,而蘋果的APNs伺服器再通過與裝置建立的長串連進而把通知推送到我們的裝置上(參考圖1-1,圖1-2)。而當裝置處於非連網狀態的時候,APNs伺服器會保留Provider所推送的最後一條通知,當裝置轉換為連網狀態時,APNs則把其保留的最後一條通知推送給我們的裝置;如果裝置長時間處於非連網狀態下,那麼APNs伺服器為其儲存的最後一條通知也會丟失。Remote Notification必須要求裝置連網狀態下才能收到,並且太頻繁的接收遠程推播通知對裝置的電池壽命是有一定的影響的。
deviceToken的產生:當一個App註冊接收遠程通知時,系統會發送請求到APNs伺服器,APNs伺服器收到此請求會根據請求所帶的key值產生一個獨一無二的value值也就是所謂的deviceToken,而後APNs伺服器會把此deviceToken封裝成一個NSData對象發送到對應請求的App上。然後App把此deviceToken發送給我們自己的伺服器,就是所謂的Provider。Provider收到deviceToken以後進行儲存等相關處理,以後Provider給我們的裝置推播通知的時候,必須包含此deviceToken
遠程推送內容
每一條通知的訊息都會組成一個JSON字典對象,其格式如下所示,樣本中的key值為蘋果官方所用key。自訂欄位的時候要避開這些key值。
{ "aps" : { "alert" : { // string or dictionary "title" : "string" "body" : "string", "title-loc-key" : "string or null" "title-loc-args" : "array of strings or null" "action-loc-key" : "string or null" "loc-key" : "string" "loc-args" : "array of strings" "launch-image" : "string" }, "badge" : number, "sound" : "string" "content-available" : number; "category" : "string" },}aps:推送訊息必須有的keyalert:推送訊息包含此key值,系統就會根據使用者的設定展示標準的推送資訊badge:在app表徵圖上顯示訊息數量,缺少此key值,訊息數量就不會改變,消除標記時把此key對應的value設定為0sound:設定推送聲音的key值,系統預設提示聲音對應的value值為defaultcontent-available:此key值設定為1,系統接收到推送訊息時就會調用不同的回調方法,iOS7之後配置後台模式category:UIMutableUserNotificationCategory's identifier 可操作通知類型的key值title:簡短描述此調推送訊息的目的,適用系統iOS8.2之後版本body:推送的內容title-loc-key:功能類似title,附加功能是國際化,適用系統iOS8.2之後版本title-loc-args:配合title-loc-key欄位使用,適用系統iOS8.2之後版本action-loc-key:可操作通知類型key值,不詳細敘述loc-key:參考title-loc-keyloc-args:參考title-loc-argslaunch-image:點擊推送訊息或者移動事件滑塊時,顯示的圖片。如果缺少此key值,會載入app預設的啟動圖片。
當然以上key值並不是每條推送訊息都必帶的key值,應當根據需求來選擇所需要的key值,除了以上系統所提供的key值外,你還可以自訂自己的key值,來作為訊息推送的負載,自訂key值與aps此key值並列。如下格式:
{ "aps" : { "alert" : "Provider push messag.", "badge" : 9, "sound" : "toAlice.aiff" }, "Id" : 1314, // 自訂key值 "type" : "customType" // 自訂key值}
指定使用者的推送
對於要求使用者登入的App,推送是可以指定使用者的,同一條推送有些使用者可以收到,但是有些使用者又不能收到。說起來這個就要提到另外的一個token了,一般稱之為userToken,userToken一般都是根據自己公司自訂的規則去產生的。userToken是以使用者的帳號加對應的密碼產生的。這樣結合上面提到的deviceToken,就可以做到根據不同的使用者推送不同的訊息。deviceToken找到對應某台裝置和該裝置上的應用,而userToken對應找到該使用者。用戶端在上報deviceToken的時候,要把userToken對應一起上報給服務端也就是Provider。