1. 程式人生 > >iOS程式設計師混合開發問題記錄

iOS程式設計師混合開發問題記錄

先容我用文字吐槽下我們哩得(Leader :領導)

作為一個iOS開發,專案已經寫了一年,真尼瑪感覺蛋疼,好無語有沒有,好想吐槽專案經理,產品經理,高高在上的老總!想啥呢,都一年了,就算專案某些功能沒定下來,咱們就不能拐個歪想別的嗎?

這個專案我們iOS和Android只是簡單的外殼,裡面大部分功能是H5來寫的,iOS和Android做了離線快取、清除快取、呼叫相機相簿、聯絡人(系統都有我們寫)、與h5的互動、分享、推送等,因為我們寫的不多,基本都是在等前端那邊。

問:為什麼你們寫這麼少,答:專案經理開會時明確表明,功能能由前端做就用前端! 我們自然很開心,但是進度真的很慢

海燕吶,你就上點心吧!這都多久了,給大夥緊緊發條吧~~~這樣專案做下來真的很累,心累啊!

本人程式設計師,話也不多!接著記錄下自己遇到的問題吧,雖不是什麼大問題,好記性真不如爛筆頭,況且我記性真不好!

上面也說到了我大概都寫了什麼功能一個一個記錄吧

在做離線快取的時候用的是NSURLProtocol,當時想著uiwebview載入的就是URL,應該不難吧,但是,我在這鼓弄了好幾周!原因是H5這框架,在每個路由後面都加了版本號與時間戳,版本號應該是框架的版本號,但是你為什麼加時間戳呢,我翻看了框架的程式碼,發現程式碼註釋上的意思是框架帶快取,應該是隻支援線上快取,離線快取沒有。加時間戳可能是為了快取吧,但是當時我做快取的時候不知道,親眼看著快取檔案都在,快取也成功了,但是斷網死活不出來,度娘快問爛了,別人的程式碼也看了很多遍,感覺就是沒問題。最後問了技術總監,說你看看斷網下拿快取檔案的路徑對不對,也試了,沒問題!,額~~基本想放棄了,但實在沒招了,也不能不做快取啊,開始看H5框架,發現了時間戳與版本號,試著把.CSS   .JS等後面的全部截掉,然後。。然後。。然後快取介面出來了,我擦,當時把我激動的不要不要的!真的很激動。事後總結了下,是我意志不堅定,心不在焉,做事堅持不住!其實這個問題不是很難,重點是發現問題所在,當時要是多看幾眼控制檯列印的東西,就不用花費這麼多時間了。但現在快取還是有點問題,快取就是把你瀏覽過的儲存下來,但是我在斷網前沒做過某個操作,在斷網的時候我要做這個操作就會行不通,測試提了這個問題,我還不確定怎麼弄!

清除快取這個基本不用說了吧,就是把存快取檔案的資料夾清空就OK了,我快取做的是快取整個工程,沒單單快取圖片或是別的!快取檔案過期時間,我是清除快取的時候儲存個時間,當時間>24小時就呼叫清除快取。恩~~~ 大概就這樣。這裡記錄下,H5開發的時候會用到本地儲存一些東西,一些小資料!好像是用的storage,然後快取的時候會把storage這個檔案也儲存到了caches資料夾裡,記住,storage檔案不能刪除,反正我刪除後發現,再次開啟應用,引導頁出來了,登入狀態也改為了未登入!

調系統的功能網上一大堆,這裡無非就是用到了互動,給H5開個介面,他們呼叫就OK了,我在接口裡面把要實現的東西寫好。

互動用的就是JavaScriptCore,新增系統庫,實現JSExport協議的協議,然後寫介面,你寫好的介面名和H5寫的介面名要絲毫不差,不然就呼叫失敗,定物件,搭橋!我就不想多寫了,網上寫的比我詳細多了,就算我寫了也是吧 別人的搬過來的,畢竟口才不好,

分享沒什麼好說的,有demo,整合跟著一步步走OK了,

推送用的是極光,這裡需要記錄下,這是應用未開啟的處理方法,建立個通知中心,在需要實現的controller接收這個通知,然後跳轉到相應頁面

didFinishLaunchindidFinishLaunchingWithO

if (launchOptions) {
        NSDictionary * remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        //這個判斷是在程式沒有執行的情況下收到通知,點選通知跳轉頁面
        if (remoteNotification) {
            NSLog(@"appdelegate未開啟應用推送訊息==== %@",remoteNotification);
            //建立一個訊息物件
            NSNotification * notice = [NSNotification notificationWithName:@"RootViewController" object:nil userInfo:remoteNotification];
            //傳送訊息
            [[NSNotificationCenter defaultCenter]postNotification:notice];
            
        }
    }
//添加當前類物件為一個觀察者,接收應用未開啟情況下收到的通知
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(notice:)
                                                 name:@"RootViewController"
                                               object:nil];
-(void)notice:(NSNotification *)sender{
    
    NSLog(@"未開啟應用收到的推送訊息:%@",sender);
    NSString *urlSs = [sender.userInfo objectForKey:@"url"];
    
    ViewController *vi1 = [[ViewController alloc]init];
    vi1.urlString = urlSs;
    [self presentViewController:vi1 animated:YES completion:nil];
    
}

一種應用已經開啟,但是在後臺執行

一種正在使用應用時收到推送訊息,用提醒框來做的

//極光訊息接收方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    [JPUSHService handleRemoteNotification:userInfo];
    NSLog(@"收到通知:%@", [self logDic:userInfo]);
    
    [application setApplicationIconBadgeNumber:0];
    if (application.applicationState == UIApplicationStateActive) {
        NSString *alertStr = [userInfo objectForKey:@"url"];
        //APP正在執行時,推送過來訊息的處理
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
                                                        message:alertStr
                                                       delegate:self
                                              cancelButtonTitle:@"取消"
                                              otherButtonTitles:@"檢視訊息",nil];
        [alert show];
        
    } else if (application.applicationState == UIApplicationStateInactive ) {
        
        //APP在後臺執行,推送過來訊息的處理
        [self goToMssageViewController:userInfo];
    }
    
}

- (void)goToMssageViewController:(NSDictionary *)dic{
    
    NSString *urlS = [dic objectForKey:@"url"];
    ViewController *vi = [[ViewController alloc]init];
    vi.urlString = urlS;
    [self.window.rootViewController presentViewController:vi animated:YES completion:nil];
}

極光推送基本就是這三種情況,我簡單試了下,可行!

還有些問題就是H5與我們配合寫的了,像web頁面,解決了鍵盤遮擋輸入框問題,但是鍵盤彈出來,導航欄也跟著頁面往上跑了,想要的效果就是鍵盤彈出來,導航欄不動,也要解決鍵盤遮擋輸入框的問題,Android是解決了,但是iOS怎麼滴都不行,H5的方法在iOS上不能用,目前還在解決中

webview載入一個百度網址,在uiwebview上寫一個按鈕,按鈕放在任意位置,按鈕點選事件裡面寫上self.webview reload; 第一次載入時,斷網載入,走錯誤代理方法,頁面顯示白屏和按鈕,這時候吧網路開啟,確定為有網狀態,點選按鈕,重新載入。。。。。。,webview會吧百度網址加載出來嗎?答案是不會,webview不知道要load什麼URL。這是問題就是你在斷網情況下執行工程,然後重新載入webview失敗的問題,不遇到這問題真的以為會重新載入成功

本人也是正在學習階段的iOS開發工程師,意在記錄自己所遇到的問題,當然如果能幫助到大家我也非常高興,文采有限。。。。不喜勿噴,謝謝!