application: didRegisterForRemoteNotificationsWithDeviceToken: не срабатывает при использовании профиля обеспечения разработчика - PullRequest
2 голосов
/ 17 февраля 2012

В сборках Ad Hoc я вижу событие application:didRegisterForRemoteNotificationsWithDeviceToken:, которое вызывается, но не при использовании сборки DEBUG с использованием профиля обеспечения разработчика.В специальном профиле и профиле обеспечения разработчика используется один и тот же идентификатор приложения.

Снимок экрана приложения: enter image description here

При работе с профилем обеспечения разработчика я видел предупреждение, спрашивающее, действительно ливключить push-уведомления.Я решил использовать push-уведомления, но тогда событие application:didRegisterForRemoteNotificationsWithDeviceToken: не произошло.Обратите внимание, что событие для application:didFailToRegisterForRemoteNotificationsWithError: также не происходит.

Обратите внимание, что в application:didFinishLaunchingWithOptions: у меня есть:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert];
   // Other code...
}

Я довольно озадачен этим.

Другие примечания:

  • Мой iPad 2 и iPod 4, которыми я пользуюсь, НЕ сломаны в тюрьме
  • Я видел ужасную не действительную 'aps-среду'Обнаружена строка разрешения для ошибки приложения, но она была устранена после регенерации моего профиля обеспечения разработки.
  • Мой коллега сталкивался с такой же проблемой (работает в Ad Hoc, но не разработчик) в проектах с предыдущими компаниями.

1 Ответ

1 голос
/ 17 февраля 2012

Тот же код сработал на следующий день

Событие application:didRegisterForRemoteNotificationsWithDeviceToken:deviceToken работает сейчас (на следующий день). Обратите внимание, что , похоже, не имеет ничего общего с предупреждением , спрашивающим, хотите ли вы включить push-уведомления, поскольку я не видел это предупреждение, когда оно начало работать.

Одна вещь, которую я до сих пор нахожу странным, это то, что вчера, используя Ad Hoc, создавалось событие. application:didRegisterForRemoteNotificationsWithDeviceToken:deviceToken КАЖДЫЙ РАЗ запускал приложение. Однако сборка DEBUG с профилем обеспечения разработчика никогда не запускалась вообще. Тот же код этим утром работает (и срабатывает каждый раз, когда используется сборка DEBUG с профилем обеспечения разработчика) .... Что-то в устройстве (внутренний таймер / тайм-аут) должно быть сброшено.

Пример кода

Ниже приведен код, который я использовал в событии получения deviceToken. Он использует Urban Airship в качестве поставщика для Apple Push Notification Server (APNS). Я удалил имя пользователя и пароли из кода. Я надеюсь, что это полезно для других, кто пытается разобраться.

- (void)application:(UIApplication *)application
        didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSString *tokenStr = [[[[deviceToken description]
                            stringByReplacingOccurrencesOfString:@"<" withString:@""]
                           stringByReplacingOccurrencesOfString:@">" withString:@""]
                          stringByReplacingOccurrencesOfString:@" " withString:@""];

    NSLog(@"Device Token (raw): %@", deviceToken);
    NSLog(@"Device Token (string): %@", tokenStr);
    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Device Token"
                                                 message:tokenStr
                                                delegate:nil
                                       cancelButtonTitle:nil
                                       otherButtonTitles:@"OK", nil] autorelease];
    [alert show];

    // Code to send token to server
    NSString *urlString = [NSString stringWithFormat:
    @"https://go.urbanairship.com/api/device_tokens/%@", tokenStr];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:
                               [NSURL URLWithString:urlString]];
#if APP_STORE_RELEASE
    [request addBasicAuthenticationHeaderWithUsername:@"aaaaaaaaaaaaaaaaaaaaaa"
                                          andPassword:@"bbbbbbbbbbbbbbbbbbbbbb"];
#else
    [request addBasicAuthenticationHeaderWithUsername:@"cccccccccccccccccccccc"
                                          andPassword:@"dddddddddddddddddddddd"];
#endif
    request.requestMethod = @"PUT";
    [request startAsynchronous];
}

Обратите внимание, что описание NSData вернет шестнадцатеричную строку, которая начинается с "<" и заканчивается ">". Между ними пробелы. Мой оригинальный подход состоял в том, чтобы преобразовать NSData в строку, используя NSUTF8StringEncoding, но это неверно (поскольку вы хотите, чтобы токен был шестнадцатеричной строкой ).

...