x
首页 随笔[ios开发] iPhone动态更新桌面图标徽章数字

iPhone动态更新桌面图标徽章数字

发表于 2012-06-18 - 浏览:13169 评论:0 收藏 0

在iPhone的桌面图标上,经常可以看到带数字的徽章(Badge),比如未接来电的个数,未读短信的条数等。如下有两种方式去更新徽章中的数字。

1.    官方SDK
2.   
官方SDK提供的接口只可以修改本应用程序桌面图标徽章中的数字,不能修改其它应用程序图标徽章的数字,功能有限。具体调用方案为:
int number = 5;
[[UIApplication sharedApplication] setApplicationBadgeNumber:number];
调用该函数可以给当前应用程序设置图标徽章数字。

3.    调用私有库
通过调用SpringBoardService.framework中的方法。调用该方法可以给任意App程序的桌面图标设置徽章数量,很适合后台进程在从服务器获取数据后,更改应用程序的徽章数量。

步骤大致如下:
a.    用nm命令查看SpringBoardService中的函数名,具体命令为:nm SpringBoardService > /tmp/func.txt,到/tmp目录下查看func.txt,可以查找到函数名为SBSetApplicationBadgeNumber(3.X固件),SBSetApplicationBadge(2.X固件);
b.    找到该函数的原型,可以使用ida等反汇编工具,可以看到其参数类型为2.X(mach_port_t* port, const char* applicationID, const char* text); 3.X(mach_port_t* port, const char* applicationID, int number);
c.    系统调用,dlopen打开该framework,dlsym函数链接你所要指向的函数名;
d.    调用链接的函数,对应用程序的桌面图标徽章进行修改;
e.    具体实现如下:

static mach_port_t *sbport;
int (*UIKit_SBSetApplicationBadge) (mach_port_t* port, const char* applicationID, const char* text);
int (*UIKit_SBSetApplicationBadge_3x) (mach_port_t* port, const char* applicationID, int number);

//// Invoke the SBSetApplicationBadge function
void sbbadge3x(const char* appid, int number)
{
    UIKit_SBSetApplicationBadge_3x(sbport,appid,number);
}
void sbbadge (const char *appid, const char *badgeText) {
    UIKit_SBSetApplicationBadge(sbport, appid, badgeText);
}

void updateBadge(char* appName, int newCount)
{
    sbport = (mach_port_t*)SBSSpringBoardServerPort();
    void *uikit = dlopen("/System/Library/Frameworks/UIKit.framework/UIKit", RTLD_LAZY);
    char * errInfo = NULL;
    errInfo = dlerror();
    if (errInfo)
    {
        NSLog(@"Error Info=%s", errInfo);
    }
    const char* pid = getProductId(appName);   
    if (pid == NULL)
    {
        NSLog(@"Error Product ID,AppName not exist");
        return;
    }
    NSString* sysVer = [[UIDevice currentDevice] systemVersion];
    if ((char)[sysVer characterAtIndex:0] == '3')
    {
        UIKit_SBSetApplicationBadge_3x = dlsym(uikit,"SBSetApplicationBadgeNumber");
        if (newCount >= 0)
        {
            sbbadge3x(pid, newCount);
        }
    }
    else
    {
        UIKit_SBSetApplicationBadge = dlsym(uikit, "SBSetApplicationBadge");
        if (newCount > 0)
        {
            sbbadge(pid, (char*)[[NSString stringWithFormat"%d", newCount] UTF8String]);       
        }
        else if (newCount == 0)
        {
            sbbadge(pid, "");
        }       
    }
    dlclose(uikit);
}

文章评论。。。