Добавлять изображения через службу push-уведомлений?

У меня есть контентное приложение, и я хотел бы уведомлять пользователей о новом контенте с помощью службы push-уведомлений Apple, минуя теперь очень длинные отправки в App Store. Как только пользователь получит уведомление, кнопка загрузки обновления станет доступной. Пользователь загрузит файл sql и изображения с моего веб-сайта. Файл sql выполнит операторы вставки, и изображения будут загружены на диск.

В настоящее время я загружаю контент (строки и ссылки на изображения) в UIWebView. Изображения отображаются как часть контента. Как мне выполнить файл sql для вставки нового контента? Тогда мне также нужно будет начать ссылаться на изображения на диске, а не из пакета, куда я помещаю изображения при использовании обновлений App Store?

Для файла sql я, вероятно, смогу запустить некоторый код, основанный на событиях, после завершения загрузки. Но затем базу данных только для чтения необходимо перезагрузить, чтобы увидеть новый контент. Придется ли пользователю перезапускать приложение?


person 4thSpace    schedule 23.07.2009    source источник


Ответы (2)


Как вы сказали, база данных доступна только для чтения для вашего приложения, я бы просто заставил APN запускать загрузку нового файла базы данных и записывать его на диск вместо выполнения операторов SQL для изменения существующей базы данных. (Если ваша база данных не очень велика, и вы вносите только небольшое изменение, когда размер загрузки будет учитываться).

В любом случае, если вы загружаете базу данных из пакета, она будет доступна только для чтения, поэтому вы не сможете выполнять в ней операторы вставки — вам нужно будет сделать доступную для записи копию. Полная замена этой копии в процессе обновления означает, что вам не нужно беспокоиться о правильном выполнении SQL на каждом устройстве. например что произойдет, если приложение завершится в середине вставки?

Точно так же и с изображениями ваша жизнь была бы проще, если бы они были скопированы в каталог изображений с возможностью записи при первом запуске, а не загружены из пакета, поэтому вы всегда ищете их в одном и том же месте и не заботитесь о том, было ли обновление. Просто убедитесь, что вы очищаете все, что больше не требуется после обновления, чтобы не занимать больше памяти пользователя, чем вам нужно.

person Chris Newman    schedule 21.10.2009

Конечно, вы можете это сделать.

  • вы добавляете какое-то настраиваемое поле в полезную нагрузку push-уведомления, в моем случае «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-адрес, замените его URL-адресом вашего тестового веб-сайта. Вышеупомянутое действие работает, я сделал это нормально. Но я не могу заставить уведомление показывать изображение, когда мое приложение находится в фоновом режиме.

person Dennies Chang    schedule 03.04.2012