2009-07-23 82 views
0

我有一個內容的應用程序,並希望通知用戶使用Apple推送通知服務的新內容,繞過現在很長的App Store提交。一旦用戶收到通知,就會啓用下載更新按鈕。用戶將從我的網站下載一個sql文件和圖像。 sql文件將執行插入語句,圖像將下載到磁盤。通過推送通知服務添加圖像?

我目前加載的內容(字符串和捆綁圖像引用)到UIWebView。圖像顯示爲內容的一部分。我將如何執行sql文件來插入新內容?那麼,我是否還需要開始在磁盤上引用圖像,而不是從包中獲取圖像,這是我在使用App Store更新提交時放置圖像的位置?

對於sql文件,我可以在下載完成後運行一些基於事件的代碼。但是,只讀數據庫需要重新加載才能看到新的內容。用戶是否必須重新啓動應用程序?

回答

0

正如你所說的,數據庫對您的應用程序是隻讀的,我只需要讓APN觸發下載一個新的數據庫文件並將其寫入磁盤,而不必執行SQL語句來修改現有數據庫。 (除非你的數據庫非常大,而且你只是做一個小小的改變,當下載的大小是一個考慮因素)。

在任何情況下,如果從包中加載數據庫,它將是隻讀的,因此您無法在其上執行插入語句 - 您需要創建一個可寫副本。讓更新過程完全替代此副本意味着您不必擔心每個設備上的SQL執行正確。例如如果應用程序終止插入,會發生什麼情況?

同樣,對於圖像來說,如果它們在第一次啓動時被複制到可寫圖像目錄而不是從包中加載,那麼您的生活會更容易,因此您總是在同一個地方看它們,並且不在乎是否存在是一個更新。只需確保在更新之後清理了不再需要的任何內容,這樣就不會讓用戶的存儲空間超出您的需求。

0

當然,你可以這樣做。

  • 你添加一些自定義字段中的推送通知的有效載荷,在我的情況, 了「的msgId」可以現場需要。

    $body = array(); 
    $body['device_tokens'] = str_replace(' ', '', $_REQUEST["Token"]); 
    $body['msgId'] = $MP_ID; 
    $body['aps'] = array('alert' => $alertShort); 
    $payload = json_encode($body); 
    
  • 發送有效載荷APN服務器(沙盒服務器/官方服務器,要看情況而定)

  • 添加代碼接收APN

    -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
         NSLog(@"I got notification"); 
    
         [NSThread detachNewThreadSelector:@selector(handleRemoteNotification:) toTarget:self withObject:userInfo]; 
        } 
    
    
    - (void)handleRemoteNotification:(NSDictionary *)userInfo { 
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    
        [UIApplication sharedApplication].applicationIconBadgeNumber++;// = [[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] integerValue]; 
    
         if ([userInfo objectForKey:@"msgId"]) { 
          iRetrievingAPNMessage++; 
          NSString *msgId = [[NSString alloc] initWithString:[userInfo objectForKey:@"msgId"]]; 
          NSMutableString *theURL = [[NSMutableString alloc] init]; 
          [theURL appendFormat:@"http://yourDATAFeedPROGRAM.php?msgID=%@",msgId]; 
    
          MIPFileConnection *APNMsgConnection = [[MIPFileConnection alloc] initWithTargetURL:theURL useCache:NO]; 
          APNMsgConnection.delegate = self; 
          [APNMsgConnection start]; 
    
          NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 
          do { 
          } while ((iRetrievingAPNMessage > 0) && 
            [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); 
          NSLog(@"done"); 
         } 
         [pool release]; 
        } 
    
        - (void)updateDB:(NSDictionary *)msgDic { 
         // do anything to update your sql db. 
         // ATTENTION, the files located in bundle cannot be replaced. 
         // so you need to duplicate your sql into cache/document path. 
         // then you can update it successfully. 
        } 
    
    
        -(void)connectionDidFinishLoading:(NSURLFileConnection *)connection { 
         CFPropertyListRef plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (CFDataRef)connection.receiveData, kCFPropertyListImmutable, NULL); 
    
          if (plist) { 
           NSDictionary *tmpDic = (NSDictionary *)plist; 
    
           [self performSelectorOnMainThread:@selector(updateDB:) withObject:[tmpDic copy] waitUntilDone:NO]; 
    
           [tmpDic release]; 
          } 
          iRetrievingAPNMessage--; 
        } 
    

我用僞「updateDB」中的代碼和假的URL,請將其替換爲您的測試網址。上述行動起作用,我做得很好。但是當我的應用程序處於後臺時,我無法強制通知顯示圖像。