zoukankan      html  css  js  c++  java
  • iphone SprintBoard部分私有API总结(不支持iOS8)

     本文介绍iOS SrpintBoard框架的部分私有API,具体包括:

    • 获取ios上当前正在运行的所有App的bundle id(不管当前程序是在前台还是后台都可以)
    • 获取ios上当前前台运行的App的bundle id(不管当前程序是在前台还是后台都可以)
    • 根据ios app的bundle id得到其App名称、图标(不管当前程序是在前台还是后台都可以)
    • 直接通过App 的bundle id来运行该App,无需使用url scheme(仅限当前程序在前台时,假如程序在后台能随便运行其他App,那就无敌了@_@)

    (1)初始化

        void * uikit = dlopen("/System/Library/Framework/UIKit.framework/UIKit", RTLD_LAZY);
        int (*SBSSpringBoardServerPort)() =
        dlsym(uikit, "SBSSpringBoardServerPort");
        p = (mach_port_t *)SBSSpringBoardServerPort();
        dlclose(uikit);
        sbserv = dlopen(SBSERVPATH, RTLD_LAZY);

    (2)获取iphone上所有正在运行的app的bundle id列表

    NSArray* (*SBSCopyApplicationDisplayIdentifiers)(mach_port_t* port, BOOL runningApps,BOOL debuggablet) =
    
                        dlsym(sbserv, "SBSCopyApplicationDisplayIdentifiers");
    
    NSArray *currentRunningAppBundleIdArray= SBSCopyApplicationDisplayIdentifiers(p,NO,YES);

    (3)得到iphone 前台运行的app的bundle id

    void* (*SBFrontmostApplicationDisplayIdentifier)(mach_port_t* port,char * result) = dlsym(sbserv, "SBFrontmostApplicationDisplayIdentifier");
    char topapp[256];
    SBFrontmostApplicationDisplayIdentifier(p,topapp); currentTopAppBundleId
    =[NSStringstringWithFormat:@"%s",topapp];

    (4)根据iphone app的bundle id得到其app名称

     NSString * (*SBSCopyLocalizedApplicationNameForDisplayIdentifier)(NSString* ) =   dlsym(sbserv, "SBSCopyLocalizedApplicationNameForDisplayIdentifier");
    
    NSString *strAppName = SBSCopyLocalizedApplicationNameForDisplayIdentifier(strBundleId);

     (5)根据iphone app 的bundle id得到其图标

     NSData* (*SBSCopyIconImagePNGDataForDisplayIdentifier)(NSString * bundleid) =
        dlsym(sbserv, "SBSCopyIconImagePNGDataForDisplayIdentifier");
        UIImage *icon = nil;
        NSData *iconData = SBSCopyIconImagePNGDataForDisplayIdentifier(bundleid);
        if (iconData != nil) {
            icon = [UIImage imageWithData:iconData];   
        }
        return icon;

    (6)直接通过app 的bundle id来运行该app

     在ios中,一个app调起另一个app的方式通常是用url scheme,但是用这个 私有app,可以在不需要url scheme的情况下运行任何app

    -(void)openAppByBundleId:(NSString*)bundleId
    {
        void* sbServices = dlopen("/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices", RTLD_LAZY);
        int (*SBSLaunchApplicationWithIdentifier)(CFStringRef identifier, Boolean suspended) = dlsym(sbServices, "SBSLaunchApplicationWithIdentifier");
        const char *strBundleId = [bundleId cStringUsingEncoding:NSUTF8StringEncoding];
        int result = SBSLaunchApplicationWithIdentifier((__bridge CFStringRef)bundleId, NO);
        dlclose(sbServices);
    }

     

  • 相关阅读:
    架构与模式11
    Unix/Linux命令
    Winform的Excel表格
    B/S结构一机多屏实现
    Effective C++函数参数传递方式
    Django & Tornado
    ThoughtWorks读书路线图
    善用泛型 委托
    SQL 关于with cube ,with rollup 和 grouping
    测试工程师实习笔试题
  • 原文地址:https://www.cnblogs.com/gugupluto/p/3206772.html
Copyright © 2011-2022 走看看