open source
This commit is contained in:
@@ -0,0 +1,658 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
240A9FE6206294E8008CBA94 /* cache in Resources */ = {isa = PBXBuildFile; fileRef = 240A9FE5206294E8008CBA94 /* cache */; };
|
||||
240AA04D2068BAF1008CBA94 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A2A762A71C998DFF00C3BF11 /* WebKit.framework */; };
|
||||
24130B8B22A0FF9900B9CD3E /* Test.mm in Sources */ = {isa = PBXBuildFile; fileRef = 24130B8922A0FF9900B9CD3E /* Test.mm */; };
|
||||
2431E3E5207F6BC800591D08 /* scripts in Resources */ = {isa = PBXBuildFile; fileRef = 2431E3E4207F6BC700591D08 /* scripts */; };
|
||||
248EBA75207F8E830092E63F /* IAPManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 248EBA71207F8E830092E63F /* IAPManager.m */; };
|
||||
A218DA132377F16500B9B817 /* libbz2.1.0.5.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A218DA122377F16500B9B817 /* libbz2.1.0.5.tbd */; };
|
||||
A2A762A01C998C0300C3BF11 /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = A2A7629D1C998C0300C3BF11 /* AppDelegate.mm */; };
|
||||
A2A762A21C998C0300C3BF11 /* ViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = A2A7629F1C998C0300C3BF11 /* ViewController.mm */; };
|
||||
A2A7632B1C9A8B7500C3BF11 /* config.ini in Resources */ = {isa = PBXBuildFile; fileRef = A2A763291C9A8B7500C3BF11 /* config.ini */; };
|
||||
A2F28F9C1C43C59F00B89B34 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A2F28F9B1C43C59F00B89B34 /* main.m */; };
|
||||
A2F28FA51C43C59F00B89B34 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A2F28FA31C43C59F00B89B34 /* Main.storyboard */; };
|
||||
A2F28FA71C43C59F00B89B34 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A2F28FA61C43C59F00B89B34 /* Assets.xcassets */; };
|
||||
A2F28FAA1C43C59F00B89B34 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A2F28FA81C43C59F00B89B34 /* LaunchScreen.storyboard */; };
|
||||
A2F28FB51C43C59F00B89B34 /* WKWebviewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A2F28FB41C43C59F00B89B34 /* WKWebviewTests.m */; };
|
||||
A2F28FC01C43C59F00B89B34 /* WKWebviewUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = A2F28FBF1C43C59F00B89B34 /* WKWebviewUITests.m */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
A218D9FB2377ECCD00B9B817 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = A218D9F72377ECCC00B9B817 /* LayaWKWebview.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = A2D118301D0BB25E004C229D;
|
||||
remoteInfo = LayaWKWebview;
|
||||
};
|
||||
A2F28FB11C43C59F00B89B34 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = A2F28F8F1C43C59F00B89B34 /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = A2F28F961C43C59F00B89B34;
|
||||
remoteInfo = WKWebview;
|
||||
};
|
||||
A2F28FBC1C43C59F00B89B34 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = A2F28F8F1C43C59F00B89B34 /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = A2F28F961C43C59F00B89B34;
|
||||
remoteInfo = WKWebview;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
240A9FE5206294E8008CBA94 /* cache */ = {isa = PBXFileReference; lastKnownFileType = folder; name = cache; path = resource/cache; sourceTree = "<group>"; };
|
||||
24130B8922A0FF9900B9CD3E /* Test.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Test.mm; sourceTree = "<group>"; };
|
||||
24130B8A22A0FF9900B9CD3E /* Test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Test.h; sourceTree = "<group>"; };
|
||||
2431E3E4207F6BC700591D08 /* scripts */ = {isa = PBXFileReference; lastKnownFileType = folder; name = scripts; path = resource/scripts; sourceTree = "<group>"; };
|
||||
248EBA71207F8E830092E63F /* IAPManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IAPManager.m; sourceTree = "<group>"; };
|
||||
248EBA73207F8E830092E63F /* IAPManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IAPManager.h; sourceTree = "<group>"; };
|
||||
A218D9F72377ECCC00B9B817 /* LayaWKWebview.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = LayaWKWebview.xcodeproj; path = ../LayaWKWebview/proj.ios/LayaWKWebview.xcodeproj; sourceTree = "<group>"; };
|
||||
A218DA122377F16500B9B817 /* libbz2.1.0.5.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libbz2.1.0.5.tbd; path = usr/lib/libbz2.1.0.5.tbd; sourceTree = SDKROOT; };
|
||||
A2A7629D1C998C0300C3BF11 /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AppDelegate.mm; sourceTree = "<group>"; };
|
||||
A2A7629F1C998C0300C3BF11 /* ViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ViewController.mm; sourceTree = "<group>"; };
|
||||
A2A762A31C998DCD00C3BF11 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||
A2A762A51C998DEC00C3BF11 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
|
||||
A2A762A71C998DFF00C3BF11 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
|
||||
A2A763251C9A835E00C3BF11 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
|
||||
A2A763291C9A8B7500C3BF11 /* config.ini */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = config.ini; path = resource/config.ini; sourceTree = "<group>"; };
|
||||
A2A763421C9B0A2F00C3BF11 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; };
|
||||
A2A763441C9B0BE300C3BF11 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
|
||||
A2F28F971C43C59F00B89B34 /* WKWebview.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WKWebview.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
A2F28F9B1C43C59F00B89B34 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
||||
A2F28F9D1C43C59F00B89B34 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
|
||||
A2F28FA01C43C59F00B89B34 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
|
||||
A2F28FA41C43C59F00B89B34 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||
A2F28FA61C43C59F00B89B34 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
A2F28FA91C43C59F00B89B34 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
A2F28FAB1C43C59F00B89B34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
A2F28FB01C43C59F00B89B34 /* WKWebviewTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WKWebviewTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
A2F28FB41C43C59F00B89B34 /* WKWebviewTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKWebviewTests.m; sourceTree = "<group>"; };
|
||||
A2F28FB61C43C59F00B89B34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
A2F28FBB1C43C59F00B89B34 /* WKWebviewUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WKWebviewUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
A2F28FBF1C43C59F00B89B34 /* WKWebviewUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKWebviewUITests.m; sourceTree = "<group>"; };
|
||||
A2F28FC11C43C59F00B89B34 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
A2F28F941C43C59F00B89B34 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
A218DA132377F16500B9B817 /* libbz2.1.0.5.tbd in Frameworks */,
|
||||
240AA04D2068BAF1008CBA94 /* WebKit.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
A2F28FAD1C43C59F00B89B34 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
A2F28FB81C43C59F00B89B34 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
240AA04C2068BAF1008CBA94 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
A218DA122377F16500B9B817 /* libbz2.1.0.5.tbd */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
248EBA70207F8E830092E63F /* iap */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
248EBA71207F8E830092E63F /* IAPManager.m */,
|
||||
248EBA73207F8E830092E63F /* IAPManager.h */,
|
||||
);
|
||||
path = iap;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
A218D9F82377ECCC00B9B817 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
A218D9FC2377ECCD00B9B817 /* librender.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
A2A763271C9A8B5E00C3BF11 /* resource */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
2431E3E4207F6BC700591D08 /* scripts */,
|
||||
240A9FE5206294E8008CBA94 /* cache */,
|
||||
A2A763291C9A8B7500C3BF11 /* config.ini */,
|
||||
);
|
||||
name = resource;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
A2F28F8E1C43C59F00B89B34 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
A218D9F72377ECCC00B9B817 /* LayaWKWebview.xcodeproj */,
|
||||
A2A763441C9B0BE300C3BF11 /* AVFoundation.framework */,
|
||||
A2A763421C9B0A2F00C3BF11 /* OpenAL.framework */,
|
||||
A2A763271C9A8B5E00C3BF11 /* resource */,
|
||||
A2A763251C9A835E00C3BF11 /* libz.tbd */,
|
||||
A2A762A71C998DFF00C3BF11 /* WebKit.framework */,
|
||||
A2A762A51C998DEC00C3BF11 /* UIKit.framework */,
|
||||
A2A762A31C998DCD00C3BF11 /* Foundation.framework */,
|
||||
A2F28F991C43C59F00B89B34 /* WKWebview */,
|
||||
A2F28FB31C43C59F00B89B34 /* WKWebviewTests */,
|
||||
A2F28FBE1C43C59F00B89B34 /* WKWebviewUITests */,
|
||||
A2F28F981C43C59F00B89B34 /* Products */,
|
||||
240AA04C2068BAF1008CBA94 /* Frameworks */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
A2F28F981C43C59F00B89B34 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
A2F28F971C43C59F00B89B34 /* WKWebview.app */,
|
||||
A2F28FB01C43C59F00B89B34 /* WKWebviewTests.xctest */,
|
||||
A2F28FBB1C43C59F00B89B34 /* WKWebviewUITests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
A2F28F991C43C59F00B89B34 /* WKWebview */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
24130B8A22A0FF9900B9CD3E /* Test.h */,
|
||||
24130B8922A0FF9900B9CD3E /* Test.mm */,
|
||||
248EBA70207F8E830092E63F /* iap */,
|
||||
A2A7629D1C998C0300C3BF11 /* AppDelegate.mm */,
|
||||
A2A7629F1C998C0300C3BF11 /* ViewController.mm */,
|
||||
A2F28F9D1C43C59F00B89B34 /* AppDelegate.h */,
|
||||
A2F28FA01C43C59F00B89B34 /* ViewController.h */,
|
||||
A2F28FA31C43C59F00B89B34 /* Main.storyboard */,
|
||||
A2F28FA61C43C59F00B89B34 /* Assets.xcassets */,
|
||||
A2F28FA81C43C59F00B89B34 /* LaunchScreen.storyboard */,
|
||||
A2F28FAB1C43C59F00B89B34 /* Info.plist */,
|
||||
A2F28F9A1C43C59F00B89B34 /* Supporting Files */,
|
||||
);
|
||||
path = WKWebview;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
A2F28F9A1C43C59F00B89B34 /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
A2F28F9B1C43C59F00B89B34 /* main.m */,
|
||||
);
|
||||
name = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
A2F28FB31C43C59F00B89B34 /* WKWebviewTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
A2F28FB41C43C59F00B89B34 /* WKWebviewTests.m */,
|
||||
A2F28FB61C43C59F00B89B34 /* Info.plist */,
|
||||
);
|
||||
path = WKWebviewTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
A2F28FBE1C43C59F00B89B34 /* WKWebviewUITests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
A2F28FBF1C43C59F00B89B34 /* WKWebviewUITests.m */,
|
||||
A2F28FC11C43C59F00B89B34 /* Info.plist */,
|
||||
);
|
||||
path = WKWebviewUITests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
A2F28F961C43C59F00B89B34 /* WKWebview */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = A2F28FC41C43C59F00B89B34 /* Build configuration list for PBXNativeTarget "WKWebview" */;
|
||||
buildPhases = (
|
||||
A2F28F931C43C59F00B89B34 /* Sources */,
|
||||
A2F28F941C43C59F00B89B34 /* Frameworks */,
|
||||
A2F28F951C43C59F00B89B34 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = WKWebview;
|
||||
productName = WKWebview;
|
||||
productReference = A2F28F971C43C59F00B89B34 /* WKWebview.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
A2F28FAF1C43C59F00B89B34 /* WKWebviewTests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = A2F28FC71C43C59F00B89B34 /* Build configuration list for PBXNativeTarget "WKWebviewTests" */;
|
||||
buildPhases = (
|
||||
A2F28FAC1C43C59F00B89B34 /* Sources */,
|
||||
A2F28FAD1C43C59F00B89B34 /* Frameworks */,
|
||||
A2F28FAE1C43C59F00B89B34 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
A2F28FB21C43C59F00B89B34 /* PBXTargetDependency */,
|
||||
);
|
||||
name = WKWebviewTests;
|
||||
productName = WKWebviewTests;
|
||||
productReference = A2F28FB01C43C59F00B89B34 /* WKWebviewTests.xctest */;
|
||||
productType = "com.apple.product-type.bundle.unit-test";
|
||||
};
|
||||
A2F28FBA1C43C59F00B89B34 /* WKWebviewUITests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = A2F28FCA1C43C59F00B89B34 /* Build configuration list for PBXNativeTarget "WKWebviewUITests" */;
|
||||
buildPhases = (
|
||||
A2F28FB71C43C59F00B89B34 /* Sources */,
|
||||
A2F28FB81C43C59F00B89B34 /* Frameworks */,
|
||||
A2F28FB91C43C59F00B89B34 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
A2F28FBD1C43C59F00B89B34 /* PBXTargetDependency */,
|
||||
);
|
||||
name = WKWebviewUITests;
|
||||
productName = WKWebviewUITests;
|
||||
productReference = A2F28FBB1C43C59F00B89B34 /* WKWebviewUITests.xctest */;
|
||||
productType = "com.apple.product-type.bundle.ui-testing";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
A2F28F8F1C43C59F00B89B34 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 0720;
|
||||
ORGANIZATIONNAME = LayaBox;
|
||||
TargetAttributes = {
|
||||
A2F28F961C43C59F00B89B34 = {
|
||||
CreatedOnToolsVersion = 7.2;
|
||||
DevelopmentTeam = 4XRST2UF2Q;
|
||||
};
|
||||
A2F28FAF1C43C59F00B89B34 = {
|
||||
CreatedOnToolsVersion = 7.2;
|
||||
TestTargetID = A2F28F961C43C59F00B89B34;
|
||||
};
|
||||
A2F28FBA1C43C59F00B89B34 = {
|
||||
CreatedOnToolsVersion = 7.2;
|
||||
TestTargetID = A2F28F961C43C59F00B89B34;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = A2F28F921C43C59F00B89B34 /* Build configuration list for PBXProject "WKWebview" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
English,
|
||||
en,
|
||||
Base,
|
||||
);
|
||||
mainGroup = A2F28F8E1C43C59F00B89B34;
|
||||
productRefGroup = A2F28F981C43C59F00B89B34 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectReferences = (
|
||||
{
|
||||
ProductGroup = A218D9F82377ECCC00B9B817 /* Products */;
|
||||
ProjectRef = A218D9F72377ECCC00B9B817 /* LayaWKWebview.xcodeproj */;
|
||||
},
|
||||
);
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
A2F28F961C43C59F00B89B34 /* WKWebview */,
|
||||
A2F28FAF1C43C59F00B89B34 /* WKWebviewTests */,
|
||||
A2F28FBA1C43C59F00B89B34 /* WKWebviewUITests */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXReferenceProxy section */
|
||||
A218D9FC2377ECCD00B9B817 /* librender.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
name = librender.a;
|
||||
path = libLayaWKWebview.a;
|
||||
remoteRef = A218D9FB2377ECCD00B9B817 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
/* End PBXReferenceProxy section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
A2F28F951C43C59F00B89B34 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
240A9FE6206294E8008CBA94 /* cache in Resources */,
|
||||
A2F28FAA1C43C59F00B89B34 /* LaunchScreen.storyboard in Resources */,
|
||||
A2F28FA71C43C59F00B89B34 /* Assets.xcassets in Resources */,
|
||||
2431E3E5207F6BC800591D08 /* scripts in Resources */,
|
||||
A2F28FA51C43C59F00B89B34 /* Main.storyboard in Resources */,
|
||||
A2A7632B1C9A8B7500C3BF11 /* config.ini in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
A2F28FAE1C43C59F00B89B34 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
A2F28FB91C43C59F00B89B34 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
A2F28F931C43C59F00B89B34 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
A2A762A21C998C0300C3BF11 /* ViewController.mm in Sources */,
|
||||
A2A762A01C998C0300C3BF11 /* AppDelegate.mm in Sources */,
|
||||
24130B8B22A0FF9900B9CD3E /* Test.mm in Sources */,
|
||||
A2F28F9C1C43C59F00B89B34 /* main.m in Sources */,
|
||||
248EBA75207F8E830092E63F /* IAPManager.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
A2F28FAC1C43C59F00B89B34 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
A2F28FB51C43C59F00B89B34 /* WKWebviewTests.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
A2F28FB71C43C59F00B89B34 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
A2F28FC01C43C59F00B89B34 /* WKWebviewUITests.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
A2F28FB21C43C59F00B89B34 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = A2F28F961C43C59F00B89B34 /* WKWebview */;
|
||||
targetProxy = A2F28FB11C43C59F00B89B34 /* PBXContainerItemProxy */;
|
||||
};
|
||||
A2F28FBD1C43C59F00B89B34 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = A2F28F961C43C59F00B89B34 /* WKWebview */;
|
||||
targetProxy = A2F28FBC1C43C59F00B89B34 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
A2F28FA31C43C59F00B89B34 /* Main.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
A2F28FA41C43C59F00B89B34 /* Base */,
|
||||
);
|
||||
name = Main.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
A2F28FA81C43C59F00B89B34 /* LaunchScreen.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
A2F28FA91C43C59F00B89B34 /* Base */,
|
||||
);
|
||||
name = LaunchScreen.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
A2F28FC21C43C59F00B89B34 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
A2F28FC31C43C59F00B89B34 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
A2F28FC51C43C59F00B89B34 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
DEVELOPMENT_TEAM = 4XRST2UF2Q;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = WKWebview/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
../../../libs/ios/,
|
||||
../../../../ThirdParty/curl/lib/ios,
|
||||
../../../../ThirdParty/openssl/lib/ios,
|
||||
);
|
||||
OTHER_CFLAGS = "-I../../LayaWKWebview/proj.ios/LayaWKWebview";
|
||||
OTHER_LDFLAGS = (
|
||||
"-lcommon",
|
||||
"-lLayaWKWebview",
|
||||
"-lcurl",
|
||||
"-lssl",
|
||||
"-lcrypto",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.laya.WKWebview;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
A2F28FC61C43C59F00B89B34 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
DEVELOPMENT_TEAM = 4XRST2UF2Q;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = WKWebview/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
../../../libs/ios/,
|
||||
../../../../ThirdParty/curl/lib/ios,
|
||||
../../../../ThirdParty/openssl/lib/ios,
|
||||
);
|
||||
OTHER_CFLAGS = "-I../../LayaWKWebview/proj.ios/LayaWKWebview";
|
||||
OTHER_LDFLAGS = (
|
||||
"-lcommon",
|
||||
"-lLayaWKWebview",
|
||||
"-lcurl",
|
||||
"-lssl",
|
||||
"-lcrypto",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.laya.WKWebview;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
A2F28FC81C43C59F00B89B34 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
INFOPLIST_FILE = WKWebviewTests/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = comd.laya.WKWebviewTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WKWebview.app/WKWebview";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
A2F28FC91C43C59F00B89B34 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
INFOPLIST_FILE = WKWebviewTests/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = comd.laya.WKWebviewTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WKWebview.app/WKWebview";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
A2F28FCB1C43C59F00B89B34 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = WKWebviewUITests/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = comd.laya.WKWebviewUITests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
TEST_TARGET_NAME = WKWebview;
|
||||
USES_XCTRUNNER = YES;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
A2F28FCC1C43C59F00B89B34 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
INFOPLIST_FILE = WKWebviewUITests/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = comd.laya.WKWebviewUITests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
TEST_TARGET_NAME = WKWebview;
|
||||
USES_XCTRUNNER = YES;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
A2F28F921C43C59F00B89B34 /* Build configuration list for PBXProject "WKWebview" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
A2F28FC21C43C59F00B89B34 /* Debug */,
|
||||
A2F28FC31C43C59F00B89B34 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
A2F28FC41C43C59F00B89B34 /* Build configuration list for PBXNativeTarget "WKWebview" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
A2F28FC51C43C59F00B89B34 /* Debug */,
|
||||
A2F28FC61C43C59F00B89B34 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
A2F28FC71C43C59F00B89B34 /* Build configuration list for PBXNativeTarget "WKWebviewTests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
A2F28FC81C43C59F00B89B34 /* Debug */,
|
||||
A2F28FC91C43C59F00B89B34 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
A2F28FCA1C43C59F00B89B34 /* Build configuration list for PBXNativeTarget "WKWebviewUITests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
A2F28FCB1C43C59F00B89B34 /* Debug */,
|
||||
A2F28FCC1C43C59F00B89B34 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = A2F28F8F1C43C59F00B89B34 /* Project object */;
|
||||
}
|
||||
Generated
+7
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
@@ -0,0 +1,9 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface AppDelegate : UIResponder <UIApplicationDelegate>
|
||||
|
||||
@property (strong, nonatomic) UIWindow *window;
|
||||
|
||||
|
||||
@end
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
#import "AppDelegate.h"
|
||||
#import "ViewController.h"
|
||||
|
||||
@interface AppDelegate ()
|
||||
|
||||
@end
|
||||
|
||||
@implementation AppDelegate
|
||||
|
||||
|
||||
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
||||
{
|
||||
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
||||
ViewController* pViewController = [[ViewController alloc] init];
|
||||
self.window.rootViewController = pViewController;
|
||||
[self.window makeKeyAndVisible];
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)applicationWillResignActive:(UIApplication *)application {
|
||||
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
|
||||
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
|
||||
}
|
||||
|
||||
- (void)applicationDidEnterBackground:(UIApplication *)application {
|
||||
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
|
||||
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
|
||||
}
|
||||
|
||||
- (void)applicationWillEnterForeground:(UIApplication *)application {
|
||||
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
|
||||
}
|
||||
|
||||
- (void)applicationDidBecomeActive:(UIApplication *)application {
|
||||
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
|
||||
}
|
||||
|
||||
- (void)applicationWillTerminate:(UIApplication *)application {
|
||||
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
|
||||
}
|
||||
|
||||
@end
|
||||
+98
@@ -0,0 +1,98 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "20x20",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "20x20",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "29x29",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "29x29",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "40x40",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "40x40",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "60x60",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "60x60",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "20x20",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "20x20",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "29x29",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "29x29",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "40x40",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "40x40",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "76x76",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "76x76",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "83.5x83.5",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ios-marketing",
|
||||
"size" : "1024x1024",
|
||||
"scale" : "1x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8150" systemVersion="15A204g" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8122"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="EHf-IW-A2E">
|
||||
<objects>
|
||||
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
||||
<layoutGuides>
|
||||
<viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
|
||||
<viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<animations/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="53" y="375"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6211" systemVersion="14A298i" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6204"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="tne-QT-ifu">
|
||||
<objects>
|
||||
<viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="" sceneMemberID="viewController">
|
||||
<layoutGuides>
|
||||
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
|
||||
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
</scene>
|
||||
</scenes>
|
||||
</document>
|
||||
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSAllowsArbitraryLoads</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIRequiredDeviceCapabilities</key>
|
||||
<array>
|
||||
<string>armv7</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,7 @@
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
@interface Test: NSObject
|
||||
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,21 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "Test.h"
|
||||
#import <LayaWKWebview.h>
|
||||
@implementation Test
|
||||
|
||||
+(void)test:(NSString*)json
|
||||
{
|
||||
NSError* error = nil;
|
||||
NSData* jsonData = [json dataUsingEncoding:NSUTF8StringEncoding];
|
||||
NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
|
||||
NSLog(@"OC: %@", [dict objectForKey:@"value"]);
|
||||
{
|
||||
NSDictionary* dic = [NSDictionary dictionaryWithObject:@"Hello JS!" forKey:@"value"];
|
||||
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:dic options:0 error:&error];
|
||||
NSString* jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
|
||||
[[LayaWKWebview GetLayaWKWebview] callbackToJSWithClass:self.class methodName:@"test:" ret:jsonStr];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,8 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <WebKit/WKUIDelegate.h>
|
||||
#import <WebKit/WKScriptMessageHandler.h>
|
||||
#import <WebKit/WKNavigationDelegate.h>
|
||||
@interface ViewController : UIViewController<WKScriptMessageHandler,WKUIDelegate,WKNavigationDelegate>
|
||||
-(id)init;
|
||||
@end
|
||||
|
||||
@@ -0,0 +1,176 @@
|
||||
#import "ViewController.h"
|
||||
#import "conchConfig.h"
|
||||
#import "LayaWKWebview.h"
|
||||
|
||||
@implementation ViewController
|
||||
{
|
||||
LayaWKWebview* _layaWKWebview;
|
||||
NSString* _scriptsPath;
|
||||
BOOL _addScriptMessageHandler;
|
||||
}
|
||||
-(id)init
|
||||
{
|
||||
self = [super init];
|
||||
if( self != nil )
|
||||
{
|
||||
_addScriptMessageHandler = NO;
|
||||
return self;
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
- (void)viewDidLoad
|
||||
{
|
||||
[super viewDidLoad];
|
||||
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
|
||||
[conchConfig GetInstance];
|
||||
WKWebViewConfiguration* config = [[WKWebViewConfiguration alloc]init];
|
||||
config.preferences.javaScriptEnabled=true;
|
||||
config.preferences.javaScriptCanOpenWindowsAutomatically = true;
|
||||
config.userContentController = [[WKUserContentController alloc] init];
|
||||
|
||||
NSString* scriptsPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/scripts/init.js"];
|
||||
NSString* iniScript = [NSString stringWithContentsOfFile:scriptsPath encoding:NSUTF8StringEncoding error:nil];
|
||||
WKUserScript *script = [[WKUserScript alloc] initWithSource:iniScript injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
|
||||
[config.userContentController addUserScript:script];
|
||||
|
||||
WKWebView* webview = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
|
||||
webview.allowsBackForwardNavigationGestures = YES;
|
||||
webview.UIDelegate = self;
|
||||
webview.navigationDelegate = self;
|
||||
|
||||
webview.scrollView.bounces = false;
|
||||
webview.scrollView.bouncesZoom = false;
|
||||
|
||||
if (@available(iOS 11.0, *))
|
||||
{
|
||||
webview.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
|
||||
}
|
||||
|
||||
[self setNeedsStatusBarAppearanceUpdate];
|
||||
[self prefersStatusBarHidden];
|
||||
|
||||
_layaWKWebview = [[LayaWKWebview alloc] initWithWebview:webview url:[conchConfig GetInstance]->m_sUrl hostPort:[conchConfig GetInstance]->m_nHostPort];
|
||||
[self.view addSubview:_layaWKWebview.webview];
|
||||
}
|
||||
- (void)didReceiveMemoryWarning
|
||||
{
|
||||
[super didReceiveMemoryWarning];
|
||||
}
|
||||
//-------------------------------------------------------------------------------
|
||||
-(NSUInteger)supportedInterfaceOrientations
|
||||
{
|
||||
/*
|
||||
UIInterfaceOrientationMaskPortrait, ===2
|
||||
UIInterfaceOrientationMaskPortraitUpsideDown, ===4
|
||||
UIInterfaceOrientationMaskLandscapeLeft, ===8
|
||||
UIInterfaceOrientationMaskLandscapeRight, ===16
|
||||
*/
|
||||
return [conchConfig GetInstance]->m_nOrientationType;
|
||||
}
|
||||
//-------------------------------------------------------------------------------
|
||||
- (BOOL)prefersStatusBarHidden
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
- (BOOL)shouldAutorotate
|
||||
{
|
||||
return YES;//支持转屏
|
||||
}
|
||||
- (void)viewWillAppear:(BOOL)animated
|
||||
{
|
||||
[super viewWillAppear:animated];
|
||||
if (!_addScriptMessageHandler)
|
||||
{
|
||||
[_layaWKWebview.webview.configuration.userContentController addScriptMessageHandler:self name:@"reflection"];
|
||||
[_layaWKWebview.webview.configuration.userContentController addScriptMessageHandler:self name:@"log"];
|
||||
_addScriptMessageHandler = YES;
|
||||
}
|
||||
}
|
||||
- (void)viewWillDisppear:(BOOL)animated
|
||||
{
|
||||
[super viewWillDisappear:animated];
|
||||
if (_addScriptMessageHandler)
|
||||
{
|
||||
[_layaWKWebview.webview.configuration.userContentController removeScriptMessageHandlerForName:@"reflection"];
|
||||
[_layaWKWebview.webview.configuration.userContentController removeScriptMessageHandlerForName:@"log"];
|
||||
_addScriptMessageHandler = NO;
|
||||
}
|
||||
}
|
||||
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
|
||||
{
|
||||
if (![message.body isKindOfClass:NSString.class])
|
||||
{
|
||||
return;
|
||||
}
|
||||
NSString* data = message.body;
|
||||
if (data == nil)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//NSLog(@"JS-->OC %@",message.body);
|
||||
|
||||
if ([message.name isEqualToString:@"log"])
|
||||
{
|
||||
NSLog(@"JSLog:%@", data);
|
||||
}
|
||||
else if ([message.name isEqualToString:@"reflection"])
|
||||
{
|
||||
NSError* error = nil;
|
||||
NSData* jsonData = [message.body dataUsingEncoding:NSUTF8StringEncoding];
|
||||
NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
|
||||
NSNumber* ID = [dict objectForKey:@"id"];
|
||||
NSString* className = [dict objectForKey:@"className"];
|
||||
NSString* methodName = [dict objectForKey:@"methodName"];
|
||||
NSString* param = [dict objectForKey:@"param"];
|
||||
[_layaWKWebview callMethod:ID.intValue className:className methodName:methodName param:param];
|
||||
}
|
||||
}
|
||||
-(void) callbackToJS:(NSString*)name data:(NSString*)jsonParam
|
||||
{
|
||||
NSString* js = [NSString stringWithFormat:@"window.wkbridge.callback('%@','%@');",name, jsonParam];
|
||||
[_layaWKWebview.webview evaluateJavaScript:js completionHandler:^(id _Nullable response, NSError * _Nullable error) {
|
||||
if (response || error)
|
||||
{
|
||||
NSLog(@"value: %@ error: %@", response, error);
|
||||
}
|
||||
}];
|
||||
}
|
||||
/*- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
|
||||
{
|
||||
NSDictionary* pDictionary =
|
||||
[NSDictionary dictionaryWithObjectsAndKeys:
|
||||
[conchConfig GetInstance]->m_sPlatformClassName,@"market_name",
|
||||
[NSNumber numberWithInt:[conchConfig GetInstance]->m_nChargeType],@"charge_type",
|
||||
[NSNumber numberWithInt:[conchConfig GetInstance]->m_nPayType],@"pay_type",
|
||||
[NSNumber numberWithInt:[conchConfig GetInstance]->m_nEnterPlatformType],@"enter_platform_type",
|
||||
[NSNumber numberWithInt:[conchConfig GetInstance]->m_nLoginType],@"login_type",nil];
|
||||
NSError* pError = nil;
|
||||
NSString* pJsonString = nil;
|
||||
NSData* pJsonData = [NSJSONSerialization dataWithJSONObject:pDictionary options:0 error:&pError];
|
||||
if( !pError )
|
||||
{
|
||||
pJsonString = [[NSString alloc] initWithData:pJsonData encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
|
||||
NSString* js = [NSString stringWithFormat:@"if(!window.conchMarketData){window.conchMarketData=JSON.parse('%@')}",pJsonString];
|
||||
[_layaWKWebview.webview evaluateJavaScript:js completionHandler:^(id _Nullable response, NSError * _Nullable error) {
|
||||
if (response || error)
|
||||
{
|
||||
NSLog(@"value: %@ error: %@;", response, error);
|
||||
}
|
||||
}];
|
||||
|
||||
decisionHandler(WKNavigationActionPolicyAllow);
|
||||
}*/
|
||||
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
|
||||
// 确定按钮
|
||||
UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
|
||||
completionHandler();
|
||||
}];
|
||||
// alert弹出框
|
||||
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message message:nil preferredStyle:UIAlertControllerStyleAlert];
|
||||
[alertController addAction:alertAction];
|
||||
[self presentViewController:alertController animated:YES completion:nil];
|
||||
}
|
||||
@end
|
||||
@@ -0,0 +1,16 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <StoreKit/StoreKit.h>
|
||||
|
||||
@protocol JCIapProcessCtrlDelegate <NSObject>
|
||||
@required
|
||||
- (void)onSuccess:(NSString *)p_pProductionIdentifier quantity:(NSInteger)p_iNumber orderID:(NSString *)p_pszOrderID;
|
||||
- (void)onFailed:(NSString *)p_pProductionIdentifier quantity:(NSInteger)p_iNumber orderID:(NSString *)p_pszOrderID;
|
||||
@end
|
||||
|
||||
@interface IAPManager : NSObject<SKProductsRequestDelegate,SKPaymentTransactionObserver>
|
||||
+ (IAPManager*) getInstance;
|
||||
-(void)recharge:(NSString*) jsonParam;
|
||||
- (id)initWithGameID:(NSString*)gameID andDelegate:(id<JCIapProcessCtrlDelegate>)delegate;
|
||||
@end
|
||||
|
||||
|
||||
@@ -0,0 +1,339 @@
|
||||
#import "IAPManager.h"
|
||||
#define __MAX_GAME_ID_SIZE 32
|
||||
|
||||
typedef void (^IAPProductsResponseBlock)(SKProductsRequest* request , SKProductsResponse* response);
|
||||
typedef void (^IAPcheckReceiptCompleteResponseBlock)(NSString* response,NSError* error);
|
||||
|
||||
@interface IAPManager()<NSURLConnectionDataDelegate>
|
||||
@property (nonatomic,copy) IAPProductsResponseBlock requestProductsBlock;
|
||||
@property (nonatomic,copy) IAPcheckReceiptCompleteResponseBlock checkReceiptCompleteBlock;
|
||||
@property (nonatomic,assign) id<JCIapProcessCtrlDelegate> delegate;
|
||||
@property (nonatomic,strong) NSString* gameAppID;
|
||||
@property (nonatomic,strong) SKProductsRequest *request;
|
||||
@property (nonatomic,strong) NSString *strPlateform;
|
||||
@property (nonatomic,assign) BOOL isProcessing;
|
||||
@property (nonatomic,strong) NSMutableData* receiptRequestData;
|
||||
@end
|
||||
|
||||
|
||||
@implementation IAPManager
|
||||
|
||||
+ (IAPManager*) getInstance{
|
||||
static IAPManager* iap = nil;
|
||||
if (iap == nil){
|
||||
iap = [IAPManager alloc];
|
||||
}
|
||||
return iap;
|
||||
}
|
||||
|
||||
- (id)initWithGameID:(NSString*)gameID andDelegate:(id<JCIapProcessCtrlDelegate>)delegate{
|
||||
if ((self = [super init])) {
|
||||
NSAssert(gameID != nil,@"[IAP] gameID can not be nil");
|
||||
NSAssert(gameID.length <= __MAX_GAME_ID_SIZE,@"gameID is too long");
|
||||
self.gameAppID = [NSString stringWithString:gameID];
|
||||
NSAssert(delegate != nil, @"[IAP] delegate can not be nil");
|
||||
self.delegate = delegate;
|
||||
self.strPlateform = [NSString stringWithFormat:@"%@,%@,%@", [[UIDevice currentDevice] model], [[UIDevice currentDevice] systemName],[[UIDevice currentDevice] systemVersion]];
|
||||
NSLog(@"[IAP]plateform info: %@\n", self.strPlateform);
|
||||
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
|
||||
self.isProcessing = NO;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
|
||||
}
|
||||
|
||||
- (void)requestProducts:(NSSet *)productIdentifiers onCompletion:(IAPProductsResponseBlock)completion {
|
||||
self.request = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
|
||||
self.request.delegate = self;
|
||||
self.requestProductsBlock = completion;
|
||||
[self.request start];
|
||||
|
||||
}
|
||||
|
||||
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
|
||||
self.request = nil;
|
||||
if(self.requestProductsBlock) {
|
||||
self.requestProductsBlock (request,response);
|
||||
}
|
||||
}
|
||||
//-------------------------------------------------------------------------------
|
||||
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
|
||||
NSLog(@"[IAP] SKPaymentTransactionStatePurchased");
|
||||
[self doVerifyTransaction:transaction];
|
||||
}
|
||||
|
||||
- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
|
||||
NSLog(@"[IAP] SKPaymentTransactionStateRestored");
|
||||
[self doVerifyTransaction:transaction];
|
||||
}
|
||||
|
||||
- (void)failedTransaction:(SKPaymentTransaction *)transaction {
|
||||
NSLog(@"[IAP] Transaction error: %@ %ld", transaction.error.localizedDescription,(long)transaction.error.code);
|
||||
|
||||
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
|
||||
NSLog(@"[IAP] SKPaymentTransactionStateFailed");
|
||||
NSMutableDictionary *paymentmulti =(NSMutableDictionary *)[NSKeyedUnarchiver unarchiveObjectWithData:transaction.payment.requestData];
|
||||
NSString* _order_id = [paymentmulti objectForKey:@"order_id"];
|
||||
self.isProcessing = NO;
|
||||
[self.delegate onFailed:transaction.payment.productIdentifier quantity:transaction.payment.quantity orderID:_order_id];
|
||||
}
|
||||
|
||||
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
|
||||
{
|
||||
for (SKPaymentTransaction *transaction in transactions)
|
||||
{
|
||||
switch (transaction.transactionState)
|
||||
{
|
||||
case SKPaymentTransactionStatePurchased:
|
||||
[self completeTransaction:transaction];
|
||||
break;
|
||||
case SKPaymentTransactionStateFailed:
|
||||
[self failedTransaction:transaction];
|
||||
break;
|
||||
case SKPaymentTransactionStateRestored:
|
||||
[self restoreTransaction:transaction];
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
-(void)recharge:(NSString*) jsonParam
|
||||
{
|
||||
if (self.isProcessing == YES){
|
||||
self.isProcessing = NO;
|
||||
NSLog(@"[IAP] another payments is processing!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
self.isProcessing = YES;
|
||||
|
||||
|
||||
NSLog(@"[IAP] this is MarketAppStore method pay param=%@",jsonParam);
|
||||
if(jsonParam==NULL)
|
||||
{
|
||||
self.isProcessing = NO;
|
||||
NSLog(@"[IAP] recharge param is nil!\n");
|
||||
[self.delegate onFailed:@"nill" quantity:0 orderID:@"nill"];
|
||||
return;
|
||||
}
|
||||
NSData* pJsonData = [jsonParam dataUsingEncoding:NSUTF8StringEncoding];
|
||||
NSError* pError;
|
||||
NSDictionary* pJson = [NSJSONSerialization JSONObjectWithData:pJsonData options:kNilOptions error:&pError];
|
||||
if( !pError )
|
||||
{
|
||||
NSString* sProductID = [pJson objectForKey:@"product_id"];
|
||||
int nNum = [[pJson objectForKey:@"amount"] intValue];
|
||||
NSString* sOrderID = [pJson objectForKey:@"order_id"];
|
||||
NSString* sCallbackURL = [pJson objectForKey:@"callback_uri"];
|
||||
NSLog(@"[IAP] buyProps: product_id=%@, amount=%d, order_id=%@,callbackurl=%@",sProductID, nNum, sOrderID,sCallbackURL );
|
||||
|
||||
if( nNum <= 0 || nil == sProductID || nil == sOrderID || nil == sCallbackURL)
|
||||
{
|
||||
self.isProcessing = NO;
|
||||
NSLog(@"[IAP] param error!\n");
|
||||
[self.delegate onFailed:sProductID quantity:nNum orderID:sOrderID];
|
||||
return;
|
||||
}
|
||||
|
||||
if([SKPaymentQueue canMakePayments] == NO)
|
||||
{
|
||||
self.isProcessing = NO;
|
||||
NSLog(@"[IAP] can not make payments!\n");
|
||||
[self.delegate onFailed:sProductID quantity:nNum orderID:sOrderID];
|
||||
return;
|
||||
}
|
||||
|
||||
NSArray* transactions = [SKPaymentQueue defaultQueue].transactions;
|
||||
if (transactions.count > 0)
|
||||
{
|
||||
//检测是否有未完成的交易
|
||||
SKPaymentTransaction* transaction = [transactions firstObject];
|
||||
if (transaction.transactionState == SKPaymentTransactionStatePurchased)
|
||||
{
|
||||
NSLog(@"[IAP] process uncompleteed transaction");
|
||||
[self doVerifyTransaction:transaction];
|
||||
}
|
||||
}
|
||||
|
||||
NSLog(@"[IAP] 开始向苹果请求产品信息");
|
||||
[self requestProducts:[[NSSet alloc] initWithObjects:sProductID, nil] onCompletion:^(SKProductsRequest* request,SKProductsResponse* response)
|
||||
{
|
||||
NSLog(@"[IAP] 苹果返回产品信息。");
|
||||
if(response.products.count > 0 ) {
|
||||
|
||||
SKProduct* product =response.products[0];
|
||||
NSMutableString *resOutput = [[NSMutableString alloc] init];
|
||||
[resOutput appendString:@"[IAP] IAP Response Info\n"];
|
||||
[resOutput appendFormat:@"%@,%@,%@,%@,%@\n",
|
||||
product.localizedTitle, // 本地化标题
|
||||
product.localizedDescription, // 本地化描述
|
||||
product.price, // 价格
|
||||
product.priceLocale, // 地域
|
||||
product.productIdentifier]; // 产品标识符
|
||||
NSLog(@"%@",resOutput);
|
||||
|
||||
SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
|
||||
|
||||
|
||||
NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];
|
||||
[dict setObject:sOrderID forKey:@"order_id"];
|
||||
[dict setObject:sCallbackURL forKey:@"backurl"];
|
||||
[dict setObject:self.gameAppID forKey:@"gameid"];
|
||||
NSData* pData = [NSKeyedArchiver archivedDataWithRootObject:dict];
|
||||
|
||||
payment.requestData = pData;
|
||||
payment.quantity = nNum;
|
||||
|
||||
[[SKPaymentQueue defaultQueue] addPayment:payment];
|
||||
}
|
||||
else{
|
||||
self.isProcessing = NO;
|
||||
NSLog(@"[IAP] invalid product!\n");
|
||||
[self.delegate onFailed:sProductID quantity:nNum orderID:sOrderID];
|
||||
}
|
||||
// 错误的产品 ID 回馈
|
||||
NSMutableString *resOutput = [[NSMutableString alloc] init];
|
||||
for( NSString *invalidProductId in response.invalidProductIdentifiers )
|
||||
{
|
||||
[resOutput appendFormat:@"[IAP] Invalid product id: %@\n",invalidProductId];
|
||||
}
|
||||
NSLog(@"%@",resOutput);
|
||||
}];
|
||||
}
|
||||
else
|
||||
{
|
||||
self.isProcessing = NO;
|
||||
NSLog(@"[IAP] buyProps:parser json error");
|
||||
[self.delegate onFailed:@"nill" quantity:0 orderID:@"nill"];
|
||||
}
|
||||
}
|
||||
|
||||
// 向验证服务器发起验证请求
|
||||
- (void)doVerifyTransaction: (SKPaymentTransaction *)transaction
|
||||
{
|
||||
if (transaction == nil)
|
||||
return;
|
||||
|
||||
|
||||
if(NULL==transaction.payment.requestData)
|
||||
{
|
||||
self.isProcessing = NO;
|
||||
NSLog(@"[IAP] transDoVerifyTransaction requestData is null");
|
||||
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
|
||||
[self.delegate onFailed:@"nill" quantity:0 orderID:@"nill"];
|
||||
return;
|
||||
}
|
||||
NSMutableDictionary *paymentmulti =(NSMutableDictionary *)[NSKeyedUnarchiver unarchiveObjectWithData:transaction.payment.requestData];//
|
||||
NSString* _order_id = [paymentmulti objectForKey:@"order_id"];
|
||||
NSString* _backurl = [paymentmulti objectForKey:@"backurl"];
|
||||
NSString* _gameid = [paymentmulti objectForKey:@"gameid"];
|
||||
NSLog(@"[IAP] order:%@backurl:%@gameid:%@",_order_id,_backurl,_gameid);
|
||||
|
||||
NSString* pszBase64 = [transaction.transactionReceipt base64Encoding];
|
||||
if(NULL==_order_id||NULL==_backurl||NULL==_gameid||NULL==self.strPlateform||NULL==transaction.payment.productIdentifier||NULL==transaction.transactionIdentifier)
|
||||
{
|
||||
self.isProcessing = NO;
|
||||
NSLog(@"[IAP] doVerifyTransaction something is NULL");
|
||||
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
|
||||
[self.delegate onFailed:@"nill" quantity:0 orderID:@"nill"];
|
||||
return;
|
||||
}
|
||||
|
||||
NSMutableString *sendParam = [[NSMutableString alloc] init];
|
||||
[sendParam appendFormat:@"plateform=%@",self.strPlateform];
|
||||
[sendParam appendFormat:@"&order-id=%@",_order_id];
|
||||
[sendParam appendFormat:@"&game-id=%@",_gameid];
|
||||
[sendParam appendFormat:@"&production-id=%@",transaction.payment.productIdentifier];
|
||||
[sendParam appendFormat:@"&transaction-id=%@",transaction.transactionIdentifier];
|
||||
[sendParam appendFormat:@"&receipt-data=%@",pszBase64];
|
||||
NSData* data = [sendParam dataUsingEncoding:NSUTF8StringEncoding];
|
||||
NSLog(@"[IAP] pruchase backurl = %@",_backurl);
|
||||
NSLog(@"[IAP] pruchase param = %@",sendParam);
|
||||
|
||||
NSInteger amount = transaction.payment.quantity;
|
||||
[self checkReceipt:_backurl withData:data onCompletion:^(NSString* response,NSError* error){
|
||||
if (error == nil){
|
||||
|
||||
NSLog(@"[IAP] web result = %@",response);
|
||||
NSData* pJsonData = [response dataUsingEncoding:NSUTF8StringEncoding];
|
||||
NSError* pError;
|
||||
NSDictionary* pJson = [NSJSONSerialization JSONObjectWithData:pJsonData options:kNilOptions error:&pError];
|
||||
if( !pError ){
|
||||
NSString* resultCode = [pJson objectForKey:@"error-code"];
|
||||
int nCode = [resultCode intValue];
|
||||
if (nCode == 0){
|
||||
NSLog(@"[IAP] verify success!");
|
||||
self.isProcessing = NO;
|
||||
[self.delegate onSuccess:transaction.payment.productIdentifier quantity:amount orderID:_order_id];
|
||||
|
||||
}
|
||||
else{
|
||||
NSLog(@"[IAP] verify err code = %@ info = %@",resultCode,[pJson objectForKey:@"error-info"]);
|
||||
self.isProcessing = NO;
|
||||
[self.delegate onFailed:transaction.payment.productIdentifier quantity:amount orderID:_order_id];
|
||||
}
|
||||
|
||||
}
|
||||
else{
|
||||
self.isProcessing = NO;
|
||||
NSLog(@"[IAP] An error happened while serializing the JSON data.");
|
||||
[self.delegate onFailed:transaction.payment.productIdentifier quantity:amount orderID:_order_id];
|
||||
}
|
||||
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
|
||||
}
|
||||
else{
|
||||
self.isProcessing = NO;
|
||||
[self.delegate onFailed:transaction.payment.productIdentifier quantity:amount orderID:_order_id];
|
||||
}
|
||||
}];
|
||||
}
|
||||
- (void)checkReceipt:(NSString*)url withData:(NSData*)receiptData onCompletion:(IAPcheckReceiptCompleteResponseBlock)completion
|
||||
{
|
||||
self.checkReceiptCompleteBlock = completion;
|
||||
NSURL* requestURL = [NSURL URLWithString:url];
|
||||
NSMutableURLRequest* req = [[NSMutableURLRequest alloc] initWithURL:requestURL];
|
||||
[req setHTTPMethod:@"POST"];
|
||||
[req setHTTPBody:receiptData];
|
||||
|
||||
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
|
||||
if(conn) {
|
||||
self.receiptRequestData = [[NSMutableData alloc] init];
|
||||
} else {
|
||||
NSError* error = nil;
|
||||
NSMutableDictionary* errorDetail = [[NSMutableDictionary alloc] init];
|
||||
[errorDetail setValue:@"Can't create connection" forKey:NSLocalizedDescriptionKey];
|
||||
error = [NSError errorWithDomain:@"IAPManagerError" code:100 userInfo:errorDetail];
|
||||
if(self.checkReceiptCompleteBlock) {
|
||||
self.checkReceiptCompleteBlock(nil,error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
|
||||
NSLog(@"[IAP] Cannot transmit receipt data. %@",[error localizedDescription]);
|
||||
if(self.checkReceiptCompleteBlock) {
|
||||
self.checkReceiptCompleteBlock(nil,error);
|
||||
}
|
||||
}
|
||||
|
||||
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
|
||||
[self.receiptRequestData setLength:0];
|
||||
}
|
||||
|
||||
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
|
||||
[self.receiptRequestData appendData:data];
|
||||
}
|
||||
|
||||
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
|
||||
NSString *response = [[NSString alloc] initWithData:self.receiptRequestData encoding:NSUTF8StringEncoding];
|
||||
if(self.checkReceiptCompleteBlock) {
|
||||
self.checkReceiptCompleteBlock(response,nil);
|
||||
}
|
||||
}
|
||||
@end
|
||||
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// main.m
|
||||
// WKWebview
|
||||
//
|
||||
// Created by LayaBox on 1/11/16.
|
||||
// Copyright © 2016 LayaBox. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "AppDelegate.h"
|
||||
|
||||
int main(int argc, char * argv[]) {
|
||||
@autoreleasepool {
|
||||
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,39 @@
|
||||
//
|
||||
// WKWebviewTests.m
|
||||
// WKWebviewTests
|
||||
//
|
||||
// Created by LayaBox on 1/11/16.
|
||||
// Copyright © 2016 LayaBox. All rights reserved.
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
@interface WKWebviewTests : XCTestCase
|
||||
|
||||
@end
|
||||
|
||||
@implementation WKWebviewTests
|
||||
|
||||
- (void)setUp {
|
||||
[super setUp];
|
||||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
||||
}
|
||||
|
||||
- (void)tearDown {
|
||||
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testExample {
|
||||
// This is an example of a functional test case.
|
||||
// Use XCTAssert and related functions to verify your tests produce the correct results.
|
||||
}
|
||||
|
||||
- (void)testPerformanceExample {
|
||||
// This is an example of a performance test case.
|
||||
[self measureBlock:^{
|
||||
// Put the code you want to measure the time of here.
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,40 @@
|
||||
//
|
||||
// WKWebviewUITests.m
|
||||
// WKWebviewUITests
|
||||
//
|
||||
// Created by LayaBox on 1/11/16.
|
||||
// Copyright © 2016 LayaBox. All rights reserved.
|
||||
//
|
||||
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
@interface WKWebviewUITests : XCTestCase
|
||||
|
||||
@end
|
||||
|
||||
@implementation WKWebviewUITests
|
||||
|
||||
- (void)setUp {
|
||||
[super setUp];
|
||||
|
||||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
||||
|
||||
// In UI tests it is usually best to stop immediately when a failure occurs.
|
||||
self.continueAfterFailure = NO;
|
||||
// UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
|
||||
[[[XCUIApplication alloc] init] launch];
|
||||
|
||||
// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
|
||||
}
|
||||
|
||||
- (void)tearDown {
|
||||
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testExample {
|
||||
// Use recording to get started writing UI tests.
|
||||
// Use XCTAssert and related functions to verify your tests produce the correct results.
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1 @@
|
||||
LayaBox
|
||||
@@ -0,0 +1,13 @@
|
||||
gameID=lieren2
|
||||
platformClassName=MarketAppStore
|
||||
payType=0
|
||||
chargeType=0
|
||||
loginType=0
|
||||
enterPlatformType=0
|
||||
backgroundColor=#FFFFFF
|
||||
checkNetwork=1
|
||||
orientation=24
|
||||
notification=0
|
||||
assistantTouch=1
|
||||
hostport=0
|
||||
url=http://nativetest.layabox.com/layaplayer/index.html
|
||||
@@ -0,0 +1,126 @@
|
||||
if (!window.wkbridge)
|
||||
{
|
||||
window.onLayaWKWebview = true;
|
||||
var console = window.console;
|
||||
console.error = console.warn = console.log = function(message)
|
||||
{
|
||||
window.webkit.messageHandlers['log'].postMessage(message);
|
||||
}
|
||||
|
||||
window.wkbridge =
|
||||
{
|
||||
responseCallbacks:{},
|
||||
callNative:function(name, sData, callback)
|
||||
{
|
||||
if (callback)
|
||||
{
|
||||
this.responseCallbacks[name] = callback;
|
||||
}
|
||||
window.webkit.messageHandlers[name].postMessage(sData);
|
||||
}
|
||||
}
|
||||
window.wkbridge.callback = function(name, sData)
|
||||
{
|
||||
var cb = this.responseCallbacks[name];
|
||||
if (cb)
|
||||
{
|
||||
cb(sData);
|
||||
}
|
||||
}
|
||||
window["conchPlatCallBack"] = function (ret) {
|
||||
var objid, m, rs, c, rJSON;
|
||||
if (ret == null)
|
||||
return;
|
||||
|
||||
objid = ret.objId;
|
||||
m = ret.mName;
|
||||
c = ret.cName;
|
||||
rs = ret.v;
|
||||
var platC;
|
||||
if (objid != -1) {
|
||||
platC = PlatformObj.objMap[objid];
|
||||
}
|
||||
else {
|
||||
platC = PlatformClass.clsMap[c];
|
||||
}
|
||||
if (platC) {
|
||||
var callback = platC.callBackList[m];
|
||||
callback && callback(rs);
|
||||
}
|
||||
};
|
||||
class PlatformBase {
|
||||
call(methodName, p1, p2, p3, p4, p5, p6, p7, p8, p9) {
|
||||
var a = Array.prototype.slice.call(arguments);
|
||||
a.shift();
|
||||
try {
|
||||
var param =
|
||||
{
|
||||
id:this.objid,
|
||||
isStatic:true,
|
||||
className:this.className,
|
||||
methodName:methodName,
|
||||
param:JSON.stringify(a) || "{}"
|
||||
};
|
||||
window.wkbridge.callNative('reflection', JSON.stringify(param), null);
|
||||
}
|
||||
catch (e) {
|
||||
}
|
||||
}
|
||||
callWithBack(callback, methodName, p1, p2, p3, p4, p5, p6, p7, p8, p9) {
|
||||
this.callBackList[methodName] = callback;
|
||||
var a = Array.prototype.slice.call(arguments);
|
||||
a.splice(0, 2);
|
||||
try {
|
||||
var param =
|
||||
{
|
||||
id:this.objid,
|
||||
isStatic:false,
|
||||
className:this.className,
|
||||
methodName:methodName,
|
||||
param:JSON.stringify(a) || "{}"
|
||||
};
|
||||
window.wkbridge.callNative('reflection', JSON.stringify(param), null);
|
||||
}
|
||||
catch (e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
class PlatformClass extends PlatformBase {
|
||||
constructor(clsName) {
|
||||
super();
|
||||
this.objid = -1;
|
||||
this.className = clsName;
|
||||
this.callBackList = {};
|
||||
PlatformClass.clsMap[clsName] = this;
|
||||
}
|
||||
static createClass(clsName) {
|
||||
return PlatformClass.clsMap[clsName] || new PlatformClass(clsName);
|
||||
}
|
||||
newObject(p1, p2, p3, p4, p5, p6, p7, p8, p9) {
|
||||
var a = Array.prototype.slice.call(arguments);
|
||||
a.splice(0, 0, "<init>");
|
||||
var rs = new PlatformObj(this);
|
||||
rs.init.apply(rs, a);
|
||||
return rs;
|
||||
}
|
||||
}
|
||||
PlatformClass.clsMap = {};
|
||||
class PlatformObj extends PlatformBase {
|
||||
constructor(cls) {
|
||||
super();
|
||||
this.cls = cls;
|
||||
this.className = cls.className;
|
||||
this.callBackList = {};
|
||||
}
|
||||
init() {
|
||||
this.objid = PlatformObj.objNum++;
|
||||
this.call.apply(this, arguments) || -1;
|
||||
PlatformObj.objMap[this.objid] = this;
|
||||
}
|
||||
}
|
||||
PlatformObj.objMap = {};
|
||||
PlatformObj.objNum = 0;
|
||||
window["PlatformClass"] = PlatformClass;
|
||||
window["PlatformObj"] = PlatformObj;
|
||||
}
|
||||
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "absolute:/Users/LayaBox/LayaBox/conch6/Conch/build/common/proj.ios/../../LayaWKWebview/proj.ios/LayaWKWebview.xcodeproj">
|
||||
</FileRef>
|
||||
<FileRef
|
||||
location = "group:WKWebview.xcodeproj">
|
||||
</FileRef>
|
||||
<FileRef
|
||||
location = "group:../../common/proj.ios/common.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
Reference in New Issue
Block a user