Open iPhone SDK: Adding Application Badges

本文介绍了在iOS设备上为应用程序图标添加徽章的方法。包括使用UIApplication接口直接设置徽章,以及通过UIKit框架的SBSetApplicationBadge函数进行更灵活的徽章管理。还提供了实用的代码示例。

If you’ve used the iPhone or iPod touch for any time, you’ve likely seen the small red badges that appear over applications on the home screen. These might indicate the number of missed phone calls or unread emails that accumulated since the user last opened Phone or Mail.

There are actually two ways to go about badging applications: one, an extremely simple UIApplication call, the other a slightly more involved tunneling into UIKit. To set an application badge from within the program itself, use setApplicationBadge:. Pass it an NSString as its argument, limiting the string size to 4 or 5 characters at most. For example, you could badge an application with the 3-letter abbreviation for the current month:

NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0];
    NSString *caldate = [[now 
            dateWithCalendarFormat:@"%b" 
            timeZone:nil] description];
    [self setApplicationBadge:caldate];

To remove an application badge, pass the empty string, i.e. @””. This removes any existing badge from the icon. If you want an “empty” badge, pass it a space character instead, @” “.

The problem with the UIApplication approach is that to use it you must place your requests directly from the application. And, since many live updates are the results of background daemons, you may want to badge icons from outside the application itself.

The following utility source relies on dynamic linking. Reverse engineering the UIKit framework revealed how the setApplicationBadge worked. It calls SBSetApplicationBadge with a string and an application identifier. As a rule, dynamic linking isn’t an approach I generally endorse for day-to-day programming. In this case, there’s a compelling need to allow badging by client daemons.

#import <CoreFoundation/CoreFoundation.h>
#import <Foundation/Foundation.h>
#import <UIKit/CDStructures.h>
#import <UIKit/UIWindow.h>
#import <UIKit/UIView-Hierarchy.h>
#import <UIKit/UIHardware.h>
#import <UIKit/UIKit.h>
#import <UIKit/UIApplication.h>
#import <UIKit/UITextView.h>
#import <UIKit/UIView.h>
#include <unistd.h>
#include <dlfcn.h>

void usage(char *appname)
{
   printf("%s application-name (badge)/n", appname);
}

// Invoke the SBSetApplicationBadge function
void badge(char *appid, char *badgeText)
{
   mach_port_t *uiport;
   uiport = _UISpringBoardServerPort();
   void *uikit = 
      dlopen("/System/Library/Framework/UIKit.framework/UIKit", 
                   RTLD_LAZY);
   int (*badge)(mach_port_t* port, char* applicationID, char* text) = 
                     dlsym(uikit, "SBSetApplicationBadge"); 
   badge(uiport, appid, badgeText);
}

// Recover the Application ID from the core App name
id appid (id appname)
{
    NSString *plpath = [NSString stringWithFormat:
           @"/Applications/%@.app/Info.plist", appname];
    id dict = [NSDictionary dictionaryWithContentsOfFile:plpath];
    if (dict) return [dict objectForKey:@"CFBundleIdentifier"];

    plpath = [NSString stringWithFormat:
           @"/Widgets/%@.app/Info.plist", appname];
    dict = [NSDictionary dictionaryWithContentsOfFile:plpath];
    if (dict) return [dict objectForKey:@"CFBundleIdentifier"];

    return NULL;
}

int main(int argc, char **argv)
{
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   if (argc < 2) {usage(argv[0]); exit(-1);} 

   id app = appid([NSString stringWithCString:argv[1]]);
   if (!app) {
     printf("Error: Could not find application for %s/n", argv[1]);
     exit(-1); }

   if (argc == 2) 
      badge([app cString], ""); 
   else
      badge([app cString], argv[2]);

   [pool release];
}
Categories
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值