3

我正在使用 UrbanAirship 添加推送通知。我的 AppDelegate.m 中有这两种方法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Create Airship options dictionary and add the required UIApplication launchOptions
    NSMutableDictionary *takeOffOptions = [NSMutableDictionary dictionary];
    [takeOffOptions setValue:launchOptions forKey:UAirshipTakeOffOptionsLaunchOptionsKey];

    // Call takeOff (which creates the UAirship singleton), passing in the launch options so the
    // library can properly record when the app is launched from a push notification. This call is
    // required.
    //
    // Populate AirshipConfig.plist with your app's info from https://go.urbanairship.com
    [UAirship takeOff:takeOffOptions];

    // Set the icon badge to zero on startup (optional)
    [[UAPush shared] resetBadge];

    // Register for remote notfications with the UA Library. This call is required.
    [[UAPush shared] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
                                                         UIRemoteNotificationTypeSound |
                                                         UIRemoteNotificationTypeAlert)];

    // Handle any incoming incoming push notifications.
    // This will invoke `handleBackgroundNotification` on your UAPushNotificationDelegate.
    [[UAPush shared] handleNotification:[launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]
                       applicationState:application.applicationState];

    // Override point for customization after application launch.
    return YES;
}

这个方法:

// Implement the iOS device token registration callback
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    UALOG(@"APN device token: %@", deviceToken);

    // Updates the device token and registers the token with UA. This won't occur until
    // push is enabled if the outlined process is followed.
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSString *alias = [defaults objectForKey:@"user_id"];
    [[UAPush shared] setAlias:@"test-alias"];
    [[UAPush shared] registerDeviceToken:deviceToken];
}

我从这里的 UrbanAirship 说明中得到它们:https ://docs.urbanairship.com/display/DOCS/Getting+Started:+iOS:+Push

但我很困惑如何指定我希望推送通知登陆的屏幕。这是在哪里做的?而且,我的服务器会在推送的同时发送一些 JSON。我在哪里以及如何从该 JSON 中提取数据?

谢谢!

4

3 回答 3

1

您正在将 JSON 传递给该handleNotification方法。这是您编写的方法,还是urbanairship代码的一部分?(我不确定他们是否提供除了服务器代码之外的客户端代码)。如果它是您编写的方法,您可以在该方法中访问 JSON 中的数据。如果没有,您可以编写自己的方法并将相同的数据传递给它。

仅当通知到达时应用程序未运行并且用户点击通知打开应用程序时,您才可以通过这种方式访问​​通知 JSON。如果用户点击应用程序启动图标,该数据将丢失。

您可以使用 JSON 中的自定义属性来指定登录屏幕。您有责任解析该属性并确定要显示的视图。

如果应用程序在前台运行时通知到达,您还应该实现application:didReceiveRemoteNotification:以处理通知数据。

于 2013-03-27T17:34:26.227 回答
1

您必须在应用程序委托中处理远程推送通知:

- (void)application:(UIApplication *)app didReceiveRemoteNotification:(NSDictionary *)userInfo

您可以从这里访问您的根视图控制器并触发其他视图控制器的显示。

从文档:

如果应用正在运行并收到远程通知,应用会调用此方法处理通知。您对此方法的实现应使用通知来采取适当的行动。例如,您可以将其用作连接服务器并下载正在等待应用程序的数据的信号

userInfo 字典包含您通过城市飞艇发送的附加数据。

您可以在参考资料中找到更多信息

于 2013-03-27T17:34:40.957 回答
1

简短的回答是:您没有(因为没有为您提供该功能。)

如果在您的应用程序运行时收到推送,-[UIApplicationDelegate application:didReceiveRemoteNotification:]将被调用。在您实施此方法时,您有责任采取适当的行动(例如显示消息、导航到应用程序的特定区域。)


从文档中

如果应用正在运行并收到远程通知,应用会调用此方法处理通知。您对此方法的实现应使用通知来采取适当的行动。例如,您可以将其用作连接服务器并下载正在等待应用程序的数据的信号。

userInfo 字典包含其值是另一个字典的 aps 键。虽然您不需要 aps 字典中的信息,但您可以使用以下键检索其内容:

userInfo 字典也可能有提供者根据 JSON 模式定义的自定义数据。自定义数据的属性应与 aps 字典在同一级别指定。但是,不应将自定义属性用于海量数据传输,因为每个通知有严格的大小限制(256 字节)并且无法保证交付。

于 2013-03-27T17:36:36.283 回答