瀏覽器中打開IOS應用並傳參

原創文章,轉載請註明


開發中遇到這麼一個問題,就是動態地指定聯接服務器地址,或其它數據。如果是其它數據還好說一些,可以通過在服務器上獲得的方式來弄。但如果服務器地址都需要動態指定的話。那就得另想辦法了. 整個過程得到同事梅俊不少的幫助,這裏表示感謝。


自定義URL_Scheme 是一個不錯的解決方案。需要注意的是:在多個應用程序註冊了同一種URL Scheme 的時候,iOS 系統程序的優先級高於第三方開發程序。但是如果一種URL Scheme 的註冊應用程序都是第三方開發的,那麼這些程序的優先級關係是不確定的。


使用URL_Scheme,具體分兩步
一,、如何在瀏覽器中打開本地應用

    在Info.plist中插入相關項,在XCode裏它看起來像


    用文本編輯器打開,它看起來像


    到這裏, 就可以用瀏覽器把它打開了。
   在地址欄輸入  ProductID://com.terrence.ProductID 回車,就彈出是否打開本地應用的對話框
   OK


二、如何傳遞參數

    通過第一步,可以打開應用了,但還沒有解決傳遞參數的問題,想得到傳遞的參數,就要在應用的代碼裏做相應的回調處理,這裏的項目是cocos2d-x的框架,以此爲例說一下具體的步驟:
    1.實現一下 UIApplicationDelegate中的一個回調方法

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;  // Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation NS_AVAILABLE_IOS(4_2); // no equiv. notification. return NO if the application can't open for some reason

    看官方註釋,第一個已經過期了,咱們實現第二個。


    在cocos2d-x裏 AppController 這個類實現了UIApplicationDelegate協議,所以在這個類裏增加
//>=-Rct-=< for URL_Scheme
// no equiv. notification. return NO if the application can't open for some reason
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation NS_AVAILABLE_IOS(4_2){
    //std::string l_strURL = [[url absoluteString] UTF8String];
    std::string l_strURL = [[url query] UTF8String];
    std::string l_strSourceApplication = [sourceApplication UTF8String];
    cocos2d::CCApplication::sharedApplication()->applicationUrlScheme(l_strURL, l_strSourceApplication);
    return YES;
}


這裏稍稍說明一下, [url query] 返回的url中 "?"後面的部分
http://blog.csdn.net/ysy441088327/article/details/7416759 這篇博客很直觀地說明了NSUrl的常見用法,這裏引用一下。


applicationUrlScheme方法是自定義的,它應當在CCApplicationProtocol 裏被聲明(成純虛函數),然後在AppDelegate裏真正實現它。

//url scheme
void AppDelegate::applicationUrlScheme(const std::string& p_strUrl, const std::string& p_strSourceApplication){
    CCLog("applicationUrlScheme url:%s, sourceApplication:%s", p_strUrl.c_str(), p_strSourceApplication.c_str());
    CheatMgr::sharedMgr()->setUrlScheme(p_strUrl);
}




到現在爲止,在瀏覽器中輸入 ProductID://com.terrence.ProductID?http://192.168.0.100:8080/gamedata
應用就被喚醒,且得到傳遞過來的參數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章